将64字节HMAC_SHA_256密钥导入AWS KMS失败,求原因解析
AWS KMS HMAC_SHA256 仅支持32字节密钥的原因
背景
我持有一个用于HMAC_SHA256的64字节密钥,原本通过以下Java代码生成哈希:
SecretKeySpec keyspec = new SecretKeySpec(secret, "HmacSHA256"); Mac sha256 = (Mac) Mac.getInstance("HmacSHA256").clone(); sha256.init(keyspec); sha256.doFinal(prehash.getBytes())
尝试将哈希生成逻辑迁移至AWS KMS时,导入64字节密钥材料触发InvalidCiphertextException错误。调研后确认AWS KMS仅支持32字节的HMAC_SHA256密钥,但HMAC_SHA256规范及上述Java代码支持任意密钥长度(密钥大于64字节时会自动通过SHA256处理)。
以下是我执行的AWS KMS命令:
aws kms get-parameters-for-import \ --key-id XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX \ --wrapping-algorithm RSAES_OAEP_SHA_256 \ --wrapping-key-spec RSA_4096 > import.json cat import.json | jq -r .PublicKey | openssl enc -d -base64 -A -out WrappingPublicKey.bin cat import.json | jq -r .ImportToken | openssl enc -d -base64 -A -out ImportToken.bin openssl rand -out PlaintextKeyMaterial.bin 64 # 注:32字节可行,64字节不行 openssl pkeyutl \ -encrypt \ -in PlaintextKeyMaterial.bin \ -out EncryptedKeyMaterial.bin \ -inkey WrappingPublicKey.bin \ -keyform DER \ -pubin \ -pkeyopt rsa_padding_mode:oaep \ -pkeyopt rsa_oaep_md:sha256 \ -pkeyopt rsa_mgf1_md:sha256 aws kms import-key-material --key-id XXXXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXX \ --encrypted-key-material fileb://EncryptedKeyMaterial.bin \ --import-token fileb://ImportToken.bin \ --expiration-model KEY_MATERIAL_DOES_NOT_EXPIRE
限制原因分析
AWS KMS对HMAC_SHA256密钥长度限制为32字节,核心原因如下:
- 对齐哈希输出长度:HMAC_SHA256的哈希输出长度为256位(32字节),KMS选择使用与输出长度一致的密钥长度,这是密码学实践中的常规方案——同长度密钥无需额外预处理,且能保证足够安全性。
- 简化托管服务逻辑:固定密钥长度可简化KMS内部的密钥存储、验证和处理流程,降低可变长度带来的复杂度与潜在漏洞风险,符合托管密钥服务对稳定性、一致性的高要求。
- 安全性等价:长于32字节的HMAC密钥会被SHA256哈希后作为实际密钥使用,最终效果与直接使用32字节SHA256哈希值作为密钥完全一致。限制为32字节既不降低安全性,还能避免不必要的计算步骤。
若需迁移现有64字节密钥到KMS,只需先对原64字节密钥执行SHA256哈希,得到32字节结果后作为密钥材料导入即可,生成的HMAC结果会与原Java代码完全一致。
内容的提问来源于stack exchange,提问作者Angus Scott
相关产品推荐
相关产品推荐

