Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript nodeJS缓冲区和加密库为不同版本提供了不同的答案_Javascript_Node.js_Cryptography_Buffer - Fatal编程技术网

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

Javascript 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

我正在将一些代码从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'));

为什么每个版本的输出都不同。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;
}