Amazon S3 加密客户端迁移 - Amazon适用于 PHP 的开发工具包
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon S3 加密客户端迁移

本主题介绍了如何将应用程序从 Amazon 简单存储服务 (Amazon S3) 加密客户端的版本 1 (V1) 迁移到版本 2 (V2),并确保应用程序在整个迁移过程中的可用性。

迁移概述

此迁移分两个阶段进行:

1. 更新现有客户端以阅读新格式。首先,部署更新版本的AmazonSDK for PHP 到你的应用程序。这允许现有的 V1 加密客户端解密新 V2 客户端编写的对象。如果你的应用使用多个AmazonSDK,你必须分别升级每个 SDK。

2. 将加密和解密客户端迁移到 V2。一旦所有 V1 加密客户端都能读取新格式,您就可以将现有的加密和解密客户端迁移到各自的 V2 版本。

更新现有客户端以阅读新格式

V2 加密客户端使用旧版本的客户端不支持的加密算法。迁移的第一步是将 V1 解密客户端更新到最新的 SDK 版本。完成此步骤后,应用程序的 V1 客户端将能够解密由 V2 加密客户端加密的对象。请参阅下面的详细信息了解每个主要版本AmazonSDK for PHP。

升级AmazonSDK for PHP 版本 3

版本 3 是最新版本的AmazonSDK for PHP。要完成此迁移,您必须使用aws/aws-sdk-php程序包。

从命令行安装

对于使用 Composer 安装的项目,在 Composer 文件中,将 SDK 包更新到 SDK 的 3.148.0 版本,然后运行以下命令。

composer update aws/aws-sdk-php

使用 Phar 或 Zip 文件进行安装

使用以下方法之一。请务必将更新后的 SDK 文件放置在代码所需的位置,该位置由 require 语句确定。

对于使用 Phar 文件安装的项目,请下载更新后的文件:aws.phar.

<?php require '/path/to/aws.phar'; ?>

对于使用 Zip 文件安装的项目,请下载更新后的文件:.

<?php require '/path/to/aws-autoloader.php'; ?>

将加密和解密客户端迁移到 V2

更新客户端以阅读新的加密格式后,您可以将应用程序更新为 V2 加密和解密客户端。以下步骤演示如何将代码从 V1 成功迁移到 V2。

更新到 V2 客户端的要求

1. 这些区域有:Amazon KMS必须将加密上下文传递到S3EncryptionClientV2::putObjectS3EncryptionClientV2::putObjectAsync方法。Amazon KMS加密上下文是键值对的关联数组,您必须将其添加到加密上下文中Amazon KMS密密密密钥。如果不需要额外的上下文,你可以传递一个空数组。

2.@SecurityProfile必须传递到getObjectgetObjectAsync中的方法S3EncryptionClientV2.@SecurityProfile是的新的强制参数getObject...方法。如果设置为‘V2’,只能解密以 v2 兼容格式加密的对象。将该参数设置为‘V2_AND_LEGACY’还允许以 V1 兼容格式加密的对象进行解密。要支持迁移,请设置@SecurityProfile‘V2_AND_LEGACY’. 使用‘V2’仅适用于新的应用程序开发。

3. (可选)包括@KmsAllowDecryptWithAnyCmk中的参数S3EncryptionClientV2::getObjectS3EncryptionClientV2::getObjectAsync* methods.添加了名为的新参数@KmsAllowDecryptWithAnyCmk. 将该参数设置为true在不提供 KMS 密钥的情况下启用解密。默认值为 false

4. 对于使用 V2 客户端解密,如果@KmsAllowDecryptWithAnyCmk参数未设置为true(对于 )“getObject...”方法调用,akms-key-id必须提供给KmsMaterialsProviderV2构造函数。

迁移示例

示例 1:迁移到 V2 客户端

预迁移

use Aws\S3\Crypto\S3EncryptionClient; use Aws\S3\S3Client; $encryptionClient = new S3EncryptionClient( new S3Client([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]) );

迁移后

use Aws\S3\Crypto\S3EncryptionClientV2; use Aws\S3\S3Client; $encryptionClient = new S3EncryptionClientV2( new S3Client([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]) );

示例 2:将 KMS 与 kms-key-id 结合使用

注意

这些示例使用示例 1 中定义的导入和变量。例如 $encryptionClient

预迁移

use Aws\Crypto\KmsMaterialsProvider; use Aws\Kms\KmsClient; $kmsKeyId = 'kms-key-id'; $materialsProvider = new KmsMaterialsProvider( new KmsClient([ 'profile' => 'default', 'region' => 'us-east-1', 'version' => 'latest', ]), $kmsKeyId ); $bucket = 'the-bucket-name'; $key = 'the-file-name'; $cipherOptions = [ 'Cipher' => 'gcm', 'KeySize' => 256, ]; $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]); $result = $encryptionClient->getObject([ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, ]);

迁移后

use Aws\Crypto\KmsMaterialsProviderV2; use Aws\Kms\KmsClient; $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, ]; $encryptionClient->putObject([ '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, '@KmsEncryptionContext' => ['context-key' => 'context-value'], 'Bucket' => $bucket, 'Key' => $key, 'Body' => fopen('file-to-encrypt.txt', 'r'), ]); $result = $encryptionClient->getObject([ '@KmsAllowDecryptWithAnyCmk' => true, '@SecurityProfile' => 'V2_AND_LEGACY', '@MaterialsProvider' => $materialsProvider, '@CipherOptions' => $cipherOptions, 'Bucket' => $bucket, 'Key' => $key, ]);