在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
相关产品推荐
相关产品推荐

