2016-06-25 24 views
1

Ich versuche Symfony's MessageDigestPasswordEncoder im Browser neu zu erstellen.Knoten Crypto Key Ableitung von einem Passwort erzeugt unterschiedliche Ergebnisse mit browserify

Ich habe ein Problem mit browserify und crypto-Modul. Ich versuche, Hash mit JavaScript aber ohne Knoten zu generieren.

Hier ist mein Code mit Knoten:

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

Es gibt:

qmNs3bqtTeoS4uRq2Chh1fUNPu+lzn3KR7mWFHAq5NEPrK0QZ9XkLDUniZ39uosnozNrPL7mByzUZ/A19Io4sQ== 

Nun, ich brauche zu implementieren dieser Knoten ohne Berücksichtigung ich browserify

verwendet
browserify index.js > crypto.js 

I erstellt eine Testseite und enthalten:

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

Die Konsole Protokollausgabe ist:

JtDIZwGDybG6tG7PE2SeXS0BEa4vOoxpu3y7Il6P6OQL9djmrk5S0vjTGoQowGO22OvQ58tC05eZBt/yvyJv+A== 

Jede Idee, warum ich habe zwei unterschiedliche Ergebnisse?

Gibt es sonst eine Möglichkeit, dasselbe Ergebnis in reinem JS (ohne Knoten) zu erhalten?

+0

Sie könnten beginnen, einige standardisierte Schema wie PBKDF2 statt rollen Sie Ihre eigenen verwenden. Ich vermute, dass das Problem etwas mit dem '' binary' 'in 'hash.digest (' binary ')' zu tun hat. Wie auch immer, SJCL bietet eine schnelle PBKDF2-Implementierung sowie das crypo-Modul von node.js. –

+0

Vielen Dank, aber ich versuche, den Weg zu reproduzieren [Symfony verschlüsselt Passwort] (http://api.symfony.com/3.0/Symfony/Component/Security/Core/Encoder/MessageDigestPasswordEncoder.html). Daher kann ich PBKDF2 nicht verwenden. – Decap

Antwort

1

Ich weiß nicht, was das Problem mit dem Browser-Code ist, aber das Folgende ist eine CryptoJS-Implementierung von 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

Vielen Dank, es funktioniert perfekt! – Decap