Clientseitige Amazon S3 S3-Verschlüsselung mit Version 3 AWS SDK for PHP - AWS SDK for PHP

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Clientseitige Amazon S3 S3-Verschlüsselung mit Version 3 AWS SDK for PHP

Mit client-seitiger Verschlüsselung werden Daten direkt in Ihrer Umgebung verschlüsselt und entschlüsselt. Das bedeutet, dass diese Daten vor der Übertragung an Amazon S3 verschlüsselt werden und Sie sich nicht auf einen externen Dienst verlassen müssen, der die Verschlüsselung für Sie übernimmt. Für neue Implementierungen empfehlen wir die Verwendung von S3EncryptionClientV2 und S3EncryptionMultipartUploaderV2 anstelle des veralteten S3EncryptionClient und. S3EncryptionMultipartUploader Es wird empfohlen, dass ältere Implementierungen, die immer noch die veralteten Versionen verwenden, versuchen, zu migrieren. S3EncryptionClientV2unterstützt weiterhin die Entschlüsselung von Daten, die mit der älteren Version verschlüsselt wurden. S3EncryptionClient

Das AWS SDK for PHP implementiert eine Envelope-Verschlüsselung und verwendet OpenSSL für die Ver- und Entschlüsselung. Die Implementierung ist kompatibel mit anderen SDKs, die die Funktion unterstützen. Sie ist ebenfalls kompatibel mit dem auf Promises basierenden asynchronen Workflow des SDK.

Migrationshandbuch

Für diejenigen, die versuchen, von den veralteten Clients auf die neuen Clients zu migrieren, gibt es einen Migrationsleitfaden, den Sie hier finden.

Setup

Um mit der clientseitigen Verschlüsselung zu beginnen, benötigen Sie Folgendes:

Bevor Sie einen Beispielcode ausführen, konfigurieren Sie Ihre AWS Anmeldeinformationen. Weitere Informationen finden Sie unter Anmeldeinformationen für AWS SDK for PHP Version 3.

Verschlüsselung

Für das Hochladen eines verschlüsselten Objekts werden zusätzlich zu den Standardparametern drei zusätzliche PutObject Parameter S3EncryptionClientV2 benötigt:

  • '@KmsEncryptionContext'ist ein Schlüssel-Wert-Paar, das verwendet werden kann, um Ihrem verschlüsselten Objekt eine zusätzliche Sicherheitsebene hinzuzufügen. Der Verschlüsselungsclient muss denselben Schlüssel übergeben, was er bei einem GET-Aufruf automatisch tut. Wenn kein zusätzlicher Kontext gewünscht wird, übergeben Sie ein leeres Array.

  • @CipherOptionssind zusätzliche Konfigurationen für die Verschlüsselung, einschließlich der zu verwendenden Chiffre und der Schlüsselgröße.

  • @MaterialsProviderist ein Anbieter, der sich um die Generierung eines Chiffrierschlüssels und eines Initialisierungsvektors sowie um die Verschlüsselung Ihres Chiffrierschlüssels kümmert.

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'), ]);
Anmerkung

Zusätzlich zu den Amazon S3- und AWS KMS basierten Servicefehlern erhalten Sie möglicherweise geworfene InvalidArgumentException Objekte, wenn Sie nicht richtig konfiguriert '@CipherOptions' sind.

Entschlüsselung

Beim Herunterladen und Entschlüsseln eines Objekts gibt es zusätzlich zu den Standardparametern vier zusätzliche GetObject Parameter, von denen zwei erforderlich sind. Der Client erkennt die grundlegenden Verschlüsselungsoptionen für Sie.

  • '@SecurityProfile': Wenn auf 'V2' gesetzt, werden nur Objekte angezeigt, die V2-kompatibel verschlüsselt sind

    Format kann entschlüsselt werden. Wenn dieser Parameter auf 'V2_AND_LEGACY' gesetzt wird, können auch Objekte entschlüsselt werden, die im V1-kompatiblen Format verschlüsselt wurden. Um die Migration zu unterstützen, setzen Sie @ auf 'V2_AND_LEGACY'. SecurityProfile Verwenden Sie 'V2' nur für die Entwicklung neuer Anwendungen.

  • '@MaterialsProvider'ist ein Anbieter, der sich um die Generierung eines Chiffrierschlüssels und eines Initialisierungsvektors kümmert, als

    sowie die Verschlüsselung Ihres Chiffrierschlüssels.

  • '@KmsAllowDecryptWithAnyCmk': (optional) Wenn Sie diesen Parameter auf true setzen, wird die Entschlüsselung aktiviert

    ohne dem Konstruktor von eine KMS-Schlüssel-ID zur Verfügung zu stellen. MaterialsProvider Der Standardwert ist "false".

  • '@CipherOptions'(optional) sind zusätzliche Konfigurationen für die Verschlüsselung, darunter

    zu verwendende Chiffre und Schlüsselgröße.

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

