

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AWS SDK for PHP バージョン 3 での Amazon S3 クライアント側の暗号化
<a name="s3-encryption-client"></a>

クライアント側の暗号化を使用すると、ユーザーの環境内でデータは直接暗号化と復号が実行されます。つまり、Amazon S3 に転送する前にこのデータは暗号化されるので、暗号処理を外部サービスに依存しないで済みます。新しい実装では、 `S3EncryptionClientV3`と `S3EncryptionClientV2`、および廃止された `S3EncryptionMultipartUploaderV2`と `S3EncryptionMultipartUploaderV3`に対して `S3EncryptionClient`と を使用することをお勧めします`S3EncryptionMultipartUploader`。非推奨バージョンを使用している古い実装では、移行を試みることをお勧めします。`S3EncryptionClientV3` は、レガシーの `S3EncryptionClient` で暗号化されたデータの復号化をサポートしています。

はエン[ベロープ暗号化](https://docs.aws.amazon.com/kms/latest/developerguide/workflow.html) AWS SDK for PHP を実装し、暗号化と復号に [OpenSSL](https://www.openssl.org/) を使用します。この実装は[このサポート機能に適合する他の SDK](https://docs.aws.amazon.com/general/latest/gr/aws_sdk_cryptography.html) と相互運用可能です。また、[SDK の promise ベースの非同期ワークフロー](guide_promises.md)と互換性があります。

## 移行ガイド
<a name="migration-guide"></a>

非推奨のクライアントから新しいクライアントに に移行しようとしているユーザーには、[ここで](https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/s3-encryption-migration-v1-v2-section.html) v1 から v2 に移行するための移行ガイドと、ここで v2 から v3 に移行するための移行ガイド[があります](https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/s3-encryption-migration-v2-v3-section.html)。

## セットアップ
<a name="setup"></a>

クライアント側の暗号化の使用を開始するには、次が必要です。
+ [AWS KMS 暗号化キー](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html) 
+ [S3 バケット](https://docs.aws.amazon.com/AmazonS3/latest/gsg/CreatingABucket.html) 

サンプルコードを実行する前に、 AWS 認証情報を設定します。[AWS SDK for PHP 「バージョン 3 の認証情報](guide_credentials.md)」を参照してください。

## 暗号化
<a name="encryption"></a>

で暗号化されたオブジェクトをアップロードするには、標準パラメータに加えて 4 つの追加`PutObject`パラメータ`S3EncryptionClientV3`が必要です。
+  `'@KmsEncryptionContext'` はキーと値のペアで、暗号化されたオブジェクトに追加のセキュリティレイヤーを提供するために使用されます。暗号化クライアントは同じキーを渡す必要があります。これは、get 呼び出しで自動的に行われます。追加のコンテキストが必要ない場合は、空の配列を渡すことができます。
+  `@CipherOptions` は、使用する暗号やキーサイズなど、暗号化の追加設定です。
+  `@MaterialsProvider` は、暗号キーと初期化ベクトルの生成、および暗号キーの暗号化を処理するプロバイダーです。
+  `@CommitmentPolicy` は、キーコミットメントまたはキーコミットメントなしでオブジェクトを読み取る方法、およびキーコミットメントまたはキーコミットメントなしでオブジェクトを書き込む方法を指定するポリシーオプションです。

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

**注記**  
`'@CipherOptions'` が正しく設定されていない場合、Amazon S3 および AWS KMSベースのサービスエラーに加えて、スローされた`InvalidArgumentException`オブジェクトが表示されることがあります。

## 復号
<a name="decryption"></a>

オブジェクトのダウンロードと復号には、標準パラメータに加えて 5 つの追加`GetObject`パラメータがあり、そのうちの 2 つが必要です。クライアントは基本的な暗号オプションを検出します。
+   
** `'@SecurityProfile'`: 「V3」に設定すると、V3-compatibleで暗号化されたオブジェクトのみ**  
復号化できます。このパラメータを「V3\$1AND\$1LEGACY」に設定すると、V1-compatible形式で暗号化されたオブジェクトを復号することもできます。移行をサポートするには、@SecurityProfile を「V3\$1AND\$1LEGACY」に設定します。新しいアプリケーション開発にのみ「V3」を使用します。
+   
** `'@MaterialsProvider'` は、暗号キーと初期化ベクトルの生成、**  
および暗号キーの暗号化を処理するプロバイダーです。
+   
** `'@KmsAllowDecryptWithAnyCmk'`: (オプション) このパラメータを true に設定すると、**  
MaterialsProvider のコンストラクタに KMS キー ID を提供しなくても復号化できるようになります。デフォルト値は false です。
+   
** `'@CipherOptions'` (オプション) は、使用する暗号やキーサイズなど、**  
暗号化の追加設定です。
+   
** `@CommitmentPolicy` オブジェクトが で読み取られる方法を指定する ポリシーオプション **  
キーコミットメントまたはキーコミットメントなし、およびオブジェクトがキーコミットメントまたはキーコミットメントなしで書き込まれる方法。

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

**注記**  
`'@CipherOptions'` が正しく設定されていない場合、Amazon S3 および AWS KMSベースのサービスエラーに加えて、スローされた`InvalidArgumentException`オブジェクトが表示されることがあります。

## 暗号設定
<a name="cipher-configuration"></a>

** `'Cipher'` (文字列)**  
暗号化中に暗号化クライアントが使用する暗号メソッド。現時点では、'gcm' のみがサポートされています。

**重要**  
PHP が [バージョン 7.1 に更新されると](http://php.net/manual/en/migration71.new-features.php) GCM 暗号向け OpenSSL を使用して [暗号化](http://php.net/manual/en/function.openssl-encrypt.php)および[復号](http://php.net/manual/en/function.openssl-decrypt.php)するために必要な追加のパラメーターが含まれます。PHP バージョン 7.0 以前では、GCM サポート用の polyfill が提供されており、暗号化クライアント `S3EncryptionClientV2` および `S3EncryptionMultipartUploaderV2` で使用されています。ただし、大きな入力のパフォーマンスは、PHP 7.1 以降のネイティブ実装を使用するよりも、polyfill を使用した方がはるかに遅くなるため、それらを効果的に使用するには、古い PHP バージョン環境のアップグレードが必要になる場合があります。

** `'KeySize'` (int)**  
暗号化のために生成するコンテンツ暗号化キーの長さ。デフォルトは 256 ビットです。有効な設定オプションは 256 ビットです。

** `'Aad'` (文字列)**  
暗号化されたペイロードに含める「追加認証データ」(オプション)。この情報は復号時に検証されます。`Aad` は「GCM」暗号化を使用する場合にのみ使用できます。

**重要**  
追加の認証データはすべての AWS SDKs でサポートされていないため、他の SDKs はこのパラメータを使用して暗号化されたファイルを復号できない場合があります。

## メタデータ戦略
<a name="metadata-strategies"></a>

`Aws\Crypto\MetadataStrategyInterface` を実装するクラスのインスタンスを提供するオプションもあります。このシンプルなインターフェイスは、エンベロープ暗号化マテリアルを含む `Aws\Crypto\MetadataEnvelope` の保存とロードを処理します。SDK は 2 つのクラスを実装します。`Aws\S3\Crypto\HeadersMetadataStrategy` と `Aws\S3\Crypto\InstructionFileMetadataStrategy` です。`HeadersMetadataStrategy` がデフォルトで使用されます。

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

`HeadersMetadataStrategy` と `InstructionFileMetadataStrategy` に対するクラス名の定数は、*::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'),
]);
```

**注記**  
インストラクションファイルがアップロードされた後に障害が発生している場合は、自動的に削除されます。

## マルチパートアップロード
<a name="multipart-uploads"></a>

クライアント側の暗号化を使用してマルチパートアップロードを実行することもできます。アップロードする前に、`Aws\S3\Crypto\S3EncryptionMultipartUploaderV3` は暗号化のためにソースストリームを準備します。1 つ作成すると `Aws\S3\MultipartUploader` と `Aws\S3\Crypto\S3EncryptionClientV3` を使用した場合と同様の結果になります。`S3EncryptionMultipartUploaderV3` は `'@MetadataStrategy'` オプションを `S3EncryptionClientV3` と同様に処理でき、`'@CipherOptions'` 設定ですべて利用できます。

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

**注記**  
`'@CipherOptions'` が正しく設定されていない場合、Amazon S3 および AWS KMSベースのサービスエラーに加えて、スローされた`InvalidArgumentException`オブジェクトが表示されることがあります。