Какой способ лучше защитит пароль?

Есть такие функции
function pass_hash($pwd) {
	$salt = bin2hex(random_bytes(8));
	return hash_pbkdf2('sha512', $pwd, $salt, 7826, 84).$salt;
}

function pass_verify($pwd, $hash) {
	$salt = substr($hash, -16);
	$hash2 = hash_pbkdf2('sha512', $pwd, $salt, 7826, 84);
	return strcmp(substr($hash, 0, 84), $hash2) === 0;
}

И есть встроенные в php
password_hash()
password_verify()

Лучше ли первые функции защитят пароли при взломе?
  • Вопрос задан
  • 529 просмотров
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
Первый вариант, разумеется, вообще ни о чём.

Есть три вектора атаки на пароли: перебор по радужным таблицам, брутфорс и подбор по словарю.
От первого защищает соль, от второго алгоритм, от третьего сложность пароля.

У нас здесь речь идет об алгоритме. То есть, о буртфорсе. Что такое брутфорс? Это тупо подстановка случайных сочетаний символов по очереди и проверка, не совпал ли хэш. Чем быстрее вычисляется хэш, тем быстрее раскалывается пароль.
ПОЭТОМУ, ключевой характеристикой хэша для паролей является сложность его вычисления.
Твой ша-пицот-двенадцать выплоненный стопицот раз - это для современной техники как воробей чихнул. А для будущей и подавно.
Поэтому умные люди придумали алгоритмы которые во-первых вычисляют каждый хэш гораздо медленнее, а во вторых адаптируются под растующую скорость процессоров, и говорят тебе когда пора уже усложнять алгоритм. Именно этим и занимаются встроенные функции, и поэтому ты должен использовать именно их.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
https://www.php.net/manual/ru/function.hash-pbkdf2.php
Предостережение
Метод PBKDF2 может быть использован для хеширования паролей в целях их хранения. Однако стоит помнить, что для этих целей гораздо лучше использовать password_hash() или crypt() с CRYPT_BLOWFISH.
Ответ написан
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
Я понимаю что в гамаке и стоя интереснее, но все же - 2 вопроса: Зачем и нахрена?
Ответ написан
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
`password_...` как минимум проще в использовании, а вообще пофиг если фиксировать неудачные попытки входа и блокировать ввод секунд на 5
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Тот, при котором сам пароль никогда не отправляется с фронта на бэк.
Всегда отправляется только его hash.
Затем, этот hash ещё раз хешируется встроенными функциями на основе предыдущего (фронт-хеша) или любой другой инфорамции, доступной только скрипту, но не доступной базе данных.

Т.е., мы равномерно распределили нагрузку на фронт и бэк для создания вложенного (двух-уровневого) хеша.

При попытке подобрать пароль брутфорсом - придётся подбирать уже квадратичную сложность хеширования и без того медленного (устойчивого к бруту) алгоритма хеширования.

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

Войдите, чтобы написать ответ

Похожие вопросы