Zusätzlich zu den Amazon S3- und AWS KMS basierten Servicefehlern erhalten Sie möglicherweise geworfene InvalidArgumentException Objekte, wenn Sie nicht richtig konfiguriert '@CipherOptions' sind.

Konfiguration der Chiffre

'Cipher' (string)

Verschlüsselungsmethode, die der Verschlüsselungsclient bei der Verschlüsselung verwendet. Derzeit wird nur 'gcm' unterstützt.

Wichtig

PHP wurde in Version 7.1 aktualisiert, um zusätzliche Parameter zu unterstützen, die für die Verschlüsselung und Entschlüsselung unter Verwendung von OpenSSL für die GCM-Verschlüsselung erforderlich sind. Für PHP-Versionen 7.0 und früher wird ein Polyfill für GCM-Unterstützung bereitgestellt und von den Verschlüsselungsclients und verwendet. S3EncryptionClientV2 S3EncryptionMultipartUploaderV2 Allerdings wird die Leistung bei großen Eingaben mit Polyfill viel langsamer sein als mit der nativen Implementierung für PHP 7.1+. Daher kann es notwendig sein, ältere PHP-Versionsumgebungen zu aktualisieren, um sie effektiv nutzen zu können.

'KeySize' (int)

Die Länge des für die Verschlüsselung zu generierenden Inhaltsverschlüsselungsschlüssels. Der Standardwert ist 256 Bit. Gültige Konfigurationsoptionen sind 256 und 128 Bit.

'Aad' (string)

Optionale „Zusätzliche Authentifizierungsdaten“ für Ihre verschlüsselte Nutzlast. Diese Informationen werden bei der Entschlüsselung validiert. Aad ist nur verfügbar, wenn Sie die „gcm“-Verschlüsselung anwenden.

Wichtig

Zusätzliche Authentifizierungsdaten werden nicht von allen AWS SDKs unterstützt, weshalb andere SDKs möglicherweise nicht in der Lage sind, mit diesem Parameter verschlüsselte Dateien zu entschlüsseln.

Strategien für Metadaten

Sie haben auch die Möglichkeit, eine Instance einer Klasse bereitzustellen, die das Aws\Crypto\MetadataStrategyInterface implementiert. Diese einfache Schnittstelle übernimmt das Speichern und Laden des Aws\Crypto\MetadataEnvelope, der Ihre Daten für die Envelope-Verschlüsselung enthält. Das SDK bietet zwei Klassen, die Folgendes implementieren: Aws\S3\Crypto\HeadersMetadataStrategy und Aws\S3\Crypto\InstructionFileMetadataStrategy. Standardmäßig wird HeadersMetadataStrategy verwendet.

$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, ]);

Klassennamenkonstanten für HeadersMetadataStrategy und InstructionFileMetadataStrategy können durch Aufruf von :: class bereitgestellt werden.

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

Wenn nach dem Hochladen einer Anweisungsdatei ein Fehler auftritt, wird diese nicht automatisch gelöscht.

Mehrteilige Uploads

Mehrteilige Upload mit clientseitiger Verschlüsselung sind ebenfalls möglich. Der Aws\S3\Crypto\S3EncryptionMultipartUploaderV2 bereitet den Quellstream vor dem Hochladen für die Verschlüsselung vor. Das Erstellen funktioniert ähnlich wie mit dem Aws\S3\MultipartUploader und dem Aws\S3\Crypto\S3EncryptionClientV2. Der S3EncryptionMultipartUploaderV2 kann dieselbe '@MetadataStrategy'-Option wie der S3EncryptionClientV2 verarbeiten, ebenso wie alle verfügbaren '@CipherOptions'-Konfigurationen.

$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();
Anmerkung

Zusätzlich zu den Amazon S3- und AWS KMS basierten Servicefehlern erhalten Sie möglicherweise geworfene InvalidArgumentException Objekte, wenn Sie nicht richtig konfiguriert '@CipherOptions' sind.