nodeJS缓冲区和加密库为不同版本提供了不同的答案

时间:2018-01-10 16:01:06

标签: 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.toString('binary'));
hash.update('Hello world');
console.log(hash.digest('base64'));

为什么每个版本的输出都不同。节点v4答案是正确的,因为我们已经使用它多年。

1 个答案:

答案 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