

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 in Version 3 AWS SDK für PHP
<a name="s3-encryption-client"></a>

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 `S3EncryptionClientV3` und `S3EncryptionMultipartUploaderV3` über und `S3EncryptionClientV2` und die veralteten `S3EncryptionClient` Optionen `S3EncryptionMultipartUploaderV2` und. `S3EncryptionMultipartUploader` Es wird empfohlen, dass ältere Implementierungen, die immer noch die veralteten Versionen verwenden, versuchen, zu migrieren. `S3EncryptionClientV3`unterstützt weiterhin die Entschlüsselung von Daten, die mit der älteren Version verschlüsselt wurden. `S3EncryptionClient`

Das AWS SDK für PHP implementiert die [Envelope-Verschlüsselung](https://docs.aws.amazon.com/kms/latest/developerguide/workflow.html) und verwendet [OpenSSL](https://www.openssl.org/) für die Verschlüsselung und Entschlüsselung. Die Implementierung ist mit [anderen, die ihrer Funktionsunterstützung entsprechen SDKs ,](https://docs.aws.amazon.com/general/latest/gr/aws_sdk_cryptography.html) interoperabel. Sie ist ebenfalls kompatibel mit dem [auf Promises basierenden asynchronen Workflow des SDK](guide_promises.md).

## Migrationshandbuch
<a name="migration-guide"></a>

[Für diejenigen, die versuchen, von den veralteten Clients auf die neuen Clients zu migrieren, gibt es hier einen Migrationsleitfaden für die Migration von Version 1 auf Version 2 und einen Leitfaden zur Migration von Version 2 auf Version 3 [hier](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)

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

Um mit der clientseitigen Verschlüsselung zu beginnen, benötigen Sie Folgendes:
+ [Ein Verschlüsselungsschlüssel AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html) 
+ Einen [S3-Bucket](https://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html) 

Bevor Sie einen Beispielcode ausführen, konfigurieren Sie Ihre AWS Anmeldeinformationen. Siehe [Anmeldeinformationen für AWS SDK für PHP Version 3.](guide_credentials.md)

## Verschlüsselung
<a name="encryption"></a>

Für das Hochladen eines verschlüsselten Objekts werden zusätzlich zu den Standardparametern vier zusätzliche `PutObject` Parameter `S3EncryptionClientV3` 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.
+  `@CipherOptions`sind zusätzliche Konfigurationen für die Verschlüsselung, einschließlich der zu verwendenden Chiffre und der Schlüsselgröße.
+  `@MaterialsProvider`ist ein Anbieter, der sich um die Generierung eines Chiffrierschlüssels und eines Initialisierungsvektors sowie um die Verschlüsselung Ihres Chiffrierschlüssels kümmert.
+  `@CommitmentPolicy`ist eine Richtlinienoption, die festlegt, wie ein Objekt entweder mit oder ohne Schlüsselzusage gelesen wird und wie ein Objekt mit oder ohne Schlüsselzusage geschrieben wird.

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

**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
<a name="decryption"></a>

Beim Herunterladen und Entschlüsseln eines Objekts gibt es zusätzlich zu den Standardparametern fünf zusätzliche `GetObject` Parameter, von denen zwei erforderlich sind. Der Client erkennt die grundlegenden Verschlüsselungsoptionen für Sie.
+   
** `'@SecurityProfile'`: Wenn auf 'V3' gesetzt, werden nur Objekte angezeigt, die in V3-kompatibel verschlüsselt sind**  
Format kann entschlüsselt werden. Wenn dieser Parameter auf 'V3\$1AND\$1LEGACY' 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 'V3\$1AND\$1LEGACY'. SecurityProfile Verwenden Sie 'V3' 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.
+   
** `@CommitmentPolicy`Richtlinienoption, die festlegt, wie ein Objekt gelesen wird, entweder mit **  
Schlüsselzusage oder ohne Schlüsselzusage und wie ein Objekt mit oder ohne Schlüsselzusage geschrieben wird.

```
$result = $encryptionClient->getObject([
    '@KmsAllowDecryptWithAnyCmk' => true,
    '@SecurityProfile' => 'V2_AND_LEGACY',
    '@CommitmentPolicy' => 'REQUIRE_ENCRYPT_ALLOW_DECRYPT',
    '@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
<a name="cipher-configuration"></a>

** `'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](http://php.net/manual/en/migration71.new-features.php), um zusätzliche Parameter zu unterstützen, die für die [Verschlüsselung](http://php.net/manual/en/function.openssl-encrypt.php) und [Entschlüsselung](http://php.net/manual/en/function.openssl-decrypt.php) 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\$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 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 unterstützt, AWS SDKs weshalb andere SDKs möglicherweise nicht in der Lage sind, mit diesem Parameter verschlüsselte Dateien zu entschlüsseln.

## Strategien für Metadaten
<a name="metadata-strategies"></a>

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

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

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

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

## Mehrteilige Uploads
<a name="multipart-uploads"></a>

Mehrteilige Upload mit clientseitiger Verschlüsselung sind ebenfalls möglich. Der `Aws\S3\Crypto\S3EncryptionMultipartUploaderV3` 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\S3EncryptionClientV3`. Der `S3EncryptionMultipartUploaderV3` kann dieselbe `'@MetadataStrategy'`-Option wie der `S3EncryptionClientV3` verarbeiten, ebenso wie alle verfügbaren `'@CipherOptions'`-Konfigurationen.

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

**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.