2016-07-25 4 views
0

Я пытаюсь получить Node.JS Crypto PBKDF2, чтобы сопоставить такое же значение с PHP Crypto PBKDF2. По какой-то причине это не то же самое.PHP и Node.JS - Crypto PBKDF2

В JavaScript

const crypto = require('crypto'); 
crypto.pbkdf2('secret', 'salt', 100000, 20, 'sha512', (err, key) => { 

    console.log(key.toString()); 
}); 

Выход: 7E������]�9��J]�i

В PHP

$password = "secret"; 
$iterations = 100000; 
$salt = "salt"; 

$hash = hash_pbkdf2("sha512", $password, $salt, $iterations, 20); 
echo $hash; 

Выход: 3745e482c6e0ade35da1

Почему выход JS не соответствие PHP?

ответ

1

Вы можете использовать опцию raw_output метода hash_pbkdf2 в PHP и сравнить их base64

В PHP

<?php 
$password = "secret"; 
$iterations = 100000; 
$salt = "salt"; 

$hash = hash_pbkdf2("sha512", $password, $salt, $iterations, 20, true); 
echo base64_encode($hash); 
?> 

Live example

В NodeJS

const crypto = require('crypto'); 
crypto.pbkdf2('secret', 'salt', 100000, 20, 'sha512', (err, key) => { 
console.log(new Buffer(key).toString('base64')); 
}); 
+0

Спасибо, это похоже на работу! Можно ли что-то сделать с помощью пароля_hash() в JavaScript? –

+0

Добро пожаловать. Что вы хотите делать с password_hash()? –

+0

Когда хэш генерируется через password_hash(), то в JS должен быть проверен пароль против хэша, созданный на PHP. –

0

Строка PHP находится в шестнадцатеричном формате. Строка Node.JS - нет.

ОБНОВЛЕНИЕ:key.toString('hex') в JS решить проблему.

Источник:https://nodejs.org/api/crypto.html#crypto_crypto_pbkdf2_password_salt_iterations_keylen_digest_callback

+0

Я попытался преобразовать в HEX, а также base64, по-прежнему не соответствует. –

+0

Я добавляю код из документации, которая должна решить вашу проблему. –

+0

Это похоже на работу, но на JS он показывает больше хэш-длины, чем PHP. На PHP '3745e482c6e0ade35da1', но на JS:' 3745e482c6e0ade35da10139e797157f4a5da669' –

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