You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 00:22:08