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

MySQL与CodeIgniter AES加密结果不一致,如何实现结果统一?

让MySQL AES_ENCRYPT与CodeIgniter加密结果一致的解决方案

核心差异分析

两者加密结果不同的原因主要有三点:

  1. 封装逻辑差异:CodeIgniter的encryption->encrypt()默认会自动添加IV、生成HMAC校验值,且输出为Base64编码;而MySQL的AES_ENCRYPT直接输出原始加密二进制字节。
  2. 密钥处理规则不同:MySQL的AES-128-ECB要求密钥为16字节,不足时用\x00(空字节)填充,超过则截断;CodeIgniter默认会对密钥进行哈希处理,而非直接使用原始字节。
  3. 输出结构差异:CodeIgniter会对加密结果做额外封装,导致输出格式和MySQL完全不同。

解决方案:调整CodeIgniter代码适配MySQL加密逻辑

直接使用OpenSSL原生函数替代CodeIgniter加密库的封装方法,还原MySQL的加密逻辑:

1. CodeIgniter加密代码(与MySQL AES_ENCRYPT结果一致)

// 明文与密钥
$plain_text = 'sabar';
$key = 'sabar';

// 按MySQL规则处理密钥:补空字节到16字节(AES-128要求)
$key = str_pad($key, 16, "\x00");

// 执行AES-128-ECB加密,输出原始二进制(和MySQL AES_ENCRYPT结果完全一致)
$ciphertext = openssl_encrypt(
    $plain_text,
    'aes-128-ecb',
    $key,
    OPENSSL_RAW_DATA // 禁用自动Base64编码,输出原始字节
);

// 若需要Base64编码方便传输/存储,可执行:
// $ciphertext_base64 = base64_encode($ciphertext);

2. MySQL解密CodeIgniter生成的密文

如果密文是原始二进制(存储在binary/blob字段):

SELECT AES_DECRYPT(your_ciphertext_column, 'sabar');

如果密文是Base64编码:

SELECT AES_DECRYPT(FROM_BASE64('your_base64_ciphertext'), 'sabar');

3. CodeIgniter解密MySQL生成的密文

// 从MySQL读取的原始二进制密文
$mysql_ciphertext = $this->db->get('your_table')->row()->ciphertext_column;

$key = str_pad('sabar', 16, "\x00");
$plain_text = openssl_decrypt(
    $mysql_ciphertext,
    'aes-128-ecb',
    $key,
    OPENSSL_RAW_DATA
);

echo $plain_text; // 输出:sabar

重要提醒

ECB加密模式不安全,它不使用初始化向量(IV),相同明文会生成相同密文,易被破解。生产环境建议改用CBC/GCM等安全模式,配合随机IV和HMAC校验,CodeIgniter加密库的默认配置(AES-256-CBC)更符合安全规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 05:36:12