2015-12-06 1 views
1

J'utilise Node.js pour générer un hachage de mot de passe en utilisant pbkdf2 et les stocker dans la base de données. De plus, je crée des pages web avec php qui permettent à l'utilisateur de réinitialiser son mot de passe, donc à moins que j'utilise un service web dans node.js pour construire le hachage, j'aimerais que l'algorithme fonctionne dans les 2 systèmes. Malheureusement, il semble que j'obtiens des résultats différents et je ne suis pas capable de mélanger les deux bibliothèques. Le code que j'utilise dans node.js utilise le module password-hash-and-salt qui appelle fondamentalement crypto.pbkdf2, alors que php utilise hash_pbkdf2.Différences dans pbkdf2 entre php et node.js

Ce sont les scripts que je utilise pour le tester:

PHP:

<?php 
$password = $argv[1]; 
$iterations = 10000; 
$length = 64; 

$salt = mcrypt_create_iv($length, MCRYPT_DEV_URANDOM); 
$key = hash_pbkdf2("sha256", $password, $salt, $iterations, $length,true); 
echo "HASH: pbkdf2\\$" . $iterations . "\\$" . bin2hex($key) . "\\$" . bin2hex($salt). "\n"; 

echo "Key length: " . strlen(bin2hex($key)) . "\n"; 
echo "Hash length: " . strlen(bin2hex($salt)) . "\n"; 

?> 

Node.js:

var crypto = require('crypto'); 
var request = require('request'); 
var hasher = require('password-hash-and-salt'); 

if (process.argv[2] == 'generate') { 
    var password = process.argv[3]; 
    console.log("Generating hash for password " + password); 
    hasher(password).hash(function(err, hash) { 
     if (err) { 
      console.log(err); 
     } else { 
      console.log("Result: " + hash); 
     } 
    }); 
} else { 
    var password = process.argv[3]; 
    var hash = process.argv[4]; 
    console.log("Testing " + password + " against " + hash); 
    hasher(password).verifyAgainst(hash, function(error, verified) { 
     if (error) console.log(error); 
     else { 
      console.log("Verification result: " + verified); 
     } 
    }); 
} 

Node.js LIB PARTIE:

var calcHash = function() { 
       crypto.pbkdf2(password, salt, iterations, 64, function(err, key) { 
        if(err) 
         return callback(err); 
        var res = 'pbkdf2$' + iterations + 
           '$' + key.toString('hex') + 
           '$' + salt.toString('hex'); 
        callback(null, res); 
       })  
      }; 

      if(!salt) { 
       crypto.randomBytes(64, function(err, gensalt) { 
        if(err) 
         return callback(err); 
        salt = gensalt; 
        calcHash(); 
       });  
      } else { 
       calcHash(); 
      }   
Quelqu'un peut-il me dire ce que je fais?

faux ou que les algorithmes sont incompatibles?

Merci!

+0

Vous pouvez essayer mes vecteurs de test PBKDF2 sur https://github.com/Anti-weakpasswords/PBKDF2-Test-Vectors afin de voir si les mêmes valeurs dans les deux donnent la même sortie (ou même dire quelle fonction ils ' re en utilisant, puisque j'ai des résultats pour une variété de HMAC). –

Répondre

2

Le NodeJS PBKDF2 utilise par défaut SHA-1, ce qui devrait expliquer les différences.

Je vous encourage fortement à utiliser directement les fonctions NodeJS PBKDF2. Votre wrapper JS (que vous ne liez pas) l'utilise aussi, c'est un peu plus qu'un petit wrapper lib.

+0

J'ai mis à jour la question avec la partie js pertinente. Je vais vérifier si cela fonctionne avec sha-1 –

+0

vous aviez raison, après avoir changé le code php pour utiliser sha-1 tout fonctionne bien. Merci beaucoup ! –