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

在Node.js加密中使用字符串和缓冲区有什么区别,node.js,cryptography,buffer,Node.js,Cryptography,Buffer,我在一些网站上看到了下面两个代码。一个使用Buffer包装加密密钥的crypto.randomBytes()对象并将其用于连接加密的最终结果,另一个使用普通crypto.randomBytes()对象作为加密密钥,并使用“加号等于”运算符简单地连接最终结果 const cipher=crypto.createCipheriv( “aes-256-gcm”, Buffer.from(crypto.randomBytes(32)), 加密随机字节(16) ); let encrypted=ciphe

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

const cipher=crypto.createCipheriv(
“aes-256-gcm”,
Buffer.from(crypto.randomBytes(32)),
加密随机字节(16)
);
let encrypted=cipher.update(“这是数据”);
encrypted=Buffer.concat([encrypted,cipher.final()]);
//编辑:我忘了在下面一行
加密=加密的.toString(“十六进制”);
而且

const cipher=crypto.createCipheriv(
“aes-256-gcm”,
加密随机字节(32),
加密随机字节(16)
);
let encrypted=cipher.update(“这是数据”);
加密+=cipher.final();
两种实现都可以工作。但是我找不到任何关于他们为什么使用
Buffer
的解释,也不知道这两个例子之间的区别是什么

更新 我尝试在两种实现中使用相同的
iv
(正如Maarten Bodewes所说,它们产生相同的结果:

const crypto=require('crypto');
const data='hello world'
常量算法='aes-256-gcm'
常量密钥=加密随机字节(32);
常数iv=加密随机字节(16);
函数加密1(数据){
const cipher=crypto.createCipheriv(算法,密钥,iv);
let encrypted=cipher.update(数据'utf8','hex');
encrypted+=cipher.final('hex');
返回加密;
}
函数2(数据){
const cipher=crypto.createCipheriv(算法,缓冲区,从(密钥),iv);
let encrypted=cipher.update(数据);
encrypted=Buffer.concat([encrypted,cipher.final()]);
返回加密的.toString('hex');
}
const result1=encrypt1(数据);
const result2=encrypt2(数据);
log('result1:',result1);//->result1:501db5c82e79e3185c1601
log('result2:',result2);//->result2:501db5c82e79e3185c1601

那么,为什么要使用看起来更复杂的缓冲区来产生相同的结果呢?

缓冲区就是使用的内部结构

以下是一些可能的优势:

  • 缓冲器可将字节存储在机器字(32或64位)中,以使后续操作有效
  • 不需要在缓冲区和其他表示之间来回转换
  • 它也可能比字符串中的字符存储更有效-可能不清楚存储这些字符的确切方式,即使它们只是表示字节(它们可以使用16或32位字,例如,将所需大小加倍或四倍)
  • 如果存在转换错误,也可能在显式转换函数中而不是在加密方法中检测到,这有利于调试
  • 这样可以更容易地更改代码,例如使用不同编码的密钥,例如十六进制
最后,
缓冲区
更接近于键实际上应该是八位字节字符串或字节数组,而不是文本字符串


然而,所有这些都表明,对于简单的加密操作,在预期的输出方面没有差异。因此,从这个意义上说,这两种方法都是有效的。

我模糊地记得,
+=
操作符曾经有过一个问题,但我不再确定。无论如何,如果用两个相同的val替换随机值,会发生什么这两个代码段的用法?如果它们相同,那么这就是你的答案。@MaartenBodewes我已经更新了帖子。太好了,省去了我再次设置JS环境的麻烦:)我想我们现在可以删除你问题下面的注释了。