К настоящему моменту, когда приближается конец первой четверти XXI века, все наверняка осознают, что пароли пользователей — это цифровое золото, и что их защита — ключевой аспект обеспечения безопасности и конфиденциальности данных. Однако, несмотря на это, не все компании до сих пор хранят пароли должным образом.
В этом посте мы рассмотрим, как НЕ хранить пароли пользователей и какие методы используют сервисы, которые серьезно относятся к безопасности.
Неправильный путь: хранить пароли в открытом виде
Самый простой способ — хранить пароли в незашифрованной базе данных. Когда пользователь пытается войти в систему, аутентификация — это всего лишь вопрос сопоставления того, что он вводит, с тем, что находится в базе данных.
Но всегда существует риск того, что злоумышленники так или иначе могут украсть эту базу данных — например, воспользовавшись уязвимостями в программном обеспечении базы данных. Или таблица паролей может быть украдена злонамеренным сотрудником с высокими правами доступа. Утечка или перехват учетных данных сотрудников также может быть использована для кражи паролей. Проще говоря, существует множество сценариев, в которых дела могут пойти не так, как хотелось бы. Помните: данные, хранящиеся в открытом виде, и есть открытые.
Немного лучший способ: зашифрованные пароли
Что делать, если вы храните пароли в зашифрованном виде? На первый взгляд идея неплохая, но на практике она работает не очень хорошо. В конце концов, если вы храните зашифрованные пароли в базе данных, их придется каждый раз расшифровывать, чтобы сравнить с вводом пользователя.
А это значит, что ключ шифрования будет где-то рядом. В этом случае этот ключ может легко попасть в руки хакеров вместе с базой паролей. Таким образом, это сводит на нет всю цель: киберпреступники смогут быстро расшифровать эту базу данных и получить пароли в открытом виде, так что мы вернемся к тому, с чего начали.
Как на полном серьезе шутят криптографы, шифрование не решает проблему конфиденциальности данных — оно лишь усугубляет проблему безопасного хранения ключей. Можно придумать какие-то хитрые схемы, которые могут снизить риски, но в целом надежно обезопасить пароли таким способом не получится.
Правильный способ: хранение хэшей паролей
Лучший способ — вообще не хранить пароли. Если у тебя чего-то нет — это не украдут, верно?
Но как проверить, ввел ли авторизующийся пользователь правильный пароль? Именно здесь в игру вступают хэш-функции : специальные криптографические алгоритмы, которые шифруют любые данные в строку битов фиксированной длины предсказуемым, но необратимым способом.
Предсказуемость здесь означает, что одни и те же данные всегда преобразуются в один и тот же хэш. А необратимость означает, что полностью невозможно восстановить хешированные данные из хеша. Так поступает любой онлайн-сервис, если он хоть немного заботится о пользовательских данных и дорожит своей репутацией.
Когда пользователь создает пароль при регистрации — в базе данных вместе с именем пользователя хранится не сам пароль, а его хеш. Затем в процессе входа этот хэш сравнивается с хешем пароля, введенного пользователем. Если они совпадают, значит, пароли одинаковые.
В случае утечки базы данных злоумышленникам достаются не пароли, а их хэши, из которых невозможно восстановить исходные данные (необратимость, помните?). Конечно, это огромный шаг вперед с точки зрения безопасности, но радоваться еще рано: если киберпреступники получат в свои руки хэши, они могут попытаться атаковать методом перебора.
Еще лучший способ: соленые хеши
Получив вашу базу данных, хакеры могут попытаться извлечь пароли с помощью грубой силы. Это означает, что нужно взять комбинацию символов, вычислить ее хеш и найти совпадения во всех записях базы данных. Если совпадений не найдено, они попробуют другую комбинацию и так далее. Если есть совпадение, теперь известен пароль, который использовался для вычисления хеша в базе данных.
Хуже того, процесс взлома хешированных паролей можно значительно ускорить с помощью так называемых радужных таблиц. Радужные таблицы представляют собой огромные массивы данных с заранее рассчитанными хэш-функциями для наиболее часто встречающихся паролей. Таким образом, они облегчают поиск совпадений в украденной базе данных. И все это, конечно, делается автоматически, поэтому процесс взлома пароля становится слишком быстрым для комфорта.
Однако есть и хорошие новости: заранее вычислить хеши всех возможных комбинаций символов невозможно — полная радужная таблица для любого алгоритма хеширования займет больше дискового пространства, чем есть на планете. Даже для не слишком надежного алгоритма MD5 такая гипотетическая таблица будет содержать (глубокий вдох) 340 282 366 920 938 463 463 374 607 431 768 211 456 записей. Вот почему в радужные таблицы включаются только самые распространенные комбинации.
Для борьбы с использованием радужных таблиц криптографы придумали решение, использующее еще одно важное свойство хеш-функций: даже малейшее изменение исходного текста изменяет результат хеширования до неузнаваемости.
Прежде чем хэш пароля будет вычислен и записан в базу данных, к нему добавляется случайный набор символов (называемый солью). Таким образом, хэши в базе данных изменяются до такой степени, что даже самые простые, очевидные и часто используемые пароли, такие как «12345678» и «пароль», невозможно подобрать с помощью радужных таблиц.
Самый простой вариант использует одну и ту же соль для всех паролей. Но самый устойчивый к взлому создаёт отдельную соль для каждой отдельной записи. Прелесть этого подхода в том, что соли можно хранить в той же базе данных без дополнительного риска: знание соли не сильно облегчает задачу злоумышленникам. Чтобы взломать хэши, им все равно придется применять чистый перебор — перебирать каждую комбинацию.
Чем больше онлайн-сервисов примут этот метод отказа от хранения паролей , тем меньше вероятность массовой кражи учетных данных пользователей (и последующих неприятностей, связанных со взломом учетной записи).