2 votes

Toutes les implémentations de PBKDF2 doivent-elles générer la même clé à partir d'une entrée identique ?

Je suis en train de changer les algorithmes de hachage de mon application node.js à partir de l'algorithme basé sur JS CryptoJS à l'implémentation de la crypto mise en œuvre.

Voici ma mise en œuvre :

var password = "password1";
var salt = generateSalt();
var iterations = 4000;
var keySize = 768/32;
var cryptoJSKey = CryptoJS.PBKDF2(password, salt, { "iterations": iterations , "keySize": keySize });
// base64 encoded key
cryptoJSKey = cryptoJSKey.toString(CryptoJS.enc.Base64);

require("crypto").pbkdf2( password, salt, iterations, keySize, function(err, derivedKey){
    var nodeCryptoKey = new Buffer( derivedKey, "binary" ).toString( "base64" );

    console.log( cryptoJSKey == nodeCryptoKey ); // always false!
});

Une chose que j'ai remarquée est que nodeCryptoKey finit par être 32 et la clé cryptoJSKey a une longueur de 10 caractères. 192 . Si j'augmente le keySize pour seulement le nœud crypto version à 144 ( keySize * 6 ), la clé finit par être 192 caractères longs également - bien que ce soit toujours différent.

Est-ce que je fais quelque chose de mal ou est-ce que les implémentations sont simplement différentes les unes des autres ?

5voto

David Murdoch Points 28521

On dirait que j'ai trouvé la solution.

Dans le script de PBKDF2.js enroulé dans "CryptoJS v3.0.2.zip" (le téléchargement actuel) CryptoJS.enc.Base64 est undefined ; c'était probablement voulu, mais je ne l'ai pas remarqué.

Je comparais la sortie encodée en Base64 de node à la sortie hexagonale de CryptoJS.

Un autre problème est que les tailles de clé ne sont pas compatibles entre CryptoJS et node.js. Node a besoin de keySize * 4 afin de produire une clé identique. Je ne suis pas familier avec ce qui se passe sous le capot dans l'un ou l'autre cas, mais je vais supposer que c'est voulu.

La documentation du PBKDF2 de Node.js est plutôt rare ; elle indique toutefois que son paramètre "key" est nommé keylen qui est en octets (ou en bits ? Je ne suis pas sûr).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X