首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于mysql和node.js的AES加密

基于mysql和node.js的AES加密
EN

Stack Overflow用户
提问于 2021-09-21 18:17:38
回答 1查看 884关注 0票数 1

我在下面的问题上挣扎了好几天,之前也发过同样的问题,但没有得到任何积极的反馈。

我使用mysql构建aes_encrypt方法对新的和现有的数据进行加密。https://dev.mysql.com/doc/refman/8.0/en/encryption-functions.html

代码语言:javascript
运行
复制
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使用对进行续写,并试图通过模型调用数据->从节点端解密。

我试过下面的图书馆,

代码语言:javascript
运行
复制
"aes-ecb": "^1.3.15",
"aes256": "^1.1.0",
"crypto-js": "^4.1.1",
"mysql-aes": "0.0.1",

下面是续订调用的代码片段

代码语言:javascript
运行
复制
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,如下所示。

代码语言:javascript
运行
复制
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里这样叫,

代码语言:javascript
运行
复制
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

仍然无法修复,您能提供示例项目或任何类型的支持代码片段吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-21 19:05:16

这里有多个问题:

  1. 确保您的密钥具有正确的长度。AES被指定为特定的密钥长度(即128、196和256位)。如果使用任何其他密钥长度,则密钥将由密码库填充(零扩展)或截断。这是一个非标准的过程,不同的实现将以不同的方式进行。为了避免这种情况,使用正确长度的键并存储它有十六进制,而不是ascii (以避免字符集问题)

关于密码到密钥推断的

  1. 潜在问题。一些AES实现使用方法从密码/密码短语推断密钥。由于您在MySQL中使用原始键,所以您不想推断任何东西,而是希望在NodeJS中也使用原始键。这意味着,如果您使用的是本机密码模块,则希望使用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中解码这个可能如下所示:

代码语言:javascript
运行
复制
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是关键,显然您必须创建自己的。只需确保您的键具有与示例相同的长度,并且是有效的十六进制字符串。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69273764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档