mysql - 在 Node.js 中解密 MySQL 的 AES_ENCRYPT

标签 mysql node.js buffer aes node-mysql

我对缓冲区对象使用 AES 解密时遇到问题,我希望有人知道我做错了什么......

我的例子: 我有一个带有 AES_ENCRYPT 用户名和密码的 MySQL 表...

CREATE TABLE Accounts 
(
    id INT(4) NOT NULL AUTO_INCREMENT,
    username VARBINARY(128) NOT NULL,
    password VARBINARY(128) NOT NULL,
    PRIMARY KEY(id)
);

DELIMITER |
CREATE TRIGGER encodeAccounts BEFORE INSERT ON Accounts
FOR EACH ROW BEGIN
    SET NEW.username = AES_ENCRYPT(NEW.username, 'password');
    SET NEW.password = AES_ENCRYPT(NEW.password, 'password');
END;

Node .js: 我正在使用 node-mysql 模块向我的数据集发送查询:

SELECT * FROM Accounts;

为密码和用户名返回此类值:

<Buffer 07 86 95 ee 77 df 86 50 ae 18 4c d5 3e 48 42 75>

如何用Node.JS的解密方法进行解密?我的尝试都失败了...... 我希望正确选择 AES-128-ECB...

在 Node.JS 中破译一些东西应该是这样的:

var decipher = crypto.createDecipher('AES-128-ECB', 'password');
var dec = decipher.update(rows[i].username); // an example, value look like <Buffer ...
dec += decipher.final('utf8');
console.log('dec: ' + dec);

感谢大家的帮助:)

最佳答案

您的密码必须按照 MySQL 内部转换的方式进行转换。 必须生成 16 字节长度的密码 XORd 以获取更长的密码或用 0 字节填充。 这个函数应该做的工作:

function convertCryptKey(strKey) {
    var newKey = new Buffer([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]);
    strKey = new Buffer(strKey);
    for(var i=0;i<strKey.length;i++) newKey[i%16]^=strKey[i];
    return newKey;
}

兼容 MySQL 的加密 - 注意使用带有空 IV 的“createCipheriv”。 (createCipher 创建自己的 IV,与 MySQL 不同)

var c = crypto.createCipheriv("aes-128-ecb", convertCryptKey("myPassword"), "");
var crypted = c.update('Take a trip at galaxytrek.com :)', 'utf8', 'hex') + c.final('hex');
console.log(crypted.toUpperCase());
>> 92068A5DAECE1E080EF4BA08A45CFF8D2262401F988A9241F1E4CEAAAB80BEAF7E0B50A1D5FD57CA56E92621622F018D

这是一样的:

mysql> select hex(aes_encrypt('Take a trip at galaxytrek.com :)','myPassword'));
+--------------------------------------------------------------------------------------------------+
| hex(aes_encrypt('Take a trip at galaxytrek.com :)','myPassword'))                                |
+--------------------------------------------------------------------------------------------------+
| 92068A5DAECE1E080EF4BA08A45CFF8D2262401F988A9241F1E4CEAAAB80BEAF7E0B50A1D5FD57CA56E92621622F018D |
+--------------------------------------------------------------------------------------------------+

解密

var dc = crypto.createDecipheriv("aes-128-ecb", convertCryptKey("myPassword"), "");
var decrypted = dc.update('92068A5DAECE1E080EF4BA08A45CFF8D2262401F988A9241F1E4CEAAAB80BEAF7E0B50A1D5FD57CA56E92621622F018D', 'hex', 'utf8') + dc.final('utf8');
console.log(decrypted);
>> Take a trip at galaxytrek.com :)

关于mysql - 在 Node.js 中解密 MySQL 的 AES_ENCRYPT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15545902/

相关文章:

mysql - 如何在变量中设置MySQL参数多个值

android - 获取平台 cordova-android@^8.0.0 失败

javascript - Socket.io + express 室

Java,从一个文件复制到另一个文件,逐行间隔

go - 不正确的数据重传

mysql - 替换 Typo3 DB 中的 URL

mysql - 当 LEFT JOINing 两个不同的表时,GROUP CONCAT concats 太多重复值

php - 如何从 codeigniter 中的 varchar 字段获取整数值的 max() ?

node.js - 在 MongoDB 中使用 like 查询

haskell - 关于Cygwin中Haskell程序的stdout缓冲区的问题