使用Boto3调用AWS KMS解密CLI加密值时遇UTF-8解码错误的求助
问题原因分析
你遇到的问题核心是密文格式不匹配:AWS CLI执行aws kms encrypt后输出的CiphertextBlob是Base64编码的字符串,但Boto3的kms.decrypt()方法要求CiphertextBlob参数传入的是原始二进制密文数据。
你直接把存储的Base64字符串传给了CiphertextBlob,相当于让KMS去解密Base64编码后的字节,而不是真正的加密密文,所以解密得到的结果是乱码,自然无法用UTF-8解码。
解决办法
你需要先将存储的Base64密文字符串解码为二进制数据,再传给decrypt()方法,具体修改后的代码如下:
import base64 import boto3 kms = boto3.client('kms') # 假设token是你存储的Base64密文字符串 decoded_ciphertext = base64.b64decode(token) kms_response = kms.decrypt(CiphertextBlob=decoded_ciphertext) runner_token = kms_response['Plaintext'].decode('utf-8') print(runner_token) # 会输出预期的"test"
额外验证小技巧
如果你想确认CLI加密的输出格式,可以执行以下命令直接获取原始二进制密文(而非Base64编码):
aws kms encrypt --key-id xxx --plaintext "test" --output raw --query CiphertextBlob > encrypted.bin
这个encrypted.bin文件里的内容就是可以直接传给Boto3CiphertextBlob的二进制数据,不过实际存储时用Base64编码的字符串更便于传输和存储,所以解码步骤通常是必要的。
内容的提问来源于stack exchange,提问作者Yannick
相关产品推荐
相关产品推荐

