Crittografia lato client Amazon S3 conAWS SDK for PHPVersione 3 - AWS SDK for PHP

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 Amazon S3 conAWS SDK for PHPVersione 3

Con la crittografia lato client, i dati vengono crittografati e decrittografati direttamente nel tuo ambiente. Ciò significa che questi dati sono crittografati prima che vengono trasferiti ad Amazon S3 e non devi fare affidamento a un servizio esterno che gestisca la crittografia per te. Per le nuove implementazioni, suggeriamo l'uso diS3EncryptionClientV2eS3EncryptionMultipartUploaderV2sul deprecatoS3EncryptionClienteS3EncryptionMultipartUploader. Si consiglia di eseguire la migrazione delle implementazioni precedenti che ancora utilizzano le versioni obsolete.S3EncryptionClientV2mantiene il supporto per la decrittografia dei dati crittografati utilizzando la versione precedenteS3EncryptionClient.

L'AWS SDK for PHP implementa la crittografia a busta e usa OpenSSL per crittografare e decrittografare. L'implementazione è in grado di interagire con altri SDK che hanno lo stesso supporto di caratteristiche. Inoltre, è compatibile con il flusso di lavoro asincrono basato su promessa dell'SDK.

Guida alla migrazione

Per coloro che cercano di eseguire la migrazione dai client deprecati ai nuovi client, è disponibile una guida alla migrazione che può essere trovataqui.

Installazione

Per iniziare a utilizzare la crittografia lato client, è necessario:

Prima di eseguire un codice di esempio, configura il tuoAWSCredenziali . Consulta .Credenziali perAWS SDK for PHPVersione 3.

Crittografia

Caricamento di un oggetto crittografato inS3EncryptionClientV2prende tre parametri aggiuntivi in cima allo standardPutObjectparametri:

  • '@KmsEncryptionContext'è una coppia chiave-valore che può essere utilizzata per aggiungere un ulteriore livello di sicurezza all'oggetto crittografato. Il client di crittografia deve passare la stessa chiave, che verrà eseguita automaticamente durante una chiamata di ricezione. Se non si desidera alcun contesto aggiuntivo, passare un array vuoto.

  • @CipherOptionssono configurazioni aggiuntive per la crittografia, inclusa la cifratura 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, oltre a crittografare la chiave di cifratura.

use Aws\S3\S3Client; use Aws\S3\Crypto\S3EncryptionClientV2; use Aws\Kms\KmsClient; use Aws\Crypto\KmsMaterialsProviderV2; // Let's construct our S3EncryptionClient using an S3Client $encryptionClient = new S3EncryptionClientV2( new S3Client([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]) ); $kmsKeyId = 'kms-key-id'; $materialsProvider = new KmsMaterialsProviderV2( 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, '@KmsEncryptionContext' => ['context-key' => 'context-value'], 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]);
Nota

Oltre ad Amazon S3 eAWS KMSerrori di servizio basati, potresti ricevere generatiInvalidArgumentExceptionoggetti se il tuo'@CipherOptions'non sono configurati correttamente.

Decrittografia

Il download e la decrittografia di un oggetto ha quattro parametri aggiuntivi, di cui due necessari, oltre allo standardGetObjectparametri. Il client rileverà le opzioni di cifratura di base per te.

  • '@SecurityProfile': se impostato su 'V2', solo gli oggetti crittografati in versione compatibile con V2

    il formato può essere decrittografato. L'impostazione di questo parametro su 'V2_AND_LEGACY' consente inoltre di decrittografare oggetti crittografati in formato compatibile con V1. Per supportare la migrazione, impostare @SecurityProfile su 'V2_AND_LEGACY'. Usa 'V2' 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': (facoltativo) L'impostazione di questo parametro su true consente la decrittografia

    senza fornire un ID chiave KMS al costruttore del MaterialsProvider. Il valore predefinito è false.

  • '@CipherOptions'(facoltativo) sono configurazioni aggiuntive per la crittografia, tra cui

    cifrario da usare e dimensione chiave.

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

Oltre ad Amazon S3 eAWS KMSerrori di servizio basati, potresti ricevere generatiInvalidArgumentExceptionoggetti se il tuo'@CipherOptions'non sono configurati correttamente.

Configurazione cifratura

'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 per includere i parametri aggiuntivi necessari per crittografare e decrittografare 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 crittografiaS3EncryptionClientV2eS3EncryptionMultipartUploaderV2. Tuttavia, le prestazioni per ingressi di grandi dimensioni saranno molto più lente usando il polyfill rispetto all'implementazione nativa per PHP 7.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 e 128 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 tuttiAWSGli SDK e come tali altri SDK potrebbero non essere in grado di decrittografare i file crittografati utilizzando questo parametro.

Strategie di metadati

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, '@KmsEncryptionContext' => [], '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]); $result = $encryptionClient->getObject([ '@KmsAllowDecryptWithAnyCmk' => false, '@MaterialsProvider' => $materialsProvider, '@SecurityProfile' => 'V2', '@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, '@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

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

$kmsKeyId = 'kms-key-id'; $materialsProvider = new KmsMaterialsProviderV2( 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 S3EncryptionMultipartUploaderV2( new S3Client([ 'region' => 'us-east-1', 'version' => 'latest', 'profile' => 'default', ]), fopen('large-file-to-encrypt.txt', 'r'), [ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, 'bucket' => $bucket, 'key' => $key, ] ); $multipartUploader->upload();
Nota

Oltre ad Amazon S3 eAWS KMSerrori di servizio basati, potresti ricevere generatiInvalidArgumentExceptionoggetti se il tuo'@CipherOptions'non sono configurati correttamente.