2014-08-27 4 views
1

Я пытаюсь выяснить, как проверить пароль во время входа в систему при использовании PBKDF2. Я использую PHP, поэтому вот базовый код генерации пароля:PBKDF2 хранение паролей - как проверить?

$salt = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM); 
echo hash_pbkdf2('sha256', 'password', $salt, 1000, 32); 

Я сохранил этот хешированный пароль в базе данных. Я не знаю, как проверить этот пароль на вход входа, поскольку у меня нет соли, и соль генерируется случайным образом для каждого пользователя. Как я могу «извлечь» соль из сохраненного пароля, добавить его к введенному паролю и проверить результат на сохраненный пароль?

+1

Не можете ли вы использовать ['password_hash'] (http://php.net/manual/en/function.password-hash.php)? Если вы не используете PHP 5.5, существует [эквивалентная реализация] (https://github.com/ircmaxell/password_compat), которую вы можете использовать с любой версией> = 5.3.7. – Jon

+0

Спасибо, я не знал, существует ли это ... – Gasim

ответ

3

Вы должны хранить соль вместе с хэш, например:

$hash = $salt . '|' . hash_pbkdf2(.., .., $salt, ..); 

Вы можете потом извлечь соль из нее снова и кормить его обратно в алгоритм проверки. Фактически, вы должны сделать это со всеми соответствующими входными параметрами для хэша (за исключением самого пароля, очевидно), чтобы позволить вам поменять ваш алгоритм позже по мере необходимости, все еще имея возможность проверять уже хэшированные пароли:

$hash = $algo . '|' . $salt . '|' . $rounds . '|' . hash_pbkdf2($algo, .., $salt, $rounds, ..); 

Фактически, вы должны использовать API crypt, который уже делает это так.

Но на самом деле, вы должны использовать password_hash, который является удобной оболочкой вокруг crypt, которая гарантирует, что вы сделаете это правильно.

+0

Я понимаю это полностью, но есть одна вещь, которую я просто не получаю в этой системе ... В чем смысл использования соли, если мы разоблачим ее притворяясь хешем? – Gasim

+3

Точка соли не должна быть секретной, она только делает хэш уникальным. – deceze

+0

Привет, @deceze, мне также интересно, как я могу реализовать этот тип хэширования паролей в веб-приложении, которое я создаю, но он пока не получил каких-либо данных, не заботясь о том, чтобы взглянуть? Вышеприведенный комментарий кажется почти идеальным решением моего вопроса, я просто не уверен, почему он не будет выводиться так, как ожидалось. – mhvvzmak1

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