我将一些代码从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.toString('binary'));
hash.update('Hello world');
console.log(hash.digest('base64'));
为什么每个版本的输出都不同。节点v4答案是正确的,因为我们已经使用它多年。
答案 0 :(得分:2)
为了让您的代码正常工作,我不确定您是否已经意识到它,而只是使用原始缓冲区。
const hash = crypto.createHmac('sha256', buf);
在加密库中提到
这是因为很多函数都没有接受二进制字符串 旧版本节点中的任何显式编码,我们都不想要 不必要地打破他们。
https://github.com/nodejs/node/blob/449d60df1c11935d50e30bcad2a9ff4f5b4e955b/lib/crypto.js#L30
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;
现在它
https://github.com/nodejs/node/blob/master/lib/internal/crypto/util.js#L38
function toBuf(str, encoding) {
if (typeof str === 'string') {
if (encoding === 'buffer' || !encoding)
encoding = 'utf8';
return Buffer.from(str, encoding);
}
return str;
}
对于hmac,toBuf
只能使用键调用,因此如果编码为undefined
并且您提供了字符串,那么之前您会得到new Buffer(str,"binary")
,而现在您获得了Buffer.from(str,"utf8")
以下提交提到了这些更改,我不确定为什么评论保持不变但更换了utf。 https://github.com/nodejs/node/commit/b010c8716498dca398e61c388859fea92296feb3