Я перехожу к алгоритмам хэширования приложения node.js из реализации CryptoJS на основе JS к собственной реализации crypto узла.Должны ли все реализации PBKDF2 генерировать один и тот же ключ от идентичного ввода?
Вот моя реализация:
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!
});
Одна вещь, которую я заметил, что nodeCryptoKey
заканчивает тем, что длинные 32
символов и cryptoJSKey является 192
. Если я увеличиваю keySize
только для версии crypto
узла только 144
(keySize * 6
), то ключ заканчивается тем же, что и 192
символов, хотя он по-прежнему отличается.
Я делаю что-то не так, или реализации просто отличаются друг от друга?
Ваш код вызывает 'require (" crypto "). Pbkdf (' не должно быть 'require (" crypto ") .pbkdf2 ('? Обратите внимание на '2'. Я думаю, что результаты от версии 1 и версия 2 из PBKDF будет отличаться. –
Вы правы. Это была просто опечатка в вопросе. Спасибо :-) –