AWS Encryption SDK for Python - AWS Encryption SDK

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

AWS Encryption SDK for Python

本主题介绍了如何安装和使用 AWS Encryption SDK for Python。有关使用编程的详细信息 AWS Encryption SDK for Python,请参阅上的aws-encryption-sdk-python存储库 GitHub。有关API文档,请参阅阅读文档

先决条件

在安装之前 AWS Encryption SDK for Python,请确保满足以下先决条件。

支持的 Python 版本

3.2.0 及更高版本需要 Python 3.8 或更高 AWS Encryption SDK for Python 版本。

注意

AWS 加密材料提供程序库 (MPL) 是版本 4 中 AWS Encryption SDK for Python 引入的可选依赖项。 x。如果您打算安装,则必须使用 Python 3.11 或更高版本。MPL

的早期版本 AWS Encryption SDK 支持 Python 2.7 和 Python 3.4 及更高版本,但我们建议您使用最新版本的 AWS Encryption SDK。

要下载 Python,请参阅 Python 下载

适用于 Python 的 pip 安装工具

pip 包含在 Python 3.6 及更高版本中,但您可能需要对其进行升级。有关升级或安装 pip 的更多信息,请参阅 pip 文档中的 Installation

安装

安装最新版本的 AWS Encryption SDK for Python。

注意

3.0.0 AWS Encryption SDK for Python 之前的所有版本都处于该阶段。end-of-support

您可以安全地从 AWS Encryption SDK 版本 2.0.x 及更高版本更新为最新版本,无需更改任何代码或数据。但是,版本 2.0.x 中引入了新的安全功能,不向后兼容。要从 1.7.x 之前的版本更新到 2.0.x 及更高版本,必须先更新到 AWS Encryption SDK最新版本 1.x。有关详细信息,请参阅迁移 AWS Encryption SDK

pip用于安装 AWS Encryption SDK for Python,如以下示例所示。

安装最新版本
pip install "aws-encryption-sdk[MPL]"

[MPL]缀安装AWS 加密材料提供程序库 () MPL。MPL包含用于加密和解密数据的结构。MPL是版本 4 中 AWS Encryption SDK for Python 引入的可选依赖项。 x。我们强烈建议安装MPL. 但是,如果您不打算使用MPL,则可以省略后[MPL]缀。

有关使用 pip 安装和升级程序包的更详细信息,请参阅安装程序包

AWS Encryption SDK for Python 需要所有平台上的密码学库(pyca/密码学)。pip 所有版本均会在 Windows 上自动安装和构建 cryptography 库。 pip 8.1 及更高版本会自动在 Linux 上安装和构建 cryptography。如果使用 pip 早期版本,并且 Linux 环境没有构建 cryptography 库所需的工具,您需要安装这些工具。有关更多信息,请参阅在 Linux 上构建加密

该版本的1.10.0和2.5.0版本将密码学依赖关系 AWS Encryption SDK for Python 固定在2.5.0和3.3.2之间。其他版本则 AWS Encryption SDK for Python 安装最新版本的密码学。如果您需要比 3.3.2 更高的密码系统版本,我们建议您使用 AWS Encryption SDK for Python的最新主要版本。

有关的最新开发版本 AWS Encryption SDK for Python,请访问中的aws-encryption-sdk-python存储库 GitHub。

安装完成后 AWS Encryption SDK for Python,请先查看本指南中的 Python 示例代码

的 4.x 版 AWS Encryption SDK for Python

本节介绍版本 4 引入的新功能。 与可选的加密材料提供程序库 (MPL) 依赖项一起使用 AWS Encryption SDK for Python 时的 x

当你使用版本 4 时。 x AWS Encryption SDK for Python 使用时MPL,您可以使用密钥环进行信封加密。 AWS Encryption SDK 提供的密钥环与您在先前版本中使用的主密钥提供程序兼容。有关更多信息,请参阅 密钥环兼容性。有关从主密钥提供程序迁移到密钥环的示例,请参阅aws-encryption-sdk-python存储库中的迁移示例。 GitHub

本主题中的示例使用默认承诺策略实例化 AWS Encryption SDK 客户端。REQUIRE_ENCRYPT_REQUIRE_DECRYPT有关更多信息,请参阅 设置您的承诺策略

AWS KMS 里面有钥匙圈 AWS Encryption SDK for Python

