节点 6 升级导致来自 aws-sdk 的 SignatureDoesNotMatch 错误,因为 crypto.DEFAULT_ENCODING='binary'

Node 6 upgrade caused SignatureDoesNotMatch errors from aws-sdk because of crypto.DEFAULT_ENCODING='binary'

我已经从节点 4 移动到节点 6,这导致使用 aws-sdk 的任何事情 return 出现以下错误消息:

SignatureDoesNotMatch: The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.

查看代码,这似乎是由我的代码调用 crypto 来创建和验证哈希和集合引起的

 crypto.DEFAULT_ENCODING = 'binary' 

如果我将其从 'binary' 更改为 'buffer'(这是默认值),aws-sdk 可以工作,但我的代码无法验证旧哈希值。

这是用于创建和检查哈希的代码:

  crypto.pbkdf2(password, salt, iterations, keysize, function (err, derivedKey) {
      callback(null, [salt.toString('base64'), new Buffer(derivedKey).toString('base64')])
  });

查看 crypto.DEFAULT_ENCODING 的加密文档,我不确定使用缓冲区和二进制文件有什么区别。

有没有办法只对这种加密方法使用二进制编码而不影响 aws-sdk?

如果没有,是否有办法将 pbkdf2 使用 'buffer' 编码生成的散列转换为使用 'binary' 编码生成的散列?

查看 crypto.pbkdf2 源代码发现 here。 DEFAULT_ENCODING 变量仅在未设置为“buffer”(默认值)时使用。如果将其设置为其他编码,则会执行这段代码以将结果更改为所需的编码:

 // at this point, we need to handle encodings.
if (callback) {
  function next(er, ret) {
    if (ret)
      ret = ret.toString(encoding);
    callback(er, ret);
  }
  PBKDF2(password, salt, iterations, keylen, digest, next);
} else {
  var ret = PBKDF2(password, salt, iterations, keylen, digest);
  return ret.toString(encoding);
}

因此,如果您删除 DEFAULT_ENCODING 或将其设置为“缓冲区”,然后对 pbkdf2 函数的结果使用 result.toString("binary"),您应该会得到完全相同的结果,就像如以下示例所示,您正在使用 DEFAULT_ENCODING="binary"

var crypto = require("crypto");

function defaultBuffer(){
    crypto.DEFAULT_ENCODING = "buffer";
    crypto.pbkdf2(password, salt, 5, 12, function (err, derivedKey) {
        console.log("Key (Buffer + toString('binary')): "+ derivedKey.toString('binary'))
      });

}
function defaultBinary(){
    crypto.DEFAULT_ENCODING = "binary";
    crypto.pbkdf2(password, salt, 5, 12, function (err, derivedKey) {
        console.log("Key (binary): "+ derivedKey)
      });
}
var password = 'password';
var salt = 'salt';
defaultBuffer();
defaultBinary();

这会产生以下结果:

Key (Buffer + toString('binary')): ®?åõp~óçÁ

Key (binary): ®?åõp~óçÁ