gpt4 book ai didi

node.js - 由于 crypto.DEFAULT_ENCODING ='binary', Node 6 升级导致 aws-sdk 出现 SignatureDoesNotMatch 错误

转载 作者:太空宇宙 更新时间:2023-11-03 22:25:53 26 4
gpt4 key购买 nike

我已从 Node 4 移至 Node 6,这导致使用 aws-sdk 的任何内容返回以下错误消息:

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' 

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

最佳答案

查看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 或将其设置为“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')): ®?åõp~óçÁ

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

关于node.js - 由于 crypto.DEFAULT_ENCODING ='binary', Node 6 升级导致 aws-sdk 出现 SignatureDoesNotMatch 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46522618/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com