gpt4 book ai didi

node.js - Node.js 加密中使用字符串和缓冲区有什么区别

转载 作者:太空宇宙 更新时间:2023-11-03 22:04:55 25 4
gpt4 key购买 nike

我在一些网站上看到了下面的两个代码。一种使用 Buffer 包装加密 key 的 crypto.randomBytes() 对象,并用它来连接加密的最终结果,另一种使用普通的 crypto.randomBytes () 对象作为 key ,并使用“加等于”运算符简单地连接最终结果。

const cipher = crypto.createCipheriv(
"aes-256-gcm",
Buffer.from(crypto.randomBytes(32)),
crypto.randomBytes(16)
);
let encrypted = cipher.update("this is data");

encrypted = Buffer.concat([encrypted, cipher.final()]);
// edited: I forgot below line
encrypted = encrypted.toString("hex");

还有...

const cipher = crypto.createCipheriv(
"aes-256-gcm",
crypto.randomBytes(32),
crypto.randomBytes(16)
);
let encrypted = cipher.update("this is data");

encrypted += cipher.final();

两种实现都有效。但我找不到任何关于为什么他们使用 Buffer 的解释,也不知道这两个示例之间有什么区别。

更新

我尝试在两种实现中使用相同的 keyiv (如 Maarten Bodewes suggested ,它们产生相同的结果:

const crypto = require('crypto');

const data = 'hello world'
const algorithm = 'aes-256-gcm'
const key = crypto.randomBytes(32);
const iv = crypto.randomBytes(16);

function encrypt1(data) {
const cipher = crypto.createCipheriv(algorithm, key, iv);
let encrypted = cipher.update(data, 'utf8', 'hex');

encrypted += cipher.final('hex');

return encrypted;
}

function encrypt2(data) {
const cipher = crypto.createCipheriv(algorithm, Buffer.from(key), iv);
let encrypted = cipher.update(data);

encrypted = Buffer.concat([encrypted, cipher.final()]);

return encrypted.toString('hex');
}

const result1 = encrypt1(data);
const result2 = encrypt2(data);

console.log('result1: ', result1); // -> result1: 501db5c82e79e3185c1601
console.log('result2: ', result2); // -> result2: 501db5c82e79e3185c1601

那么,为什么必须使用看起来更复杂的 Buffer 才能产生相同的结果呢?

最佳答案

Buffer 只是使用的内部结构。

以下是一些可能的优点:

  • 缓冲区可以以机器字(32或64位)的形式存储字节,以使后续操作高效;
  • 无需在缓冲区和其他表示形式之间来回转换;
  • 它也可能比在字符串中存储字符更有效 - 可能不清楚存储这些字符的确切方式是什么,即使它们只是表示字节(例如,它们可以使用 16 或 32 位字) ,将所需大小加倍或四倍);
  • 如果存在转换错误,也可以在显式转换函数中而不是在加密方法中检测到,这可以使调试更容易;
  • 它可以更容易地将代码更改为例如使用不同编码的 key ,例如以十六进制表示。

最后,Buffer 更接近于键实际上应该是一个八位字节字符串字节数组,而不是< em>文本字符串。

但是,尽管如此,对于简单的加密操作,预期输出没有差异。所以从这个意义上说,这两种方法都是有效的。

关于node.js - Node.js 加密中使用字符串和缓冲区有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56868952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com