里面的基本 AWS KMS 钥匙圈只 AWS Encryption SDK for Python 需要一把KMS钥匙。它们还需要一个 AWS KMS 客户端,这使您有机会为KMS密钥配置客户端。 AWS 区域

要创建带有一个或多个包装密 AWS KMS 钥的密钥环,请使用多密钥环。 AWS Encryption SDK for Python 有一个特殊的多密钥环,可以带一个或多个 AWS KMS 密钥,还有一个标准的多密钥环,可以带一个或多个任何支持类型的钥匙圈。一些程序员更喜欢使用多密钥环方法来创建他们所有的钥匙圈,他们 AWS Encryption SDK for Python 支持这种策略。

为所有典型用例(包括多区域密钥) AWS Encryption SDK for Python 提供基本的单钥匙圈和多密钥环。 AWS KMS

例如,要使用一个 AWS KMS 密钥创建 AWS KMS 密钥环,可以使用create_aws_kms_keyring()方法。

# Instantiate the AWS Encryption SDK client client = aws_encryption_sdk.EncryptionSDKClient( commitment_policy=CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT ) # Create a boto3 client for AWS KMS kms_client = boto3.client('kms', region_name="us-west-2") # Optional: Create an encryption context encryption_context: Dict[str, str] = { "encryption": "context", "is not": "secret", "but adds": "useful metadata", "that can help you": "be confident that", "the data you are handling": "is what you think it is", } # Instantiate the material providers library mat_prov: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders( config=MaterialProvidersConfig() ) # Create the AWS KMS keyring keyring_input: CreateAwsKmsKeyringInput = CreateAwsKmsKeyringInput( kms_key_id=arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab, kms_client=kms_client ) kms_keyring: IKeyring = mat_prov.create_aws_kms_keyring( input=keyring_input )

要使用一个或多个 AWS KMS 密钥创建密钥环,请使用create_aws_kms_multi_keyring()方法。此示例使用两个 KMS 密钥。要指定一个KMS密钥,请仅使用generator参数。指定其他KMS密钥的kms_key_ids参数是可选的。

此密钥环的输入不接受 AWS KMS 客户端。取而代之的是, AWS Encryption SDK 使用由密钥环中的KMS密钥表示的每个区域的默认 AWS KMS 客户端。例如,如果generator参数值标识的KMS密钥位于美国西部(俄勒冈)区域 (us-west-2),则会为该us-west-2区域 AWS Encryption SDK 创建默认 AWS KMS 客户端。如果需要自定义 AWS KMS 客户端,请使用create_aws_kms_keyring()方法。

# Instantiate the AWS Encryption SDK client client = aws_encryption_sdk.EncryptionSDKClient( commitment_policy=CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT ) # Optional: Create an encryption context encryption_context: Dict[str, str] = { "encryption": "context", "is not": "secret", "but adds": "useful metadata", "that can help you": "be confident that", "the data you are handling": "is what you think it is", } # Instantiate the material providers library mat_prov: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders( config=MaterialProvidersConfig() ) # Create the AWS KMS keyring kms_multi_keyring_input: CreateAwsKmsMultiKeyringInput = CreateAwsKmsMultiKeyringInput( generator=default_region_kms_key_id, kms_key_ids=[second_region_kms_key_id] ) kms_multi_keyring: IKeyring = mat_prov.create_aws_kms_multi_keyring( input=kms_multi_keyring_input )

AWS Encryption SDK for Python 支持使用对称加密 (SYMMETRIC_DEFAULT) 或非RSAKMS对称密 AWS KMS 钥的密钥环。 AWS KMS 使用非对称RSAKMS密钥创建的密钥环只能包含一个密钥对。

要使用非对称RSA AWS KMS 密钥环进行加密,您不需要 kms: GenerateDataKeykms: E ncrypt,因为在创建密钥环时,必须指定要用于加密的公钥材料。使用此密钥环进行加密时不会调用任何 AWS KMS 。要使用非对称密RSA AWS KMS 钥环进行解密,你需要 kms: Decrypt 权限。

要创建非对称RSA AWS KMS 密钥环,必须提供非对称RSAKMS密钥中的公钥和私钥ARN。必须对公钥进行PEM编码。以下示例使用非对称 AWS KMS 密钥对创建RSA密钥环。

