常见问题 - AWS Encryption SDK

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

常见问题

AWS Encryption SDK与 AWS 开发工具包有何不同?

AWS SDK 提供用于与亚马逊云科技(AWS)交互的库,包括 AWS Key Management Service(AWS KMS)。AWS Encryption SDK 的某些语言实施(例如适用于 .NET 的 AWS Encryption SDK)始终需要采用相同编程语言的 AWS SDK。只有当您在密钥环或主密钥提供程序中使用 AWS KMS 密钥时,其他语言实施才需要对应 AWS SDK。有关详细信息,请参阅 AWS Encryption SDK编程语言 中有关您的编程语言的主题。

您可以使用 AWS SDK 与 AWS KMS 进行交互,包括对少量数据(使用对称加密密钥最多为 4096 字节)加密和解密,以及生成用于客户端加密的数据密钥。但是,生成数据密钥时,必须管理整个加密和解密过程,包括使用 AWS KMS 外部数据密钥加密数据、安全丢弃明文数据密钥、存储加密数据密钥,然后解密数据密钥和数据。AWS Encryption SDK 为您处理此过程。

AWS Encryption SDK 提供了一个库,该库使用行业标准和最佳实践加密和解密数据。其生成数据密钥,使用您指定的包装密钥对其进行加密,然后返回加密消息,其为包含加密数据和解密所需的加密数据密钥的便携式数据对象。到解密时,您传入加密消息和至少一个包装密钥(可选),然后 AWS Encryption SDK 返回您的明文数据。

您可以在 AWS Encryption SDK 中将 AWS KMS keys 用作包装密钥,但这不是必需的。您可以使用自己生成的加密密钥以及来自密钥管理器或本地硬件安全模块的加密密钥。即使您没有 AWS 账户,也可以使用 AWS Encryption SDK。

AWS Encryption SDK 与 Amazon S3 加密客户端有何不同?

AWS SDK 中的 Amazon S3 加密客户端 为 Amazon Simple Storage Service(Amazon S3)中存储的数据提供加密和解密。这些客户端与 Amazon S3 紧密耦合在一起,并且仅适用于在该位置中存储的数据。

AWS Encryption SDK为可存储在任意位置的数据提供加密和解密。AWS Encryption SDK 和 Amazon S3 加密客户端不兼容,因为它们生成具有不同数据格式的密文。

AWS Encryption SDK支持哪些加密算法,哪种算法是默认算法?

AWS Encryption SDK 使用伽罗瓦/计数器模式(GCM)中的高级加密标准(AES)对称算法(称为 AES-GCM)以加密您的数据。其允许您从多种对称和非对称算法中进行选择,以便对加密数据的数据密钥进行加密。

对于 AES-GCM,默认算法套件为 AES-GCM,具有 256 位密钥、密钥派生(HKDF)、数字签名密钥承诺。AWS Encryption SDK 还支持 192 位和 128 位加密密钥以及加密算法,无需数字签名和密钥承诺。

在所有情况下,初始化向量 (IV) 长度为 12 个字节;身份验证标签长度为 16 个字节。默认情况下,该开发工具包将数据密钥作为基于 HMAC 的提取和扩展密钥派生函数 (HKDF) 输入以派生 AES-GCM 加密密钥,并且还添加椭圆曲线数字签名算法 (ECDSA) 签名。

有关选择要使用的算法的信息,请参阅支持的算法套件

有关支持的算法的实施详细信息,请参阅算法参考

如何生成初始化向量 (IV) 以及将其存储在何处?

AWS Encryption SDK 使用确定性的方法为每个帧构造不同的 IV 值。此过程可确保消息中的 IV 永远不会重复。(在 AWS Encryption SDK for Java 和 AWS Encryption SDK for Python 版本 1.3.0 之前,AWS Encryption SDK 会为每个帧随机生成一个唯一的 IV 值。)

IV 存储在 AWS Encryption SDK 返回的加密消息中。有关更多信息,请参阅 AWS Encryption SDK 消息格式参考

如何生成、加密和解密每个数据密钥?

方法取决于您使用的密钥环或主密钥提供程序。

