2016-06-25 135 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