2016-06-25 66 views
1

我試圖在瀏覽器中重新創建Symfony's MessageDigestPasswordEncoder節點加密密鑰從密碼派生產生與browserify不同的結果

我對browserify和crypto模塊有一些問題。 我嘗試使用JavaScript生成哈希,但沒有節點。

這裏是我的代碼以節點:

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")); 

它返回:

qmNs3bqtTeoS4uRq2Chh1fUNPu+lzn3KR7mWFHAq5NEPrK0QZ9XkLDUniZ39uosnozNrPL7mByzUZ/A19Io4sQ== 

現在,考慮到我需要實現這一點沒有節點,我用browserify

browserify index.js > crypto.js 

我創建了一個測試頁面,其中包括:

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

控制檯日誌輸出是:

JtDIZwGDybG6tG7PE2SeXS0BEa4vOoxpu3y7Il6P6OQL9djmrk5S0vjTGoQowGO22OvQ58tC05eZBt/yvyJv+A== 

爲什麼我有兩個不同的結果,任何想法?

否則,有沒有辦法在純JS(無節點)中獲得相同的結果?

+0

你可以如PBKDF2而不是滾動您自己開始使用一些標準化的方案。我懷疑這個問題與hash.digest('binary')'中的''binary''有關。無論如何,SJCL提供了一個快速的PBKDF2實現以及node.js的crypo模塊。 –

+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