AWS KMS包装密钥加密数据大小限制问题及低成本密钥存储咨询
问题分析与解决
1. 数据大小限制错误的原因
RSA OAEP加密的明文长度有严格限制,计算公式为:最大明文长度 = 密钥长度(字节) - 2*哈希长度(字节) - 2
举例:
- 2048位RSA密钥+SHA-256:256 - 2*32 -2 = 190字节
- 4096位RSA密钥+SHA-256:512 - 2*32 -2 = 446字节
你直接加密的rsa_key_4096.pem是PEM格式,包含Base64编码和头部尾部,文件大小远超上述上限;即使转换成DER格式,4096位RSA私钥的DER文件(PKCS#1格式)约528字节,也超过4096位RSA OAEP的最大明文长度,因此触发报错。
另外,若你创建的KMS CMK是2048位RSA规格,KMS提供的包装公钥也会是2048位,加密上限更低,完全无法容纳4096位私钥的任何编码格式。
2. 修正操作步骤
步骤1:匹配CMK规格与私钥长度
要导入4096位RSA私钥作为CMK的密钥材料,必须创建RSA_4096规格的CMK,这样KMS生成的包装公钥也是4096位,能支持更大的明文长度。
步骤2:转换私钥为紧凑编码格式
将PEM格式私钥转换成PKCS#1 DER格式(比PKCS#8更紧凑):
openssl rsa -in rsa_key_4096.pem -out rsa_key_4096_pkcs1.der -outform DER
步骤3:处理仍超限制的情况
若转换后的DER文件大小仍超过446字节,说明无法直接用RSA加密整个私钥,此时需换用信封加密思路存储私钥,而非将其作为KMS CMK的密钥材料。
3. 低成本私钥存储方案(信封加密)
该方案仅用AWS KMS+S3即可实现安全存储,无需CloudHSM,成本极低:
- 生成AES-256对称密钥:
openssl rand -hex 32 > aes_key.bin - 用AES-256-GCM加密RSA私钥:
openssl enc -aes-256-gcm -in rsa_key_4096.pem -out encrypted_private_key.bin -pass file:aes_key.bin - 用KMS CMK加密AES密钥:
aws kms encrypt --key-id <你的CMK ID> --plaintext fileb://aes_key.bin --output text --query CiphertextBlob > encrypted_aes_key.bin - 删除本地明文AES密钥:
shred -u aes_key.bin - 将
encrypted_private_key.bin和encrypted_aes_key.bin上传到S3(建议开启服务器端加密)。
使用私钥时的操作:
- 用KMS解密AES密钥:
aws kms decrypt --ciphertext-blob fileb://encrypted_aes_key.bin --output text --query Plaintext | base64 -d > aes_key.bin - 用AES密钥解密私钥:
openssl enc -d -aes-256-gcm -in encrypted_private_key.bin -out rsa_key_4096.pem -pass file:aes_key.bin - 使用后立即删除本地明文AES密钥和私钥。
4. 简化替代方案
若无需保留现有私钥,直接让KMS生成RSA_4096规格的CMK即可,KMS会自动管理密钥材料,操作简单且成本低廉。
内容的提问来源于stack exchange,提问作者Brijesh Patel
相关产品推荐
相关产品推荐

