9

私は NodeJs にまったく慣れておらず、「crypto」モジュールの使用方法を理解しようとしています。それをいじっていると、NodeJs と crypto-js の「crypto」モジュールの違いに気付きました。

crypto-js を使用すると、次のことができます。

function SHA256Hash(password, salt, iteration) {
    var saltedpassword = salt + password;
    var sha256 = CryptoJS.algo.SHA256.create();
    for(var i = 0; i < iteration; i++) {
            alert("saltedpassword = " + saltedpassword);
            sha256.update(saltedpassword);
            var saltedpassword = sha256.finalize();
            sha256.reset();
    }       
    return saltedpassword.toString(CryptoJS.enc.Base64);
}

次に呼び出します:

var hashedPassword = SHA256Hash("123456789", "ASIN", 3)

そして受け取る:

saltedpassword = ASIN123456789
saltedpassword = 3362d80b757d14bfe18c01f6a003ed38a3a4a3dcab0417efb457b71740e21411
saltedpassword = 6020c992a9b7cd3ca9e95b9a3e21b64911edb7983b3dd77bdcecda19f2756987

「crypto」モジュールを使用して、次のように書きました。

function SHA256Hash(password, salt, iteration) {
    var saltedpassword = salt + password;
    for(var i = 0; i < iteration-1; i++) { 
            console.log("saltedpassword = "+saltedpassword)
            var sha256 = crypto.createHash('sha256');
            sha256.update(saltedpassword);
            var saltedpassword = sha256.digest('hex');
    }       
    console.log("saltedpassword = "+saltedpassword)
    var sha256 = crypto.createHash('sha256');
    sha256.update(saltedpassword);
    return sha256.digest('base64');
}

次に呼び出します。

var hashedPassword = SHA256Hash("123456789", "ASIN", 3);

そして受け取ります:

saltedpassword = ASIN123456789
saltedpassword = 3362d80b757d14bfe18c01f6a003ed38a3a4a3dcab0417efb457b71740e21411
saltedpassword = 4795d40ae8ae797f0ce51dfe4b496bca68f6d1f4a264f4ca52348ddd65a2988d

最初の 2 つの項目は同じですが、3 番目の項目は異なります。私は何かを逃しましたか?

編集済み: Jasypt と比較すると、CryptoJs は同様のキーを生成します。私の質問は、「crypto」モジュールを調整して、CryptoJS や Jasypt と同じキーを生成する方法です。

4

4 に答える 4

3

どうやら私はフリークの答えにコメントを追加できないので、代わりにここに書きます:

reset() は正常に動作します。大きな違いは、反復ループ内でハッシュ出力を 16 進文字列に変換していることです。

于 2012-12-26T02:25:27.823 に答える
1

cryptojs の例では、finalize() は生のバイナリ データを返します。暗号モジュールの例では、digest() は 16 進文字列を返しています。出力の違いは、繰り返し再ハッシュしたときの入力の違いを意味します。

于 2012-12-26T01:20:39.853 に答える
0

私はいくつかのテストを行いましたが、明らかにこのreset関数 ( crypto-js 内) が台無しです。それが何をするのかわからず、問題を探すのに十分な忍耐力がありません。:) ただし、これが実際の解決策です。

function SHA256Encrypt(password, salt, iteration) {
    var saltedpassword = salt + password;
    for(var i = 0; i < iteration-1; i++) {
        alert("saltedpassword = " + saltedpassword);
        saltedpassword = CryptoJS.SHA256( saltedpassword ).toString( CryptoJS.enc.Hex );
    }
    saltedpassword = CryptoJS.SHA256( saltedpassword );
    return saltedpassword.toString(CryptoJS.enc.Base64);
}

これにより、両方のコードがさらに類似したものになり、これは良いことです。

于 2012-12-13T11:35:01.893 に答える