我在下面的问题上挣扎了好几天,之前也发过同样的问题,但没有得到任何积极的反馈。
我使用mysql构建aes_encrypt方法对新的和现有的数据进行加密。https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html
SET @@SESSION.block_encryption_mode = 'aes-256-ecb';
INSERT INTO test_aes_ecb ( column_one, column_two )
values ( aes_encrypt('text','key'), aes_encrypt('text', 'key'));
我使用了ecb ciper,因此它不需要为此使用iv。问题是I无法从node.js side中解密它。
Im使用对进行续写,并试图通过模型调用数据->从节点端解密。
我试过下面的图书馆,
"aes-ecb": "^1.3.15",
"aes256": "^1.1.0",
"crypto-js": "^4.1.1",
"mysql-aes": "0.0.1",
下面是续订调用的代码片段
async function testmysqlAESModel () {
const users = await test.findAll();
console.log('users', users[0].column_one);
var decrypt = AES.decrypt( users[0].column_one, 'key' );
}
它返回的缓冲区数据和不能从节点端解密,有人能提供适当的例子吗?我挣扎了好几天。
编辑
将记录插入mysql,如下所示。
SET @@SESSION.block_encryption_mode = 'aes-256-ecb';
INSERT INTO test_aes_ecb ( id, column_one, column_two )
VALUES (1, 2,AES_ENCRYPT('test',UNHEX('gVkYp3s6v9y$B&E)H@McQeThWmZq4t7w')));
在nodejs里这样叫,
testmysqlAESModel();
async function testmysqlAESModel () {
const users = await test.findAll();
console.log('users', users[0].column_one);
var decipher = crypto.createDecipheriv(algorithm, Buffer.from("gVkYp3s6v9y$B&E)H@McQeThWmZq4t7w", "hex"), "");
var encrypted = Buffer.from(users[0].column_one); // Note that this is what is stored inside your database, so that corresponds to users[0].column_one
var decrypted = decipher.update(encrypted, 'binary', 'utf8');
decrypted += decipher.final('utf8');
console.log(decrypted);
}
我正在犯错误,
我使用下面的链接创建256位键。
https://www.allkeysgenerator.com/Random/Security-Encryption-Key-Generator.aspx
仍然无法修复,您能提供示例项目或任何类型的支持代码片段吗?
发布于 2021-09-21 19:05:16
这里有多个问题:
。
关于密码到密钥推断的
createDecipher
.而不是createDecipheriv
。
注意:您使用的AES模式(ECB)本质上是不安全的,因为相同的输入会导致相同的输出。有一些方法可以避免使用其他AES模式,例如CBC或GCM。你已经被警告过了。
示例:
MySQL SELECT AES_ENCRYPT('text',UNHEX('F3229A0B371ED2D9441B830D21A390C3')) as test;
返回缓冲区[145,108,16,83,247,49,165,147,71,115,72,63,152,29,218,246]
;
在Node中解码这个可能如下所示:
var crypto = require('crypto');
var algorithm = 'aes-128-ecb';
var decipher = crypto.createDecipheriv(algorithm, Buffer.from("F3229A0B371ED2D9441B830D21A390C3", "hex"), "");
var encrypted = Buffer.from([145,108,16,83,247,49,165,147,71,115,72,63,152,29,218,246]); // Note that this is what is stored inside your database, so that corresponds to users[0].column_one
var decrypted = decipher.update(encrypted, 'binary', 'utf8');
decrypted += decipher.final('utf8');
console.log(decrypted);
这又打印了一次text
。
请注意,在本例中,F3229A0B371ED2D9441B830D21A390C3
是关键,显然您必须创建自己的。只需确保您的键具有与示例相同的长度,并且是有效的十六进制字符串。
https://stackoverflow.com/questions/69273764
复制相似问题