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

PHP openssl_encrypt加密数据,MySQL AES_DECRYPT解密密钥配置问题

我来帮你解决这个问题!你的核心问题有两个:一是密钥的正确格式,二是你漏掉了AES-CBC解密必须的IV参数,这两点都会导致解密返回null。

1. 密钥的正确处理方式

在你的PHP代码里,密钥是先通过base64_decode($key)转换成二进制数据,再传给openssl_encrypt的。所以在MySQL中,你需要用完全相同的逻辑把Base64密钥转成二进制——直接用FROM_BASE64()函数处理你的Base64密钥字符串就行。

比如你示例中的密钥,在MySQL里对应的正确写法是:

FROM_BASE64('lvvs9pxoekc54zsBpsp+/H1235BdjsAscdRRAxr47uw=')

这个结果和PHP里的$encryption_key完全一致,正好是AES-256-CBC需要的32字节二进制密钥。

2. 不要漏掉IV参数

你的加密逻辑里把随机生成的IV和加密内容用::拼接后才存入数据库,而AES-CBC模式解密时必须用到同一个IV。MySQL 5.7.4及以上版本支持AES_DECRYPT(ciphertext, key, iv)的语法,刚好适配这个需求。

修正后的MySQL解密语句

我们一步步拆解修正:

  1. 先解码存储的member_ssn:FROM_BASE64(member_ssn),得到拼接了加密内容::IV的原始数据
  2. 拆分出加密内容:SUBSTRING_INDEX(FROM_BASE64(member_ssn), '::', 1),这部分是PHP里openssl_encrypt返回的Base64密文,需要再解码成二进制:FROM_BASE64(SUBSTRING_INDEX(FROM_BASE64(member_ssn), '::', 1))
  3. 拆分出IV:SUBSTRING_INDEX(FROM_BASE64(member_ssn), '::', -1),直接用这个二进制IV即可
  4. 密钥用FROM_BASE64('你的真实Base64密钥')

最终的SQL语句如下:

SELECT 
    CAST(
        AES_DECRYPT(
            FROM_BASE64(SUBSTRING_INDEX(FROM_BASE64(member_ssn), '::', 1)),
            FROM_BASE64('lvvs9pxoekc54zsBpsp+/H1235BdjsAscdRRAxr47uw='), -- 替换成你的真实Base64密钥
            SUBSTRING_INDEX(FROM_BASE64(member_ssn), '::', -1)
        ) AS CHAR CHARACTER SET utf8mb4
    ) AS decrypted_string
FROM your_table_name;

额外注意事项

  • 确保你的MySQL版本是5.7.4或更高,只有这个版本及以上才支持AES_DECRYPT传入IV参数,且当密钥长度为32字节时,MySQL会自动使用AES-256-CBC模式,和你的PHP逻辑匹配。
  • 用CAST(...) AS CHAR CHARACTER SET utf8mb4是为了避免解密后出现乱码,你可以根据实际存储的字符集调整。
  • 不要用UNHEX()处理密钥,因为你的密钥是Base64编码的二进制数据,不是十六进制字符串,FROM_BASE64()才是正确的转换方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:16:34