# Instantiate the AWS Encryption SDK client client = aws_encryption_sdk.EncryptionSDKClient( commitment_policy=CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT ) # Optional: Create an encryption context encryption_context: Dict[str, str] = { "encryption": "context", "is not": "secret", "but adds": "useful metadata", "that can help you": "be confident that", "the data you are handling": "is what you think it is", } # Instantiate the material providers library mat_prov: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders( config=MaterialProvidersConfig() ) # Create the AWS KMS keyring keyring_input: CreateAwsKmsRsaKeyringInput = CreateAwsKmsRsaKeyringInput( public_key=public_key, kms_key_id=kms_key_id, encryption_algorithm="RSAES_OAEP_SHA_256", kms_client=kms_client ) kms_rsa_keyring: IKeyring = mat_prov.create_aws_kms_rsa_keyring( input=keyring_input )

版本 4.x 中必需的加密上下文

当你使用版本 4 时。 x 中 AWS Encryption SDK for Python MPL,您可以使用所需的加密上下文CMM来要求在加密操作中使用加密上下文。加密上下文是一组非机密键值对。加密上下文以加密方式绑定到加密的数据,以便需要使用相同的加密上下文解密字段。使用所需的加密上下文时CMM,可以指定一个或多个必需的加密上下文密钥(必需密钥),这些密钥必须包含在所有加密和解密调用中。

注意

CMM只有以下版本支持所需的加密上下文:

  • 版本 3。 的 x AWS Encryption SDK for Java

  • 版本 4。 for AWS Encryption SDK 的 x。 NET

  • 版本 4。 的 x AWS Encryption SDK for Python,与可选的加密材料提供者库 (MPL) 依赖项一起使用时。

如果您使用所需的加密上下文对数据进行加密CMM,则只能使用这些支持的版本之一对其进行解密。

加密时, AWS Encryption SDK 验证所有必需的加密上下文密钥是否包含在您指定的加密上下文中。对您指定的加密上下文进行 AWS Encryption SDK 签名。只有非所需密钥的键值对才会序列化并以明文格式存储在加密操作返回的加密消息的标头中。

解密时,必须提供包含代表所需密钥的所有键值对的加密上下文。 AWS Encryption SDK 使用此加密上下文和存储在加密邮件标头中的键值对来重建您在加密操作中指定的原始加密上下文。如果 AWS Encryption SDK 无法重建原始加密上下文,则解密操作将失败。如果您提供的键值对包含值不正确的所需密钥,则无法解密加密消息。您提供的键值对必须与加密时指定的相同。

重要

请仔细考虑您在加密上下文中为所需密钥选择的值。您必须能够在解密时再次提供相同密钥及其对应值。如果您无法重现所需密钥,则无法解密加密消息。

以下示例使用所需的加密上下文初始化 AWS KMS 密钥环。CMM

# Instantiate the AWS Encryption SDK client client = aws_encryption_sdk.EncryptionSDKClient( commitment_policy=CommitmentPolicy.REQUIRE_ENCRYPT_REQUIRE_DECRYPT ) # Create your encryption context encryption_context: Dict[str, str] = { "key1": "value1", "key2": "value2", "requiredKey1": "requiredValue1", "requiredKey2": "requiredValue2" } # Create a list of required encryption context keys required_encryption_context_keys: List[str] = ["requiredKey1", "requiredKey2"] # Instantiate the material providers library mpl: AwsCryptographicMaterialProviders = AwsCryptographicMaterialProviders( config=MaterialProvidersConfig() ) # Create the AWS KMS keyring keyring_input: CreateAwsKmsKeyringInput = CreateAwsKmsKeyringInput( kms_key_id=kms_key_id, kms_client=boto3.client('kms', region_name="us-west-2") ) kms_keyring: IKeyring = mpl.create_aws_kms_keyring(keyring_input) # Create the required encryption context CMM underlying_cmm: ICryptographicMaterialsManager = \ mpl.create_default_cryptographic_materials_manager( CreateDefaultCryptographicMaterialsManagerInput( keyring=kms_keyring ) ) required_ec_cmm: ICryptographicMaterialsManager = \ mpl.create_required_encryption_context_cmm( CreateRequiredEncryptionContextCMMInput( required_encryption_context_keys=required_encryption_context_keys, underlying_cmm=underlying_cmm, ) )