ノード4からノード6に移動しましたが、これによりaws-sdkを使用すると次のエラーメッセージが返されます。
SignatureDoesNotMatch:計算したリクエストの署名が、指定した署名と一致しません。AWSシークレットアクセスキーと署名方法を確認してください。詳細については、サービスドキュメントを参照してください。
コードを調べると、これは、ハッシュとセットを作成して検証するために暗号を呼び出すコードが原因のようです
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によって生成されたハッシュを、「バイナリ」エンコーディングを使用した場合に生成されるハッシュに変換する方法はありますか?
ここにある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
か、「バッファ」に設定してから関数result.toString("binary")
の結果をpbkdf2
使用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();
これにより、次の結果が生成されます。
キー(Buffer + toString( 'binary')):®?åõp〜óçÁ
キー(バイナリ):®?åõp〜óçÁ
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加