JackShcherbakov
@JackShcherbakov

Защита и хранение паролей. Как правильно?

Здравствуйте!

Суть:

Есть база данных с паролями. Все пароли хранятся в захешированном виде. Хеширование проводится при помощи функции password_hash PHP. Если пользователь введет "ПарольСекрет1123123", то в базу данных будет записано следующее:
$2y$10$Vo1rzCRf8gQSu3FZDvxeEu4EkhEIvyAF1BGWPbgim5OhRdTjqEqJm


Вопрос 1:

Насколько надежен этот хеш? Реально ли получить исходный пароль зная хеш? Возможно это в принципе?

Подбор пароля при помощи брутфорсинга:

Как бы ни хранился пароль, его все равно возможно подобрать. Поэтому нужно сделать защиту от брутфорсинга. Я хочу сделать так, что после 3-х неверных попыток пароль можно было ввести спусти 5 минут. Если даже тогда пароль был введен неверно, то пауза удвоится, и так далее. Я думаю это довольно надежная защита. Но как это реализовать?

Шифрование паролей:

Я подумал начать изучать криптографию, чтобы улучшить защиту и хранить не хеш пароля, а хеш шифра пароля. Безусловно, нужно еще этот метод шифровки придумать, но это уже другой вопрос.

Какие методы защиты паролей вы еще знаете?

Заранее выражаю огромную благодарность всем, кто поможет!
  • Вопрос задан
  • 1663 просмотра
Решения вопроса 4
Zatmil
@Zatmil
Fullstack-разработчик
На самом деле, уже давно все придумали за нас =) Пароль пишешь в базу как хеш + salt и пароль уже будет сложнее подобрать. Далее вводишь каптчу на ввод пароля и допустим таймер, чтобы трудно было перебирать. Можно еще сделать блокировку пользователя после 5 неудачных вводов и требовать подтверждения разблокировки по email
Ответ написан
@vyrkmod
Пишу на php. И не стыдно.
Bcrypt вполне надёжен. Подобрать пароль можно всегда, вопрос только в ресурсо-часах. Если очень хочется чтоб брутить уведённый хэш было долго - ставим cost побольше, про конкретные цифры надо спрашивать знатоков.
Тормозить запросы лучше на стороне веб-сервера, средства есть. Хотя "капча начиная с третьей попытки" лучше: задержкой на пять минут мы скорее отпугнём живых людей, чем ботов.
Шифрование пароля перед хешированием не нужно. Если сервер ломанули и базу уводят, код тоже наверняка сольют и прям его и будут использовать для расшифровки. Увеличение cost для хеширования даст лучший результат без лишних телодвижений.
Ответ написан
Wolfnsex
@Wolfnsex Куратор тега Веб-разработка
Если не хочешь быть первым - не вставай в очередь!
Насколько надежен этот хеш? Реально ли получить исходный пароль зная хеш? Возможно это в принципе?
Надёжность хэша зависит от алгоритма хэширования.

Я думаю это довольно надежная защита. Но как это реализовать?
Я тоже думаю, что это довольно надёжная защита от брутфорса паролей, что в целом никак не говорит о защите во всём остальном. Как реализовать - самые простые варианты:
а) Записывает с какого IP была неудачная попытка входа с датой и временем события в БД (или любое другое хранилище, которые Вы используете), при попытке ввода пароля - проверяете, сколько неудачных попыток ввода с этого IP была за прошедшие N времени, если больше чем X - попытка ввода пароля блокируется
б) Аналогично пункту А, но проверяете не IP адрес, а логин, по которому пытаются залогинится
в) Сочетание пунктов А и Б
г) Масса других вариантов, коих просто прорва, включая применение гугл-капчи, систем распознавания ботов а так же различные сочетания методов защиты и всяческих извращений, в т.ч. выше описанные.

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

Я подумал начать изучать криптографию, чтобы улучшить защиту и хранить не хеш пароля, а хеш шифра пароля.
Осталось дело за малым:
1. Изучить (Вам) криптографию на уровне достаточно для реализации поставленных задач, в т.ч. для написания собственных криптографических алгоритмов (методов шифрования), о которых говорилось тут:
Безусловно, нужно еще этот метод шифровки придумать, но это уже другой вопрос.

2. Решить задачу безопасного хранения приватного (закрытого) ключа, который обязательно понадобиться в данном случае

P.S. Судя по контексту Вашего вопроса, Вы пытаетесь создать какую-то "мега-защиту" в одном месте, упуская из внимания то, что защита формы для ввода пароля и этого механизма в целом (у нас же про это идёт речь?) - это ~1% от общей безопасности среднестатистической системы, и примеров тому - масса. Например, есть просто масса примеров того, когда у крупных почтовых провайдеров внезапно "утекала" база данных пользователей, в т.ч. с их паролями (хэшированными, разумеется) и связано это было не с брутфорсом (и ему подобными деяниями) явно, есть всякие там Heartbleed, от которой "официально" пострадали очень крупные компании, за сетевой безопасностью в которых следили люди разбирающиеся в данном вопросе куда лучше, чем Вы, я и все остальные участники данного вопроса - вместе взятые... и т.д. [очень много разных примеров]. Вы же всерьёз не думаете, что цель любого хакера заключается в том, что бы подобрать или получить какой-то отдельно взятый пароль и (даже если его цель заключается именно в этом, внезапно), что этот самый хакер будет до потери пульса "биться лбом о стену" в попытках получить этот самый злополучный пароль путём брутфорса по форме авторизации или чем-то подобным и в результате неудачной попытки вся его "хакерская деятельность" на этом и остановится?
Ответ написан
Комментировать
Jump
@Jump
Системный администратор со стажем.
Все пароли хранятся в захешированном виде.
Пароль нельзя хранить в захешированном виде.
Либо вы храните пароль, либо вы не храните пароль.
В вашем случае пароль не хранится, хранится хэш.
Насколько надежен этот хеш?
Смотря что подразумевать по надежностью.
Реально ли получить исходный пароль зная хеш?
Нет, это невозможно в принципе.

Как бы ни хранился пароль, его все равно возможно подобрать
Поэтому его и не хранят, хранят его хэш.

Я хочу сделать так, что после 3-х неверных попыток пароль можно было ввести спусти 5 минут.
Это нормальная практика, только 5минут пожалуй много, начать стоит с 10-15секунд.
Но как это реализовать?
Хранить время попыток входа - удачных и неудачных. При попытке входа считать количество времени прошедшее с последней попытки, и если она неуспешна, блокровать.

Я подумал начать изучать криптографию, чтобы улучшить защиту и хранить не хеш пароля, а хеш шифра пароля.
Когда изучите криптографию, поймете что это чушь.
Постараюсь объяснить -
7f1faa82a84c11d68e301cd04680609d - Это хэш фильма Аватар в FullHD качестве, весом 50Гигабайт.
Вы сможете из этих цифр восстановить 50гигабайт видео?
Еще пример -
Вот допустим пароль 123456789
Вот алгоритм хэширования- считаем количество цифр.
У вас получится восстановить пароль 123456789 зная что его хэш равен 9 ?
Это конечно очень примитивный алгоритм хэширования, и на практике использовать его нельзя из-за большого количества коллизий, но тем не менее это хэширование.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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