AWS Encryption SDK 中的 AWS KMS 密钥环和主密钥提供程序使用 AWS KMS GenerateDataKey API 操作来生成各个数据密钥,并使用其包装密钥对其进行加密。为了使用其他 KMS 密钥加密数据密钥副本,其使用 AWS KMS Encrypt 操作。为了解密数据密钥,其使用 AWS KMS Decrypt 操作。有关详细信息,请参阅 GitHub AWS Encryption SDK Specification 中的 AWS KMS keyring

其他密钥环使用各种编程语言的最佳实践方法生成数据密钥并进行加密和解密。有关详细信息,请参阅 GitHub AWS Encryption SDK Specification 的 Framework 部分中的密钥环或主密钥提供程序规范。

如何跟踪用于加密我的数据的数据密钥?

AWS Encryption SDK 为您执行该操作。在加密数据时,该开发工具包加密数据密钥,并将加密的密钥与加密的数据一起存储在它返回的加密的消息中。在解密数据时,AWS Encryption SDK从加密的消息中提取加密的数据密钥,对其进行解密,然后使用该密钥解密数据。

AWS Encryption SDK如何将加密的数据密钥与其加密数据存储在一起?

AWS Encryption SDK中的加密操作返回加密的消息,这是一个包含加密数据及其加密数据密钥的数据结构。消息格式包含至少两个部分:标头正文。消息标头包含加密的数据密钥以及有关消息正文组成方式的消息。消息正文包含加密的数据。如果算法套件包含数字签名,则消息格式包括包含签名的页脚。有关更多信息,请参阅 AWS Encryption SDK 消息格式参考

AWS Encryption SDK消息格式在加密的数据中增加了多少开销?

AWS Encryption SDK增加的开销量取决于一些因素,其中包括:

  • 明文数据的大小

  • 使用哪些支持的算法

  • 是否提供其他经过身份验证的数据 (AAD) 以及该 AAD 的长度

  • 包装密钥或主密钥的数量和类型

  • 帧大小(在使用帧数据时)

如果在默认配置中使用 AWS Encryption SDK [将一个 AWS KMS key 作为包装密钥(或主密钥),无 AAD,非帧数据,带签名的加密算法],开销大约为 600 个字节。一般来说,您可以合理地假设 AWS Encryption SDK增加 1 KB 或更少的开销,不包括提供的 AAD。有关更多信息,请参阅 AWS Encryption SDK 消息格式参考

我是否可以使用自己的主密钥提供程序?

是。实施详细信息因使用的支持的编程语言而有所不同。不过,所有支持的语言允许定义自定义加密材料管理器(CMM)、主密钥提供程序、密钥环、主密钥和包装密钥。

我是否可以使用多个包装密钥加密数据?

是。您可以使用附加包装密钥(或主密钥)加密数据密钥,以便在位于不同区域或无法用于解密时提供冗余。

要使用多个包装密钥加密数据,请创建一个具有多个包装密钥的密钥环或主密钥提供程序。在使用密钥环时,您可以创建一个具有多个包装密钥的密钥环多重密钥环

当您使用多个包装密钥加密数据时,AWS Encryption SDK 会使用一个包装密钥生成明文数据密钥。数据密钥是唯一的,在数学上与包装密钥无关。此操作会返回明文数据密钥以及由包装密钥加密的数据密钥的副本。然后是加密方法,即使用其他包装密钥加密数据密钥。生成的加密消息包含加密的数据以及加密的数据密钥,每个包装密钥具有一个加密的数据密钥。

可以通过在加密操作中使用的任一包装密钥以解密加密消息。AWS Encryption SDK 使用包装密钥解密加密的数据密钥。然后,它使用明文数据密钥以解密数据。

我可以使用 AWS Encryption SDK加密哪些数据类型?

AWS Encryption SDK 的多数编程语言实施均可加密原始字节(字节数组)、I/O 流(字节流)和字符串。适用于 .NET 的 AWS Encryption SDK 不支持 I/O 流。我们为每种支持的编程语言提供了示例代码。

AWS Encryption SDK如何加密和解密输入/输出 (I/O) 流?

AWS Encryption SDK创建一个包装基础 I/O 流的加密或解密流。加密或解密流对读取或写入调用执行加密操作。例如,它可以读取基础流上的明文数据,并在返回结果之前对其进行加密。或者,它可以从基础流中读取密文,并在返回结果之前对其进行解密。我们为每种支持流式传输的支持的编程语言提供了加密和解密流的示例代码。

适用于 .NET 的 AWS Encryption SDK 不支持 I/O 流。