密码的节点加密密钥派生与browserify产生不同的结果

时间:2016-06-25 10:24:56

标签: javascript node.js cryptography browserify node-crypto

我正在尝试在浏览器中重新创建Symfony's MessageDigestPasswordEncoder

我在使用browserify和crypto模块时遇到了一些问题。 我尝试用JavaScript生成哈希但没有Node。

这是我的节点代码:

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(没有节点)中获得相同的结果?

1 个答案:

答案 0 :(得分:1)

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

&#13;
&#13;
/**
 * 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);
&#13;
<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>
&#13;
&#13;
&#13;