Одно предложение. Добавьте пароль в прогон подсолки:
$hash = hash('sha256', $pass);
$salt = createSalt();
$hash = hash('sha256', $salt . $hash . $pass);
Причина в том, чтобы избежать столкновений (хотя с SHA-256
это маловероятно). Допустим, есть строка foo
, которая сталкивается с вашим паролем bar
, когда пробег через sha256
... $hash
из первого раунда будет идентичен, поэтому второй раунд хеширования также даст идентичные результаты: *
$hash = hash('sha256', 'foo'); // "test" for example
$hash = hash('sha256', 'bar'); // "test" since it's a collision
$newHash = hash('sha256', $salt . $hash); //The same for both foo and bar!
Принимая во внимание, что если вы повторно введете пароль во втором раунде, он не будет напрямую конфликтовать, так как строка отличается для каждого раунда хэша ...
Редактировать: Что касается соления, я бы порекомендовал что-то вроде этого (кросс-платформенный):
function createSalt() {
$length = mt_rand(64, 128);
$salt = '';
for ($i = 0; $i < $length; $i++) {
$salt .= chr(mt_rand(33, 255));
}
return $salt;
}
Он использует символы вне нормального диапазона (намного выше), но исключает символы общего управления и пробельные символы, которые могут быть удалены базой данных (или обрезаны). Обратите внимание, что он возвращает допустимую строку ISO-8859-1 (Latin-1). Это не допустимая строка UTF-8. Поэтому убедитесь, что набор символов столбца правильный, или в худшем случае измените 255
на 127
в приведенном выше коде (но это значительно снижает прочность соли) ...