AWS KMS相同输入生成相同密文的Python实现及密文转字符串方法
AWS KMS 固定密文生成与Python实现方案
1. 能否对相同输入生成相同密文?
默认情况下,AWS KMS的Encrypt API每次加密相同明文会生成不同密文,因为它会自动生成随机初始化向量(IV)和数据密钥。但如果需要相同输入对应相同密文,可以通过指定固定EncryptionContext并使用确定性加密实现——前提是你的KMS对称加密密钥已开启确定性加密(创建密钥时可配置,或后续修改密钥属性)。
2. Python实现步骤
首先确认你的KMS密钥已开启确定性加密,然后使用AWS SDK for Python(boto3)编写代码:
安装依赖
pip install boto3
核心代码
import boto3 import base64 def encrypt_user_id(user_id, key_id): kms_client = boto3.client('kms') # 调用加密接口,指定固定加密上下文和确定性加密规则 response = kms_client.encrypt( KeyId=key_id, Plaintext=user_id.encode('utf-8'), EncryptionContext={'usage': 'user_id_encrypt'}, # 必须固定,确保相同输入生成相同密文 EncryptionAlgorithm='SYMMETRIC_DEFAULT' ) # 将二进制密文转为Base64字符串,便于存储/传输 return base64.b64encode(response['CiphertextBlob']).decode('utf-8') def decrypt_user_id(encrypted_str, key_id): kms_client = boto3.client('kms') # 将Base64字符串转回二进制密文 ciphertext = base64.b64decode(encrypted_str) response = kms_client.decrypt( KeyId=key_id, CiphertextBlob=ciphertext, EncryptionContext={'usage': 'user_id_encrypt'} # 解密上下文必须和加密时完全一致 ) return response['Plaintext'].decode('utf-8') # 使用示例 if __name__ == '__main__': KMS_KEY_ID = '你的KMS密钥ARN或ID' test_user_id = 'user_001' encrypted_result = encrypt_user_id(test_user_id, KMS_KEY_ID) print(f"加密后字符串: {encrypted_result}") decrypted_result = decrypt_user_id(encrypted_result, KMS_KEY_ID) print(f"解密后用户ID: {decrypted_result}")
3. 密文能否转换为字符串?
可以。KMS返回的CiphertextBlob是二进制数据,通过Base64编码可将其转换为ASCII字符串,方便存储在数据库、配置文件或进行网络传输;解密时再将Base64字符串解码回二进制即可。
内容的提问来源于stack exchange,提问作者WAEX
相关产品推荐
相关产品推荐

