Я читаю хэширование паролей, но все форумы, которые я читаю, полны сообщений от людей, которые обсуждают теорию за этим, что я действительно не понимаю.
У меня есть старый (и предположительно крайне слабый) пароль script, который читается следующим образом: $ hash = sha1 ($ pass1);
function createSalt()
{
$string = md5(uniqid(rand(), true));
return substr($string, 0, 3);
}
$salt = createSalt();
$hash = sha1($salt . $hash);
Если я правильно понимаю, чем дольше соль, тем больше таблица, которую хакер должен сгенерировать, чтобы сломать хэш. Пожалуйста, поправьте меня, если я ошибаюсь.
Я хочу написать новый script, более безопасный, и я думаю, что что-то вроде этого будет в порядке:
function createSalt()
{
$string = hash('sha256', uniqid(rand(), true));
return $string;
}
$hash = hash('sha256', $password);
$salt = createSalt();
$secret_server_hash = 'ac1d81c5f99fdfc6758f21010be4c673878079fdc8f144394030687374f185ad';
$salt2 = hash('sha256', $salt);
$hash = $salt2 . $hash . $secret_server_hash;
$hash = hash('sha512', $hash );
Является ли это более безопасным? У этого есть заметное количество накладных расходов?
Самое главное, есть ли лучший способ убедиться, что пароли в моей базе данных не могут быть (реалистично) восстановлены криптоанализом, гарантируя тем самым, что единственный способ безопасности будет скомпрометирован, это моя собственная ошибка в кодировании?
EDIT:
После прочтения всех ваших ответов и дальнейшего поиска, я решил пойти дальше и реализовать метод bcrypt для защиты моих паролей. Говоря это, ради любопытства, если бы я взял мой выше код и поставил на него цикл, скажем, 100 000 итераций, выполнил бы что-то похожее на силу/безопасность bcrypt?