Ты не умеешь хешировать пароли! О хешировании. Под капотом #3.

Ты не умеешь хешировать пароли! О хешировании. Под капотом #3.

alexcupert

Начнем с ликбеза для самых маленьких и закончим как обычно - теорией и практикой. В современных программах принято тщательно защищать данные. По многим причинам. Самыми классическими являются шифрование и хеширование. О первом поговорим позже, а пока что разберем тему хеширования.

Хеш - это зачастую огромное число, сгенерированное некой программой на основе каких то данных. Оно генерируется по некоторому правилу и НЕ может быть повернуто вспять (мы можем узнать это число на основе данных, но не можем узнать данные на основе хеша, по крайней мере моментально / со 100% вероятностью).
Пример хеша: 104ab42f1193c336aa2cf08a2c946d5c6fd0fcdb (здесь закодирована фраза "my message"). Как я говорил, это число, но записано оно в шестнадцатеричной системе счисления для компактной записи.

И так, мы имеем некий алгоритм генерации хеша и данные, которые нужно защитить. Как нам использовать данный механизм? Представьте себе фейс контроль в интернет клубе. На входе вас спрашивают фразу / некий код, который вам нужно назвать. Сам клуб не хочет хранить данные коды в открытом виде, поэтому хеширует их. Соответственно, имея данный алгоритм, спросив у пользователя фразу, мы можем сверить не данные, а сгенерированное число с тем, что мы храним в базе, таким образом мы не даём злоумышленникам возможности прочитать нашу базу и наши фразы.

Но всё же у наших врагов есть шансы на взлом - это перебор всех значений символов, потому что при одинаковых значениях мы соответственно получим одинаковый результат, и если среди наших результатов совпадут искомый и новый хеш, те данные, что соответствуют хешу будут нам известны. На таком простом свойстве начали составляться таблицы из заранее вычисленных значений, которые позволяют нам гораздо быстрее узнать чужой пароль, ключ и т.п.

И, как назло, на эту проблему тоже нашли выход. Поскольку таблицы генерируются для определеных хеш-функций, крутые программисты и математики начали разбавлять данные мусорной строкой - солью. Таким образом, те таблицы, что были сделаны для обычных алгоритмов теперь не работают и приходится делать для каждой программы отдельную, что не имеет смысла (а я напомню, что 1. Перебор и составление таблиц это ОЧЕНЬ долгий процесс, который может занять до нескольких секстиллионов лет (и больше) и 2. Сами данные при таких затратах перестанут иметь свой смысл)

Но всё таки не все программисты настолько озабочены "солением" своих хешей (при том, что соль может не спасти), но хотят безопасного хранения данных, поэтому умные математики придумали адаптивные хеш функции, время вычисления для которых можно настроить самостоятельно. Таким образом, чтобы узнать конкретно наш пароль, злоумышленнику потребуется затратить время на генерацию одного хеша * желаемое количество строк (в функции bcrypt для 1000 строк и 500 мсек затраченное время генерации составит почти 10 минут, по сравнению с MD5, который на современной видеокарте посчитается практически моментально)

Кстати, многие ресурсы, созданные неопытными разработчиками все ещё используют простейшие методы защиты, что приводит к сливам некоторых данных, например тех же паролей, которые часто совпадают с паролями юзеров на более крупных ресурсах (этим грешен и я), что приводит уже к сливам всевозможных гигантов, таких как Google, Yandex, Spotify и другие. Очень важно соблюдать цифровую гигиену и придумывать уникальные пароли либо хотя бы довериться автогенератору гугла

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

  • Не используйте простые хеш функции, такие как MD5 / SHA без соли. Они ненадежные.
  • Для защиты паролей используйте хеш + соль (либо соль + хеширование несколькими алгоритмами подряд) либо время/памяти зависимые функции (bcrypt / argon / scrypt и т.д.)
  • Как юзер, не используйте один и тот же пароль на всех своих сервисах. Мне это однажды аукнулось.
  • НЕ ПРИДУМЫВАЙТЕ СВОЙ АЛГОРИТМ ХЕШИРОВАНИЯ/ШИФРОВАНИЯ В СЕРЬЕЗНЫХ ПРОЕКТАХ. Пожалуйста. Оставьте это математикам.

Report Page