使用SQL脚本解密EF Core加密数据返回Null的问题求助
EF Core AesProvider加密后SQL解密返回Null的解决办法
核心问题分析
你的SQL脚本存在两个致命错误:密钥处理逻辑和EF Core的加密逻辑不匹配,以及错误生成了新的IV用于解密。
1. 密钥处理错误
EF Core代码中,实际传入AesProvider的密钥是原keyBase转成Base64字符串后的UTF8字节数组,而你的SQL直接对原keyBase执行UNHEX,完全不符合加密时的密钥推导逻辑。
2. IV使用错误
AesProvider默认会将IV(16字节)嵌入到加密后的数据头部,解密时必须使用这个嵌入的IV,而不是随机生成新的IV。
修正后的SQL脚本
SET @keyBase = 'xxxxxxxxxxxxxxxxxxxxxxxx'; SET @encrypted_data = 'some encrypted data from column'; -- 模拟EF Core的密钥推导逻辑:先把keyBase转成Base64字符串,再转成UTF8字节数组 SET @key_str = TO_BASE64(@keyBase); SET @key = CAST(@key_str AS BINARY); -- 从加密数据中提取IV(前16字节)和实际密文 SET @encrypted_binary = FROM_BASE64(@encrypted_data); SET @iv = LEFT(@encrypted_binary, 16); SET @ciphertext = SUBSTRING(@encrypted_binary, 17); -- 使用正确的密钥和IV解密 SET @decrypted_data = AES_DECRYPT(@ciphertext, @key, @iv); -- 返回解密结果 SELECT CAST(@decrypted_data AS CHAR) AS decrypted_data;
额外验证点
- 确保数据库的字符集是UTF8,否则
CAST(@key_str AS BINARY)得到的字节数组会和EF Core中Encoding.UTF8.GetBytes(key)不一致。 - 确认
AesProvider使用的是ECB以外的模式(默认是CBC),且填充方式和MySQL的AES_DECRYPT一致(默认PKCS#7),这部分AesProvider和MySQL默认是匹配的。
内容的提问来源于stack exchange,提问作者cargt4
相关产品推荐
相关产品推荐

