Javascript nodeJS缓冲区和加密库为不同版本提供了不同的答案
我正在将一些代码从node.v4迁移到node.v8Javascript nodeJS缓冲区和加密库为不同版本提供了不同的答案,javascript,node.js,cryptography,buffer,Javascript,Node.js,Cryptography,Buffer,我正在将一些代码从node.v4迁移到node.v8 const crypto = require('crypto'); var Buffer = require('buffer').Buffer const buf = Buffer.from('4DB79D009E6E0F59BC67879BDE67F4CDD9E2582794F80CFFF30321C2BDF85CCD', 'hex'); const hash = crypto.createHmac('sha256', buf.to
const crypto = require('crypto');
var Buffer = require('buffer').Buffer
const buf =
Buffer.from('4DB79D009E6E0F59BC67879BDE67F4CDD9E2582794F80CFFF30321C2BDF85CCD', 'hex');
const hash = crypto.createHmac('sha256', buf.toString('binary'));
hash.update('Hello world');
console.log(hash.digest('base64'));
为什么每个版本的输出都不同。node v4的答案是正确的,因为我们已经使用它很多年了 为了让代码正常工作,我不确定您是否已经意识到了这一点,只需使用原始缓冲区即可
const hash = crypto.createHmac('sha256', buf);
在加密库中,它提到
这是因为许多函数接受二进制字符串而不使用
在旧版本的node中使用任何显式编码,我们不希望
不必要地破坏它们
现在是
对于hmac,toBuf
只能用key调用,所以如果编码是未定义的
并且您提供了一个字符串,那么以前您会得到新缓冲区(str,“binary”)
,而现在您得到缓冲区。from(str,“utf8”)
下面的commit提到了这些更改,我不确定为什么注释保持不变,但替换了utf 因此,修复方法就是删除
.toString('binary')
,并直接使用缓冲区?是的,但这不是问题所在,但是,我在回答的开头将其作为一个编辑。如果您包括每个的输出,那么我们可以针对其他运行时进行测试。
function toBuf(str, encoding) {
encoding = encoding || 'binary';
if (typeof str === 'string') {
if (encoding === 'buffer')
encoding = 'binary';
str = new Buffer(str, encoding);
}
return str;
}
exports._toBuf = toBuf;
function toBuf(str, encoding) {
if (typeof str === 'string') {
if (encoding === 'buffer' || !encoding)
encoding = 'utf8';
return Buffer.from(str, encoding);
}
return str;
}