由于crypto.DEFAULT_ENCODING ='binary',节点6升级导致aws-sdk的SignatureDoesNotMatch错误。

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

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

看看代码,这似乎是由我的代码调用encryption来创build和validation散列和集合

crypto.DEFAULT_ENCODING = 'binary' 

如果我从“二进制”更改为“缓冲区”(这是默认),aws-sdk的作品,但我的代码无法validation旧哈希值。

这是用来创build和检查散列的代码:

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

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

有没有办法使用二进制编码仅用于这种encryption方法,而不会影响aws-sdk?

如果没有的话,是否有一种方法可以将使用“缓冲”编码的pbkdf2产生的散列转换为使用“二进制”编码时产生的散列?

看看这里find的crypto.pbkdf2源代码。 如果DEFAULT_ENCODINGvariables没有设置为“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或者把它设置为“buffer”,然后对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')):???????

密钥(二进制):???????