我已经从节点4移到了节点6,这导致使用aws返回以下错误消息:
SignatureDoesNotMatch:我们计算的请求签名与您提供的签名不匹配。检查您的AWS秘密访问密钥和签名方法。有关详细信息,请参阅服务文档。
查看代码,这似乎是因为我的代码调用crypto来创建和验证散列和集合。
crypto.DEFAULT_ENCODING = 'binary' 如果我将其从“二进制”更改为“buffer”(这是默认的),aws可以工作,但我的代码无法验证旧哈希。
这是用于创建和检查散列的代码:
crypto.pbkdf2(password, salt, iterations, keysize, function (err, derivedKey) {
callback(null, [salt.toString('base64'), new Buffer(derivedKey).toString('base64')])
});看一下编码的加密文档,我不知道使用缓冲区和二进制文件有什么区别。
是否有一种方法只对此加密方法使用二进制编码,而不影响aws?
如果没有,是否有一种方法可以将pbkdf2使用“缓冲区”编码生成的散列转换为如果使用“二进制”编码就会产生的哈希?
发布于 2017-10-05 16:26:57
查看crypto.pbkdf2源代码,发现了这里。只有当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();这将产生以下结果:
密钥(缓冲器+toString(“二进制”)):? 密钥(二进制):?
https://stackoverflow.com/questions/46522618
复制相似问题