从密码导出节点密码密钥会导致与浏览器不同的结果

我试图在浏览器中重新创buildSymfony的MessageDigestPasswordEncoder

我有一些与browserify和encryption模块的问题。 我尝试用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 

我创build了一个testing页面,其中包括:

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

控制台日志输出是:

 JtDIZwGDybG6tG7PE2SeXS0BEa4vOoxpu3y7Il6P6OQL9djmrk5S0vjTGoQowGO22OvQ58tC05eZBt/yvyJv+A== 

任何想法为什么我有两个不同的结果?

否则,有没有办法在纯JS(没有节点)获得相同的结果?

我不知道浏览器代码的问题是什么,但以下是Symfonys MessageDigestPasswordEncoder的CryptoJS实现。

 /** * 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>