Хэширование хэша не добавляет дополнительной безопасности.(На самом деле, это может усугубить ситуацию, если у человека есть таблица поиска хэш-хэша.)
Лучшим будет тот, который в вычислительном отношении является наиболее дорогим для выполнения без каких-либо уязвимостей.Я бы хэшировал пароли, по крайней мере, с sha-256.
Всегда хэшируйте свои пароли с помощью соленого ключа.Этот ключ должен быть уникальным для каждого пароля.Это не должно быть сохранено в частном порядке.Назначение защищенного пароля состоит в том, что хакер, получивший доступ к вашей базе данных, не может просто сравнить хеш с известным списком хешей, которые соответствуют обычным паролям.Вместо этого он должен попытаться взломать пароль, используя все возможные пароли.
Используя уникальную соль для каждого пароля, вы гарантируете, что каждый хэш в базе данных различен, даже если они используют один и тот же пароль.
Чтобы получить пароль, просто создайте случайную строку символов и добавьте ее к паролю.Вот пример хеша с 48-битной солью и sha-256:
function make_password($password)
{
# random 48-bit salt (8 chars when base64 encoded)
$salt = base64_encode(pack('S3', mt_rand(0,0xffff), mt_rand(0,0xffff), mt_rand(0, 0xffff)));
return $salt.hash('sha256', $salt.$password);
}
function check_password($password, $hash)
{
$salt = substr($hash, 0, 8);
return hash('sha256', $salt.$password) == substr($hash, 8);
}
$password = 'password';
$hash = make_password('password');
echo $hash."\n";
var_dump(check_password('password', $hash));
var_dump(check_password('wrong', $hash));
Каждый раз, когда вы запускаете его, хеш будет отличаться.Чтобы подтвердить пароль, выберите строку, в которой совпадает имя пользователя, а затем вызовите check_password($password_from_user, $hash_from_db)
.
Вот пример выходных данных:
AzrD1jZzc693714a43ad5dfd4106c0a620ef23ff9915070711fa170a6670b8164862b496
bool(true)
bool(false)
Вы можете использовать более крупную соль или более сильный алгоритм хеширования, если хотите.Но, как минимум, я бы использовал что-то вроде выше.