2014-10-08 3 views
-1

Давайте и соль пароля с:Подтверждение пароля хэшируются и соленая с хэш password_hash

<?php 
$hash = password_hash('bonjour', PASSWORD_BCRYPT, ['cost' => 12, ]); 
// no salt option mentionned 
// then salt will be generated randomly, see password_hash documentation  
echo $hash; 
?> 

Изменения результата на каждой перезагрузки страницы, это нормально: соль генерируется случайным образом, это может быть:

$2y$12$FlxBBjTjelKkGY.SJarlL.THUZBwcl7M6V35DmZmTmYJZRwhpRkIW 
$2y$12$p2pkD116hBHNc/2nyQ2WyOkrn.h8xvWvM1.Lmvsnhms2Y6zsb.j1e 
$2y$12$u4ipdQQM926jfanpXnwtkupv2CH/uWoPvK563tG7p.z35GcOBOZdS 
etc. 

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

<?php 
echo password_verify('bonjour', '$2y$12$FlxBBjTjelKkGY.SJarlL.THUZBwcl7M6V35DmZmTmYJZRwhpRkIW') ? 'yes' : 'no'; 
// yes 
echo password_verify('bonjour', '$2y$12$p2pkD116hBHNc/2nyQ2WyOkrn.h8xvWvM1.Lmvsnhms2Y6zsb.j1e') ? 'yes' : 'no'; 
// yes 
?>  

Это нормально, что password_verify может проверить пароль без необходимости хранить salt где-нибудь?

ответ

1

Из инструкции PHP.net

Note that password_hash() returns the algorithm, cost and salt as part of the returned hash. Therefore, all information that's needed to verify the hash is included in it. This allows the verify function to verify the hash without needing separate storage for the salt or algorithm information.

соль кодируется в хэш, в основном.

+0

Спасибо. Таким образом, безопасно хранить результат 'password_hash()' (содержащий соль) в моей базе данных username/pwd? – Basj

+1

Это действительно так. Это одна из основных причин, по которой она существует. – iamgory