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

在PySpark SQL中解密MySQL AES加密数据遇阻求助

解决Glue PySpark SQL解密MySQL加密字段的问题

问题根源

MySQL中用AES_ENCRYPT加密后得到的是二进制数据,但你将其存储在latin1_swedish_ci排序规则的varchar列中时,MySQL会自动把二进制数据按照latin1编码转成字符串存储。而你之前直接在PySpark中使用AES_DECRYPT处理该字符串,会默认按utf8编码解析成二进制,导致字节长度不符合AES解密要求(必须是16的倍数),从而报错。unhex返回NULL是因为该字符串不是十六进制格式,自然无法解析。

解决方案

需要先将latin1编码的字符串转回原始二进制加密数据,再进行AES解密,步骤如下:

1. 使用PySpark SQL语句解密

SELECT 
  CAST(
    AES_DECRYPT(
      ENCODE(mobile, 'latin1'),  -- 将latin1编码的字符串转回二进制
      'your_mysql_key',          -- 替换为MySQL中使用的解密密钥
      'ECB',                     -- MySQL AES默认模式为ECB
      'PKCS'                     -- MySQL AES默认填充为PKCS#5(与PKCS#7兼容)
    ) AS STRING
  ) AS mobile_decrypted
FROM your_table;

2. 使用PySpark DataFrame API解密

from pyspark.sql.functions import aes_decrypt, encode, cast

# 替换为你的DataFrame和密钥
df = df.withColumn(
    "mobile_decrypted",
    cast(
        aes_decrypt(encode(df["mobile"], "latin1"), "your_mysql_key", "ECB", "PKCS"),
        "string"
    )
)

关键注意事项

  • 密钥必须与MySQL中使用的完全一致,包括字符编码(如果密钥包含非ASCII字符,需确保PySpark和MySQL使用相同编码解析密钥)。
  • MySQL的AES_ENCRYPT默认使用128位密钥(16字节),如果你的密钥长度不符合,MySQL会自动截断/重复密钥到对应长度,PySpark的AES_DECRYPT会遵循相同逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:10:11