2012-06-29 2 views
2

Я перехожу к алгоритмам хэширования приложения 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 символов, хотя он по-прежнему отличается.

Я делаю что-то не так, или реализации просто отличаются друг от друга?

+0

Ваш код вызывает 'require (" crypto "). Pbkdf (' не должно быть 'require (" crypto ") .pbkdf2 ('? Обратите внимание на '2'. Я думаю, что результаты от версии 1 и версия 2 из PBKDF будет отличаться. –

+0

Вы правы. Это была просто опечатка в вопросе. Спасибо :-) –

ответ

4

Похоже, я понял.

В скрученном скрипте PBKDF2.js в «CryptoJS v3.0.2.zip» (в настоящее время загружается) CryptoJS.enc.Base64 is undefined; это, вероятно, было предназначено, но не то, что я заметил.

Я сравнивал вывод Base64 с кодировкой узла с шестнадцатеричным выходом CryptoJS.

Еще одно предостережение заключалось в том, что keySizes несовместимы между CryptoJS и node.js. Для вывода идентичного ключа для узла требуется keySize * 4. Я не знаком с тем, что происходит под капотом в любом случае; но я просто предполагаю, что это предназначено.

Документация Node.js PBKDF2 довольно скудна; он, однако, говорит, что его «ключевой» параметр называется keylen, который находится в байтах (или это бит? Я не уверен).

+1

Только что посмотрел документ NodeJS в криптографических «пакетах», я не думаю, что есть много чего знать Конечно, он еще реже, чем страницы PHP. –

 Смежные вопросы

  • Нет связанных вопросов^_^