2 Stimmen

Sollten alle Implementierungen von PBKDF2 den gleichen Schlüssel aus identischen Eingaben erzeugen?

Ich wechsle den Hashing-Algorithmus meiner node.js-Anwendung von der JS-basierten CryptoJS Implementierung auf die knoteneigene Krypto Umsetzung.

Hier ist meine Umsetzung:

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!
});

Eine Sache, die mir aufgefallen ist, ist, dass nodeCryptoKey ist am Ende 32 Zeichen lang und der cryptoJSKey ist 192 . Wenn ich die keySize nur für die Knoten crypto Version zu 144 ( keySize * 6 ) lautet der Schlüssel schließlich 192 Zeichen lang - und doch ist es anders.

Mache ich etwas falsch oder unterscheiden sich die Implementierungen nur voneinander?

5voto

David Murdoch Punkte 85120

Sieht aus, als ob ich es herausgefunden hätte.

In dem aufgerollten PBKDF2.js-Skript in "CryptoJS v3.0.2.zip" (dem aktuellen Download) CryptoJS.enc.Base64 est undefined Dies war wahrscheinlich beabsichtigt, ist mir aber nicht aufgefallen.

Ich habe die Base64-kodierte Ausgabe von node mit der Hex-Ausgabe von CryptoJS verglichen.

Ein weiterer Vorbehalt war, dass die keySizes zwischen CryptoJS und node.js nicht kompatibel sind. Node braucht keySize * 4 um einen identischen Schlüssel auszugeben. Ich weiß nicht, was in beiden Fällen unter der Haube vor sich geht, aber ich nehme einfach an, dass das beabsichtigt ist.

Die PBKDF2-Dokumentation von Node.js ist ziemlich dürftig; sie besagt jedoch, dass der "Schlüssel"-Parameter den Namen keylen die in Bytes (oder sind es Bits? Ich bin mir nicht sicher) angegeben ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X