本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用第 3 AWS SDK for PHP 版的 Amazon S3 用戶端加密
使用用戶端加密時,會直接在您的環境中將資料加密和解密。這表示此資料在傳輸到 Amazon S3 之前已加密,而且您不需要依賴外部服務為您處理加密。對於新的S3EncryptionClientV2
實現,我們建議使用已棄用的S3EncryptionClient
和S3EncryptionMultipartUploader
. S3EncryptionMultipartUploaderV2
建議仍使用已取代版本的舊版實作嘗試移轉。 S3EncryptionClientV2
維護對使用舊S3EncryptionClient
版加密的資料進行解密的支援。
AWS SDK for PHP實作信封加密功能,使用 OpenSSL
遷移指南
對於那些試圖從已棄用的客戶端遷移到新客戶端的用戶端,可以在此處找到遷移指南。
設定
若要開始使用用戶端加密,您需要下列項目:
執行任何範例程式碼之前,請先設定您的AWS認證。請參閱AWS SDK for PHP版本 3 的認證。
加密
在中上傳加密物件S3EncryptionClientV2
需要額外三個參數,除了標準PutObject
參數之外:
-
'@KmsEncryptionContext'
是一個鍵值對,可用於為加密對象添加額外的安全層。加密客戶端必須傳入相同的密鑰,該密鑰將在 get 呼叫時自動執行。如果不需要其他上下文,請傳入一個空數組。 -
@CipherOptions
是加密的其他配置,包括要使用的密碼和密鑰大小。 -
@MaterialsProvider
是處理生成密鑰和初始化向量以及加密密鑰的提供程序。
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'), ]);
注意
除了 Amazon S3 和AWS KMS基於服務錯誤之外,如果設定不正確,您'@CipherOptions'
可能會收到拋出的InvalidArgumentException
物件。
解密
下載和解密一個對象有四個額外的參數,其中兩個是必需的,在標準GetObject
參數之上。客戶端將為您檢測基本的密碼選項。
-
-
'@SecurityProfile'
:如果設定為 'V2',則只有在 V2 相容中加密的物件 -
格式可以解密。將此參數設定為「V2_AND_REGISION」也可以解密以 V1 相容格式加密的物件。要支持遷移,請將 @ 設置SecurityProfile為「V2_ 和 _ 舊版」。僅將「V2」用於新的應用程序開發。
-
-
-
'@MaterialsProvider'
是處理生成密鑰和初始化向量的提供程序,如 -
以及加密您的密碼密鑰。
-
-
-
'@KmsAllowDecryptWithAnyCmk'
:( 可選)將此參數設置為 true 啟用解密 -
不向的建構函式提供 KMS 金鑰識別碼 MaterialsProvider。預設值為 false。
-
-
-
'@CipherOptions'
(可選)是加密的其他配置,包括 -
要使用的密碼和密鑰大小。
-
$result = $encryptionClient->getObject([ '@KmsAllowDecryptWithAnyCmk' => true, '@SecurityProfile' => 'V2_AND_LEGACY', '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, ]);
注意
除了 Amazon S3 和AWS KMS基於服務錯誤之外,如果設定不正確,您'@CipherOptions'
可能會收到拋出的InvalidArgumentException
物件。
密碼配置
-
'Cipher'
(string) -
加密用戶端在加密時所使用的加密方法。目前僅支援「gcm」。
重要
-
'KeySize'
(int) -
進行加密所需產生的內容加密金鑰的長度。預設值為 256 位元。有效的組態選項為 256 位元和 128 位元。
-
'Aad'
(string) -
要選用地包含在您加密承載中的「其他身分驗證資料」。解密時會驗證這項資訊。
Aad
僅在使用「gcm」加密法時才能使用。
重要
並非所有 AWS SDK 都支援其他驗證資料,因此其他 SDK 可能無法解密使用此參數加密的檔案。
元數據策略
您也可以選擇針對實作 Aws\Crypto\MetadataStrategyInterface
的類別,來提供其執行個體。這個簡單的界面可儲存和載入 Aws\Crypto\MetadataEnvelope
,其中包含您的信封加密資料。開發套件提供了實作此項目的兩個類別:Aws\S3\Crypto\HeadersMetadataStrategy
與 Aws\S3\Crypto\InstructionFileMetadataStrategy
。預設會使用 HeadersMetadataStrategy
。
$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, ]);
您也可透過呼叫 HeadersMetadataStrategy
::classInstructionFileMetadataStrategy
,來提供 和 的類別名稱常數。
$result = $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@MetadataStrategy' => HeadersMetadataStrategy::class, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]);
注意
如果在上傳指令檔案後發生故障,不會自動刪除該檔案。
分段上傳
您也可以使用用戶端加密來進行分段上傳。會在上傳之前Aws\S3\Crypto\S3EncryptionMultipartUploaderV2
準備來源串流以進行加密。建立的方法類似於使用 Aws\S3\MultipartUploader
和 Aws\S3\Crypto\S3EncryptionClientV2
時的經驗。S3EncryptionMultipartUploaderV2
可以處理與 '@MetadataStrategy'
相同的 S3EncryptionClientV2
選項,以及所有可用的 '@CipherOptions'
組態。
$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();
注意
除了 Amazon S3 和AWS KMS基於服務錯誤之外,如果設定不正確,您'@CipherOptions'
可能會收到拋出的InvalidArgumentException
物件。