Блог студии веб-дизайна «Make a Site» Дизайн, верстка, программирование, наполнение и раскрутка сайтов.

Хранение паролей пользователей в форматах MD5 и SHA-1

Пароли зарегистрированных пользователей хранятся в базе данных. Для обеспечения должной защиты необходимо хранить пароли не в очевидном виде, а в зашифрованном с помощью хеш-функций — MD5 или SHA-1.

Хранение паролей пользователей в форматах MD5 и SHA-1
Содержание статьи

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

Хранение паролей пользователей в базе данных

Сайты, на которых существует возможность зарегистрироваться, обязаны хранить логины и пароли пользователей в специально созданной для этого таблице базы данных, например, users. При авторизации пользователя, посредством формы, на сервер передается пара логин-пароль, после чего программа ищет соответствие в базе данных и если оно будет найдено, то происходит авторизация, в противном случае выдается ошибка. Кстати, было бы не лишним добавить в модуль авторизации довольно полезную функцию, которая будет просить дополнительно ввести символы с картинки (капчу) в случае, если пользователь 3 раза ввел неверную пару логин-пароль. Это может послужить дополнительной защитой, предохраняющей от прямого подбора пароля.

Для обеспечения дополнительной безопасности, пароли пользователей не рекомендуется хранить в открытом, явном виде. Желательно и даже обязательно использовать защиту пароля с помощью одной из существующих на данный момент хеш-функции, например, MD5 или SHA-1. Таким образом пароль пользователя, записанный в базу данных, будет представлять собой нечитаемую хеш-строку, состоящую, к примеру, из 32 символов (в случае кодировки функцией MD5), а при поиске соответствия, переданный через форму авторизации пароль будет кодироваться той же функцией налету, после чего уже будет происходить идентификация.

Зачем кодировать пароли в MD5 или SHA-1

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

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

Если пароли в базе данных будут записаны в своем первоначальном виде и к ним не будет применено кодирование специальной хеш-функцией, злоумышленник, получивший доступ к вашей базе сможет авторизоваться от лица любого зарегистрированного пользователя и приобрести товар или услугу за его счет. Другой вариант — списать с каждого пользователя по 1 рублю, чтобы не было заметно и перевести их себе. Вариантов использования много, главное, чтобы были пароли. Как видите, какой бы изощренной защитой не обладал движок вашего сайта, какие бы функции для этого не использовались, какие бы хитрые пароли ни придумывали пользователи, взлом производится очень просто. Ваша защита — это железобетонная конструкция, которую злоумышленник просто объезжает стороной. А в случае, если вы хранили пароли пользователей в зашифрованном виде, этого не случится. Более того, в случае введения хакером SQL инъекции, воспользоваться полученным доступом вряд-ли получится, т. к. функции хеширования необратимы и возможностей расшифровать выдаваемый ими хеш нет, поэтому как бы ни старался злоумышленник, у него ничего не получится, даже если он получит доступ к вашей базе данных со всеми логинами и паролями.

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

Что выбрать — MD5 или SHA-1

Ситуация довольно спорная и нельзя однозначно сказать какая функция лучше — MD5 или SHA-1. Это все равно, что задаться вопросом о том, какой цвет лучше — красный или зеленый. SHA работает медленней и использует больше ресурсов для хранения результата (простыми словами строка состоит из большего количества символов), однако она считается более надежной, нежели MD5, но это совершенно не означает, что функцию MD5 можно считать "дырявой" в плане защиты информации. Коллизию для функции MD5 можно подобрать, используя 18 446 744 073 709 551 616 вариантов, а коллизия для функции SHA-1 подбирается за 1 208 925 819 614 629 174 706 176 шагов, что на несколько порядков выше, а значит практически невозможно.

Коллизия хеш-функции — одно или несколько входных значений функции, отличающихся от оригинального, но дающие такой же хеш-результат.

Следующий пример это наглядно демонстрирует:

echo md5("password"); /* 5f4dcc3b5aa765d61d8327deb882cf99 */
echo md5("какая-то подобранная строка"); /* 5f4dcc3b5aa765d61d8327deb882cf99 */

В данном примере результат хеширования строки "password" и какой-то подобранной строки будет одинаковым, в этом случае "какая-то подобранная строка" считается коллизией функции MD5, но для того, чтобы найти подобную строку, нужно произвести столько операций, что вероятность этого сводится практически к нулю, а задача — непосильной, но все же эта вероятность есть и, по большей части, нахождение коллизии упирается в мощность вычислительного процессора. В будущем, когда компьютеры станут настолько мощными, что будут выполнять подобные операции в короткий срок, проблема защиты паролей встанет ребром. Существует немалая вероятность, что в не столь далеком будущем, обычным компьютерам на смену придут квантовые, которые смогут выполнять непостижимое уму количество операций в сверхкороткие сроки. Кстати, квантовые компьютеры уже существуют, но пока что они выглядят как большие лаборатории и способны выполнять лишь самые базовые вычислительные операции. Хотя, с другой стороны и хеш-функции будут совершенствоваться и улучшаться прямо пропорционально техническому прогрессу. Время покажет...

MD5 и SHA-1 онлайн

Используя данный инструмент, вы можете закодировать вашу строку при помощи хеш-функций MD5 и SHA-1 онлайн и сравнить полученные результаты для наглядности:

открыть в новой вкладке

Результат получается при помощи PHP-функции md5() и sha1().

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


Предыдущая статья:
Вендорные CSS префиксы

Читайте также:
Защита сайта от SQL инъекций


Блог студии веб-дизайна «Make a Site».
Дизайн, верстка, программирование, наполнение и раскрутка сайтов.

Текущий проект: «Stream Booster» — раскрутка Twitch и YouTube каналов

Студия веб-дизайна «Make a site»