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

如何让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参数,同时注意以下细节:

  1. 指定固定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,才能正确还原原始数据。

  1. 安全性提醒
  • 固定IV会降低加密安全性:相同明文会生成相同密文,攻击者可通过频率分析破解数据。若业务对安全性要求较高,不建议使用固定IV。
  • 密钥和IV需严格保密,避免泄露。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 05:39:52