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

MySQL内置AES-256-ECB加密数据如何在Node.js+Sequelize环境下解密

解决方案

核心问题定位

  • MySQL插入语句中错误使用了UNHEX()处理密钥:你生成的256位密钥是普通ASCII字符串,不是十六进制编码字符串,UNHEX()会将非十六进制字符的输入处理为非法二进制值,导致加密密钥实际和Node侧传入的不一致
  • Node侧创建解密器时,ECB模式的IV参数需传入null而非空字符串,同时密钥的编码转换逻辑错误,不应该从hex格式解码
  • 解密时Buffer的处理逻辑有误,不需要额外指定binary输入格式,直接传入数据库返回的Buffer即可

正确实现步骤

1. MySQL侧正确加密语句

-- 先设置加密模式
SET @@SESSION.block_encryption_mode = 'aes-256-ecb';
-- 密钥直接传字符串即可,不需要UNHEX处理
INSERT INTO test_aes_ecb ( id, column_one, column_two )
VALUES (1, 2,AES_ENCRYPT('test','gVkYp3s6v9y$B&E)H@McQeThWmZq4t7w'));

2. Node侧正确解密代码(使用原生crypto模块,无需额外第三方依赖)

const crypto = require('crypto');
const { test } = require('./你的sequelize模型文件路径');

// 加密算法固定为aes-256-ecb
const ALGORITHM = 'aes-256-ecb';
// 密钥和MySQL侧使用的完全一致
const SECRET_KEY = 'gVkYp3s6v9y$B&E)H@McQeThWmZq4t7w';

async function testmysqlAESModel () {
  try {
    const users = await test.findAll();
    // 数据库返回的column_one是Buffer类型,直接使用即可
    const encryptedBuffer = users[0].column_one;
    
    // 创建解密器,ECB模式iv传null
    const decipher = crypto.createDecipheriv(ALGORITHM, Buffer.from(SECRET_KEY), null);
    // 自动处理padding,不需要手动调整
    let decrypted = decipher.update(encryptedBuffer, undefined, 'utf8');
    decrypted += decipher.final('utf8');
    
    console.log('解密结果:', decrypted); // 输出 test
  } catch (err) {
    console.error('解密出错:', err);
  }
}

testmysqlAESModel();

额外注意事项

  • 如果你一定要在MySQL侧使用UNHEX()处理密钥,需要先将原始密钥转换为十六进制字符串,再传入UNHEX(),同时Node侧的密钥也要对应从十六进制解码
  • ECB加密模式安全性较低,若业务允许建议更换为CBC等需要IV的加密模式,安全性更高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:06:01