2

node.js のアプリケーションのハッシュ アルゴリズムを、JS ベースのCryptoJS実装からノード独自の暗号実装に切り替えています。

これが私の実装です:

var password = "password1";
var salt = generateSalt();
var iterations = 4000;
var keySize = 768/32;
var cryptoJSKey = CryptoJS.PBKDF2(password, salt, { "iterations": iterations , "keySize": keySize });
// base64 encoded key
cryptoJSKey = cryptoJSKey.toString(CryptoJS.enc.Base64);

require("crypto").pbkdf2( password, salt, iterations, keySize, function(err, derivedKey){
    var nodeCryptoKey = new Buffer( derivedKey, "binary" ).toString( "base64" );

    console.log( cryptoJSKey == nodeCryptoKey ); // always false!
});

私が気づいたことの 1 つは、最終的nodeCryptoKey32文字数になり、cryptoJSKey が192. keySizefor only ノードのcryptoバージョンを144( )に増やすとkeySize * 6、キーも192文字数になりますが、それでも異なります。

私は何か間違ったことをしていますか、それとも実装が互いに異なるだけですか?

4

1 に答える 1

5

私はそれを理解したように見えます。

「CryptoJS v3.0.2.zip」(現在ダウンロード中)にまとめられた PBKDF2.js スクリプトCryptoJS.enc.Base64undefined; これはおそらく意図されたものですが、私が気付いたものではありません。

ノードのBase64でエンコードされた出力をCryptoJSの16進出力と比較していました。

もう 1 つの注意点は、CryptoJS と node.js の間で keySizes に互換性がないことです。ノードはkeySize * 4、同一のキーを出力するために必要です。どちらの場合も、ボンネットの下で何が起こっているのかよくわかりません。しかし、私はそれが意図されていると仮定します.

Node.js の PBKDF2 のドキュメントはほとんどありません。ただし、「キー」パラメーターの名前keylenは であり、バイト単位です (またはビットですか?よくわかりません)。

于 2012-06-29T21:45:23.717 に答える