

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Crittografia lato client di Amazon S3 nella versione 3 AWS SDK per PHP
<a name="s3-encryption-client"></a>

Con la crittografia lato client, i dati vengono crittografati e decrittografati direttamente nel tuo ambiente. Ciò significa che questi dati vengono crittografati prima di essere trasferiti su Amazon S3 e non ti affidi a un servizio esterno per gestire la crittografia per te. Per le nuove implementazioni, suggeriamo l'uso di `S3EncryptionClientV3` e `S3EncryptionMultipartUploaderV3` oltre `S3EncryptionClientV2` e la versione `S3EncryptionMultipartUploaderV2` obsoleta e. `S3EncryptionClient` `S3EncryptionMultipartUploader` È consigliabile che le implementazioni precedenti che utilizzano ancora le versioni obsolete tentino di migrare. `S3EncryptionClientV3`mantiene il supporto per la decrittografia dei dati crittografati utilizzando la versione precedente. `S3EncryptionClient`

 AWS SDK per PHP Implementa la [crittografia delle buste e utilizza](https://docs.aws.amazon.com/kms/latest/developerguide/workflow.html) [OpenSSL](https://www.openssl.org/) per la crittografia e la decrittografia. [L'implementazione è interoperabile con altre che supportano le sue funzionalità. SDKs ](https://docs.aws.amazon.com/general/latest/gr/aws_sdk_cryptography.html) Inoltre, è compatibile con [il flusso di lavoro asincrono basato su promessa dell'SDK](guide_promises.md).

## Guida alla migrazione
<a name="migration-guide"></a>

[Per coloro che stanno cercando di migrare dai client obsoleti ai nuovi client, c'è una guida alla migrazione per migrare dalla v1 alla v2 [qui e una guida alla migrazione dalla v2 alla v3 qui](https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/s3-encryption-migration-v1-v2-section.html).](https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/s3-encryption-migration-v2-v3-section.html)

## Configurazione
<a name="setup"></a>

Per iniziare a utilizzare la crittografia lato client, è necessario:
+ [Una chiave di crittografia AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html) 
+ Un [bucket S3](https://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html) 

Prima di eseguire qualsiasi codice di esempio, configura le tue AWS credenziali. Vedi [Credenziali per la AWS SDK per PHP versione 3](guide_credentials.md).

## Encryption (Crittografia)
<a name="encryption"></a>

Il caricamento di un oggetto crittografato `S3EncryptionClientV3` richiede quattro parametri aggiuntivi oltre ai parametri standard`PutObject`:
+  `'@KmsEncryptionContext'`è una coppia chiave-valore che può essere utilizzata per aggiungere un ulteriore livello di sicurezza all'oggetto crittografato. Il client di crittografia deve inserire la stessa chiave, operazione che eseguirà automaticamente durante una chiamata get. Se non si desidera alcun contesto aggiuntivo, passate un array vuoto.
+  `@CipherOptions`sono configurazioni aggiuntive per la crittografia, tra cui il codice da utilizzare e la dimensione della chiave.
+  `@MaterialsProvider`è un provider che gestisce la generazione di una chiave di cifratura e di un vettore di inizializzazione, nonché la crittografia della chiave di cifratura.
+  `@CommitmentPolicy`è un'opzione politica che stabilisce come un oggetto viene letto con o senza impegno chiave e come un oggetto viene scritto con o senza impegno chiave.

```
use Aws\S3\S3Client;
use Aws\S3\Crypto\S3EncryptionClientV3;
use Aws\Kms\KmsClient;
use Aws\Crypto\KmsMaterialsProviderV3;

 // Let's construct our S3EncryptionClient using an S3Client
 $encryptionClient = new S3EncryptionClientV3(
     new S3Client([
         'profile' => 'default',
         'region' => 'us-east-1',
         'version' => 'latest',
     ])
 );

 $kmsKeyId = 'kms-key-id';
 $materialsProvider = new KmsMaterialsProviderV3(
     new KmsClient([
         'profile' => 'default',
         'region' => 'us-east-1',
         'version' => 'latest',
     ]),
     $kmsKeyId
 );

 $bucket = 'the-bucket-name';
 $key = 'the-file-name';
 $cipherOptions = [
     'Cipher' => 'gcm',
     'KeySize' => 256,
     // Additional configuration options
 ];

 $result = $encryptionClient->putObject([
     '@MaterialsProvider' => $materialsProvider,
     '@CipherOptions' => $cipherOptions,
     '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT',
     '@KmsEncryptionContext' => ['context-key' => 'context-value'],
     'Bucket' => $bucket,
     'Key' => $key,
     'Body' => fopen('file-to-encrypt.txt', 'r'),
 ]);
```

**Nota**  
Oltre agli errori di Amazon S3 e dei servizi AWS KMS basati su Amazon, potresti ricevere `InvalidArgumentException` oggetti generati se non `'@CipherOptions'` sei configurato correttamente.

## Decrittografia
<a name="decryption"></a>

Il download e la decrittografia di un oggetto hanno cinque parametri aggiuntivi, due dei quali obbligatori, oltre ai parametri standard. `GetObject` Il client rileverà automaticamente le opzioni di crittografia di base.
+   
** `'@SecurityProfile'`: Se impostato su 'V3', solo gli oggetti crittografati in versione compatibile con V3**  
il formato può essere decifrato. L'impostazione di questo parametro su 'V3\$1AND\$1LEGACY' consente inoltre di decrittografare gli oggetti crittografati in un formato compatibile con V1. Per supportare la migrazione, imposta @ su 'V3\$1AND\$1LEGACY'. SecurityProfile Usa 'V3' solo per lo sviluppo di nuove applicazioni.
+   
** `'@MaterialsProvider'`è un provider che gestisce la generazione di una chiave di cifratura e di un vettore di inizializzazione, come**  
oltre a crittografare la chiave di cifratura.
+   
** `'@KmsAllowDecryptWithAnyCmk'`: (opzionale) L'impostazione di questo parametro su true abilita la decrittografia**  
senza fornire un id di chiave KMS al costruttore di. MaterialsProvider Il valore predefinito è false.
+   
** `'@CipherOptions'`(opzionale) sono configurazioni aggiuntive per la crittografia, tra cui**  
cifrario da usare e dimensione della chiave.
+   
** `@CommitmentPolicy`opzione politica che determina il modo in cui un oggetto viene letto con **  
impegno chiave o senza impegno chiave e come un oggetto viene scritto con impegno chiave o senza impegno chiave.

```
$result = $encryptionClient->getObject([
    '@KmsAllowDecryptWithAnyCmk' => true,
    '@SecurityProfile' => 'V2_AND_LEGACY',
    '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_ALLOW_DECRYPT',
    '@MaterialsProvider' => $materialsProvider,
    '@CipherOptions' => $cipherOptions,
    'Bucket' => $bucket,
    'Key' => $key,
]);
```

**Nota**  
Oltre agli errori di Amazon S3 e dei servizi AWS KMS basati su Amazon, potresti ricevere `InvalidArgumentException` oggetti generati se non `'@CipherOptions'` sei configurato correttamente.

## Configurazione di Cipher
<a name="cipher-configuration"></a>

** `'Cipher'` (Stringa)**  
Modalità di cifratura che il client di crittografia utilizza durante la crittografia. Al momento è supportato solo 'gcm'.

**Importante**  
PHP è [aggiornato nella versione 7.1](http://php.net/manual/en/migration71.new-features.php) per includere i parametri aggiuntivi necessari per [crittografare](http://php.net/manual/en/function.openssl-encrypt.php) e [decrittografare](http://php.net/manual/en/function.openssl-decrypt.php) l'utilizzo di OpenSSL per la crittografia GCM. Per le versioni PHP 7.0 e precedenti, un polyfill per il supporto GCM viene fornito e utilizzato dai client di crittografia e. `S3EncryptionClientV2` `S3EncryptionMultipartUploaderV2` Tuttavia, le prestazioni per input di grandi dimensioni saranno molto più lente utilizzando il polyfill rispetto all'implementazione nativa per PHP 7.1\$1, quindi potrebbe essere necessario aggiornare gli ambienti con versioni PHP precedenti per utilizzarli in modo efficace.

** `'KeySize'` (int)**  
La durata della chiave di crittografia del contenuto da generare per la crittografia. Il valore di default è 256 bit. Le opzioni di configurazione valide sono 256 bit.

** `'Aad'` (Stringa)**  
"Dati di autenticazione aggiuntivi" facoltativi da includere con il tuo payload crittografato. Queste informazioni sono convalidate per la decrittografia. `Aad` è disponibile solo quando si usa la cifratura "gcm".

**Importante**  
I dati di autenticazione aggiuntivi non sono supportati da tutti AWS SDKs e pertanto altri SDKs potrebbero non essere in grado di decrittografare i file crittografati utilizzando questo parametro.

## Strategie relative ai metadati
<a name="metadata-strategies"></a>

Puoi anche fornire un'istanza di una classe che implementa `Aws\Crypto\MetadataStrategyInterface`. Questa semplice interfaccia gestisce il salvataggio e il caricamento di `Aws\Crypto\MetadataEnvelope` che contiene i materiali per la crittografia della busta. L'SDK fornisce due classi che implementano questo: `Aws\S3\Crypto\HeadersMetadataStrategy` e `Aws\S3\Crypto\InstructionFileMetadataStrategy`. `HeadersMetadataStrategy` viene utilizzato per impostazione predefinita.

```
$strategy = new InstructionFileMetadataStrategy(
    $s3Client
);

$encryptionClient->putObject([
    '@MaterialsProvider' => $materialsProvider,
    '@MetadataStrategy' => $strategy,
    '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT',
    '@KmsEncryptionContext' => [],
    '@CipherOptions' => $cipherOptions,
    'Bucket' => $bucket,
    'Key' => $key,
    'Body' => fopen('file-to-encrypt.txt', 'r'),
]);

$result = $encryptionClient->getObject([
    '@KmsAllowDecryptWithAnyCmk' => false,
    '@MaterialsProvider' => $materialsProvider,
    '@SecurityProfile' => 'V3',
    '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT',
    '@MetadataStrategy' => $strategy,
    '@CipherOptions' => $cipherOptions,
    'Bucket' => $bucket,
    'Key' => $key,
]);
```

Le costanti per il nome della classe `HeadersMetadataStrategy` e `InstructionFileMetadataStrategy` possono anche essere fornite chiamando *::class*.

```
$result = $encryptionClient->putObject([
    '@MaterialsProvider' => $materialsProvider,
    '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT',
    '@MetadataStrategy' => HeadersMetadataStrategy::class,
    '@CipherOptions' => $cipherOptions,
    'Bucket' => $bucket,
    'Key' => $key,
    'Body' => fopen('file-to-encrypt.txt', 'r'),
]);
```

**Nota**  
Se si verifica un errore dopo che un file di istruzioni è stato caricato, non verrà automaticamente eliminato.

## Caricamenti in più parti
<a name="multipart-uploads"></a>

Anche l'esecuzione di un caricamento in più parti con crittografia lato client è possibile. `Aws\S3\Crypto\S3EncryptionMultipartUploaderV3`Prepara il flusso sorgente per la crittografia prima del caricamento. La creazione di uno è simile a utilizzare `Aws\S3\MultipartUploader` e `Aws\S3\Crypto\S3EncryptionClientV3`. `S3EncryptionMultipartUploaderV3` può gestire la stessa opzione `'@MetadataStrategy'` come `S3EncryptionClientV3`, oltre a tutte le configurazioni `'@CipherOptions'` disponibili.

```
$kmsKeyId = 'kms-key-id';
$materialsProvider = new KmsMaterialsProviderV3(
    new KmsClient([
        'region' => 'us-east-1',
        'version' => 'latest',
        'profile' => 'default',
    ]),
    $kmsKeyId
);

$bucket = 'the-bucket-name';
$key = 'the-upload-key';
$cipherOptions = [
    'Cipher' => 'gcm'
    'KeySize' => 256,
    // Additional configuration options
];

$multipartUploader = new S3EncryptionMultipartUploaderV3(
    new S3Client([
        'region' => 'us-east-1',
        'version' => 'latest',
        'profile' => 'default',
    ]),
    fopen('large-file-to-encrypt.txt', 'r'),
    [
        '@MaterialsProvider' => $materialsProvider,
        '@CipherOptions' => $cipherOptions,
        '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_REQUIRE_DECRYPT',
        'bucket' => $bucket,
        'key' => $key,
    ]
);
$multipartUploader->upload();
```

**Nota**  
Oltre agli errori di Amazon S3 e dei servizi AWS KMS basati su Amazon, potresti ricevere `InvalidArgumentException` oggetti generati se non `'@CipherOptions'` sei configurato correttamente.