2016-06-25 3 views
1

ブラウザにSymfony's MessageDigestPasswordEncoderを再作成しようとしています。パスワードからの暗号鍵の派生により、ブラウザで異なる結果が表示される

browserifyとcryptoモジュールに問題があります。 JavaScriptを使用して、ノードを使用せずにハッシュを生成しようとしています。私はbrowserify

browserify index.js > crypto.js 

Iを使用し、

qmNs3bqtTeoS4uRq2Chh1fUNPu+lzn3KR7mWFHAq5NEPrK0QZ9XkLDUniZ39uosnozNrPL7mByzUZ/A19Io4sQ== 

を今、私はノードなしでこれを実装する必要があります考慮:

var crypto = require('crypto'); 
var encodePassword = function (raw, salt) { 
    var salted = raw + '{'+salt+'}', 
     hash = crypto.createHash('sha512').update(salted, 'utf-8'); 

    for (var i = 1; i < 5000 ; i++) { 
     hash = crypto.createHash('sha512').update(hash.digest('binary')+salted); 
    } 

    return hash.digest('base64'); 
}; 

console.log(encodePassword("admin", "81b6zjhf64w8kogsgkgw804ss8gc0w0")); 

それが返されます。ここ

は、ノードとの私のコードですテストページを作成しました。

<script src="crypto.js"></script> 

コンソールログ出力は次のようになります。

JtDIZwGDybG6tG7PE2SeXS0BEa4vOoxpu3y7Il6P6OQL9djmrk5S0vjTGoQowGO22OvQ58tC05eZBt/yvyJv+A== 

私は2つの異なる結果を持っている理由についての任意のアイデア?

それ以外の場合、純粋なJS(ノードなし)で同じ結果を得る方法はありますか?

+0

あなたは代わりに、独自の圧延などPBKDF2など、いくつかの標準化されたスキームを使用して開始することができます。私は問題がhash.digest( 'binary')の '' binary ''と関係があると考えています。とにかく、SJCLはnode.jsのcrypoモジュールだけでなく、高速のPBKDF2実装を提供します。 –

+0

ありがとうございます。私は方法を再現しようとしています[Symfonyはパスワードを暗号化します](http://api.symfony.com/3.0/Symfony/Component/Security/Core/Encoder/MessageDigestPasswordEncoder.html)。したがって、PBKDF2は使用できません。 – Decap

答えて

1

ブラウザー化されたコードの問題点はわかりませんが、以下はCryptoJSの実装Symfonys MessageDigestPasswordEncoderです。

/** 
 
* Encodes a password according to Symfonys MessageDigestPasswordEncoder 
 
* @param password String 
 
* @param salt String 
 
* @param base64 Boolean (default: false) If false, then the result is Hex-encoded 
 
* @param hasher Optional Hasher (default: CryptoJS.algo.SHA512) 
 
* @param iterations Optional Integer (default: 5000) 
 
* @returns {String} Iterated and salted hash of a password 
 
*/ 
 
function encodePassword(password, salt, base64, hasher, iterations) { 
 
    hasher = hasher || CryptoJS.algo.SHA512; 
 
    iterations = iterations || 5000; 
 
    hasher = hasher.create(); 
 
    salt = password + "{" + salt + "}"; 
 
    var digest = hasher.finalize(salt); 
 
    for (var i = 1; i < iterations; i++) { 
 
    hasher.reset(); 
 
    hasher.update(digest); 
 
    digest = hasher.finalize(salt); 
 
    } 
 
    if (base64) { 
 
    return digest.toString(CryptoJS.enc.Base64); // Base64-encoded string 
 
    } 
 
    return digest.toString(); // Hex-encoded string 
 
} 
 

 
output.innerHTML = encodePassword("admin", "81b6zjhf64w8kogsgkgw804ss8gc0w0", true);
<script src="https://cdn.rawgit.com/CryptoStore/crypto-js/3.1.2/build/rollups/sha512.js"></script> 
 
<script src="https://cdn.rawgit.com/CryptoStore/crypto-js/3.1.2/build/components/enc-base64-min.js"></script> 
 
<div id="output"></div>

+0

ありがとう、それは完璧に動作します! – Decap

関連する問題