AWS KMS 密码基本知识
AWS KMS 使用可配置的加密算法,以使系统能够快速从一种已批准的算法或模式迁移到另一种算法或模式。初始原定设置加密算法集是从联邦信息处理标准(经 FIPS 批准)算法中选择的,用于确保其安全属性和性能。
要详细了解首选和可接受的密码算法,请参阅支持的加密算法。
熵和随机数生成
AWS KMS 密钥生成在 AWS KMS HSM 中执行。HSM 实现一个混合随机数生成器,该生成器使用 NIST SP800-90A 确定性随机位生成器 (DRBG) CTR_DRBG(使用 AES-256)
对称密钥操作(仅加密)
在 HSM 中使用的所有对称密钥加密命令都在使用 256 位密钥的伽罗瓦计数器模式 (GCM)
AES-GCM 是一种经过身份验证的加密方案。除了对明文进行加密以生成密文外,它还计算密文上的身份验证标签和需要身份验证的任何其他数据(附加身份验证数据或 AAD)。身份验证标签有助于确保数据来自声称的来源,并且密文和 AAD 未被修改。
通常,AWS 会在我们的描述中忽略包含的 AAD,尤其是提到数据密钥的加密时。在这些情况下,周围的文本暗示要加密的结构在要加密的明文和要保护的明文 AAD 之间进行分区。
AWS KMS 提供了一个可将密钥材料导入 AWS KMS key 中的选项,而不必依赖 AWS KMS 来生成密钥材料。这一导入的密钥材料可以使用 RSAES-OAEP
非对称密钥操作(加密、数字签名和签名验证)
AWS KMS 支持对加密、数字签名和密钥协议操作使用非对称密钥操作。非对称密钥操作依赖于数学上相关的公有密钥和私有密钥对,可用于加密和解密、签名和签名验证或派生共享密钥。私有密钥永远不会让 AWS KMS 处于未加密状态。您可以通过调用 AWS KMS API 操作在 AWS KMS 内使用公有密钥,或下载公有密钥并在 AWS KMS 外部使用该密钥。
AWS KMS 支持以下非对称密码。
-
RSA-OAEP(用于加密)与 RSA-PSS 和 RSA-PKCS-#1-v1_5(用于签名和验证)- 支持 RSA 密钥长度(以位为单位):2048、3072 和 4096;从而满足不同的安全要求。
-
椭圆曲线(ECC)– 用于签名和验证或派生共享密钥,但不能两者同时使用。支持 ECC 曲线:NIST P256、P384、P521、SECP 256k1。
-
ML-DSA:用于签名和验证。支持的 ML-DSA 密钥规范包括:ML_DSA_44、ML_DSA_65 和 ML_DSA_87。
-
SM2(仅限中国区域)– 用于加密和解密、签名和验证或派生共享密钥,但必须选择其中一种密钥用法。支持使用 SM2PKE 加密,使用 SM2DSA 签名。
密钥派生函数
密钥派生函数用于从初始机密或密钥派生其他密钥。AWS KMS 使用密钥派生函数 (KDF) 为 AWS KMS key下的每个加密派生每次调用的密钥。所有 KDF 操作都在 计数器模式下使用 KDF
AWS KMS 内部使用的数字签名
数字签名还用于验证 AWS KMS 实体之间的命令和通信。所有服务实体都有一个椭圆曲线数字签名算法 (ECDSA) 密钥对。它们执行 ECDSA,如 Use of Elliptic Curve Cryptography (ECC) Algorithms in Cryptographic Message Syntax (CMS)(在加密消息语法 [CMS] 中使用椭圆曲线加密 [ECC])
信封加密
在您加密数据后,数据将受到保护,但您必须保护加密密钥。一种策略是对其进行加密。信封加密 是一种加密方法,它使用数据密钥对明文数据进行加密,然后使用其他密钥对数据密钥进行加密。
您甚至可以使用其他加密密钥对数据加密密钥进行加密,并且在另一个加密密钥下加密该加密密钥。但是,最后,一个密钥必须以明文形式保留,以便您可以解密密钥和数据。此顶级明文密钥加密密钥称为根密钥。
AWS KMS 可通过安全地存储和管理加密密钥来帮助您保护它们。存储在 AWS KMS 中的根密钥(称为 AWS KMS keys)绝不会让 AWS KMS FIPS 140-3安全性 3 级认证硬件安全模块
许多加密系统中使用的基本结构是信封加密。信封加密使用两个或更多加密密钥来保护消息。通常,一个密钥派生自较长期间的静态密钥 k,另一个密钥是每条消息密钥 msgKey,该密钥生成以加密消息。信封通过加密以下消息形成:ciphertext = Encrypt(msgKey, message)。然后,消息密钥使用长期静态密钥进行加密:encKey = Encrypt(k, msgKey)。最后,这两个值 (encKey, ciphertext) 打包成一个结构,或信封加密的消息。
具有 k 访问权限的收件人可以打开信封加密的消息,方法是首先解密加密的密钥,然后解密消息。
AWS KMS 能够管理这些较长期间的静态密钥,并自动执行数据信封加密的过程。
除了 AWS KMS 服务中提供的加密功能以外,AWS Encryption SDK 还提供客户端信封加密库。您可以使用这些库来保护您的数据和用于加密该数据的加密密钥。
信封加密可提供以下多种优势:
-
保护数据密钥
加密数据密钥时,您无需担心存储加密数据密钥,因为数据密钥本身就受到加密的保护。您可以安全地将加密数据与加密数据密钥一起存储。
-
使用多个密钥加密相同的数据
加密操作可能非常耗时,特别是要加密的数据是大型对象时。您可以只重新加密保护原始数据的数据密钥,而无需使用不同的密钥多次重新加密原始数据。
-
结合多种算法的优势
通常,与公有密钥算法相比,对称密钥算法速度更快,生成的密文更小。但公有密钥算法可提供固有的角色分离和更轻松的密钥管理。信封加密让您可以每种策略的优势结合起来。
加密操作
在 AWS KMS 中,加密操作 是使用 KMS 密钥保护数据的 API 操作。由于 KMS 密钥保留在 AWS KMS 中,因此,您必须调用 AWS KMS 才能在加密操作中使用 KMS 密钥。
要使用 KMS 密钥执行加密操作,请使用 AWS 开发工具包、AWS Command Line Interface (AWS CLI) 或 AWS Tools for PowerShell。无法在 AWS KMS 控制台中执行加密操作。有关使用多种编程语言调用加密操作的示例,请参阅使用 AWS 开发工具包的 AWS KMS 代码示例。
下表列出了 AWS KMS 加密操作。它还显示操作中使用的 KMS 密钥的密钥类型和密钥使用要求。
| 操作 | 密钥类型 | 密钥用法 |
|---|---|---|
| Decrypt | 对称或非对称 | ENCRYPT_DECRYPT |
| DeriveSharedSecret | 非对称 | KEY_AGREEMENT |
| Encrypt | 对称或非对称 | ENCRYPT_DECRYPT |
| GenerateDataKey | 对称 | ENCRYPT_DECRYPT |
| GenerateDataKeyPair | 对称 [1] 在自定义密钥存储中的 KMS 密钥中不受支持。 |
ENCRYPT_DECRYPT |
| GenerateDataKeyPairWithoutPlaintext | 对称 [1] 在自定义密钥存储中的 KMS 密钥中不受支持。 |
ENCRYPT_DECRYPT |
| GenerateDataKeyWithoutPlaintext | 对称 | ENCRYPT_DECRYPT |
| GenerateMac | HMAC | GENERATE_VERIFY_MAC |
| GenerateRandom | 不适用。此操作不使用 KMS 密钥。 | 不适用 |
| ReEncrypt | 对称或非对称 | ENCRYPT_DECRYPT |
| Sign | 非对称 | SIGN_VERIFY |
| Verify | 非对称 | SIGN_VERIFY |
| VerifyMac | HMAC | GENERATE_VERIFY_MAC |
[1] 生成受对称加密 KMS 密钥保护的非对称数据密钥对。
有关加密操作的权限的信息,请参阅 AWS KMS 权限。
为了使 AWS KMS 对所有用户具有响应性和较强的功能,AWS KMS 为每秒可以调用的加密操作数设置了配额。有关详细信息,请参阅加密操作的共享配额。