2016-06-25 1 views
1

J'essaye de recréer Symfony's MessageDigestPasswordEncoder dans le navigateur.la dérivation d'une clé de chiffrement à partir d'un mot de passe produit des résultats différents avec browserify

J'ai un problème avec browserify et le module crypto. J'essaie de générer du hash avec JavaScript mais sans Node.

Voici mon code avec nœud:

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

Il retourne:

qmNs3bqtTeoS4uRq2Chh1fUNPu+lzn3KR7mWFHAq5NEPrK0QZ9XkLDUniZ39uosnozNrPL7mByzUZ/A19Io4sQ== 

Maintenant, étant donné que je dois mettre en œuvre ce sans nœud, je browserify

browserify index.js > crypto.js 

I créé une page de test et comprend:

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

La sortie du journal de la console est:

JtDIZwGDybG6tG7PE2SeXS0BEa4vOoxpu3y7Il6P6OQL9djmrk5S0vjTGoQowGO22OvQ58tC05eZBt/yvyJv+A== 

Toute idée pourquoi j'ai deux résultats différents?

Sinon, existe-t-il un moyen d'obtenir le même résultat en JS pur (sans nœud)?

+0

Vous pouvez commencer à utiliser un certain système standardisé, comme PBKDF2 au lieu de rouler votre propre. Je pense que le problème a quelque chose à voir avec le '' binary'' dans 'hash.digest ('binary')'. Quoi qu'il en soit, SJCL fournit une implémentation rapide de PBKDF2 ainsi que le module crypo de node.js. –

+0

Merci, mais j'essaie de reproduire la façon dont [Symfony chiffre le mot de passe] (http://api.symfony.com/3.0/Symfony/Component/Security/Core/Encoder/MessageDigestPasswordEncoder.html). Par conséquent, je ne peux pas utiliser PBKDF2. – Decap

Répondre

1

Je ne sais pas quel est le problème avec le code navigué, mais ce qui suit est une implémentation CryptoJS de 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

Merci beaucoup cela fonctionne parfaitement! – Decap