如何让Databricks的aes_encrypt函数对相同输入输出相同结果
问题
在Databricks中使用内置的aes_encrypt函数加密数据时,发现相同输入的加密结果不一致,每条记录的加密值都不同。执行的SQL如下:
drop table if exists encr; create table encr as ( select original_text, base64(aes_encrypt(original_text,'abcdefabcdefabcdefabcdef')) as encrypted, cast(aes_decrypt(unbase64(base64(aes_encrypt(original_text,'abcdefabcdefabcdefabcdef'))), 'abcdefabcdefabcdefabcdef') as string) as decrypted from my_table ) ;
用于验证结果的SQL:
select count(*), count(distinct original_text), count(distinct encrypted) from encr ;
查询结果:
需要实现相同输入得到相同加密值的效果,该如何处理?
解决方案
Databricks的aes_encrypt函数默认会自动生成随机的初始化向量(IV),这是相同输入加密结果不同的核心原因。要实现固定输入对应固定加密值,需手动指定固定的IV参数,同时注意以下细节:
- 指定固定IV
aes_encrypt支持传入第三个参数指定IV,IV长度必须匹配AES算法要求:
- AES-128对应16字节IV
- AES-192对应16字节IV
- AES-256对应32字节IV
你的密钥为24字节(对应AES-192),因此需要使用16字节的固定IV。修改后的SQL示例:
drop table if exists encr; create table encr as ( select original_text, base64(aes_encrypt(original_text, 'abcdefabcdefabcdefabcdef', '0123456789abcdef')) as encrypted, cast(aes_decrypt(unbase64(base64(aes_encrypt(original_text, 'abcdefabcdefabcdefabcdef', '0123456789abcdef'))), 'abcdefabcdefabcdefabcdef', '0123456789abcdef') as string) as decrypted from my_table ) ;
解密时必须使用和加密完全相同的IV,才能正确还原原始数据。
- 安全性提醒
- 固定IV会降低加密安全性:相同明文会生成相同密文,攻击者可通过频率分析破解数据。若业务对安全性要求较高,不建议使用固定IV。
- 密钥和IV需严格保密,避免泄露。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

