【问题标题】:Node 6 upgrade caused SignatureDoesNotMatch errors from aws-sdk because of crypto.DEFAULT_ENCODING='binary'由于 crypto.DEFAULT_ENCODING='binary',节点 6 升级导致来自 aws-sdk 的 SignatureDoesNotMatch 错误
【发布时间】:2017-10-02 09:10:19
【问题描述】:

我已从节点 4 移动到节点 6,这导致使用 aws-sdk 的任何操作返回以下错误消息:

SignatureDoesNotMatch:我们计算的请求签名与您提供的签名不匹配。检查您的 AWS 秘密访问密钥和签名方法。有关详细信息,请参阅服务文档。

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

 crypto.DEFAULT_ENCODING = 'binary' 

如果我将它从“二进制”更改为“缓冲区”(这是默认设置),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 使用“缓冲区”编码生成的哈希转换为使用“二进制”编码时会生成的哈希?

【问题讨论】:

    标签: node.js hash aws-sdk cryptojs


    【解决方案1】:

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

     // 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~óçÁ

    密钥(二进制):®?åõp~óçÁ

    【讨论】:

      猜你喜欢
      • 2016-10-12
      • 1970-01-01
      • 2019-01-01
      • 2018-08-26
      • 2020-05-02
      • 1970-01-01
      • 2015-07-06
      • 2014-12-31
      • 1970-01-01
      相关资源
      最近更新 更多