Как хэшировать пароли с помощью MySQL

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

Интерес

Интерес связан с двумя факторами: причинить кому-то вред или, наоборот, получить выгоду.

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

Любопытство

Ответьте мне честно, хотели ли вы когда-нибудь получить доступ к чьему-то аккаунту в Facebook? Или к определенным разговорам в WhatsApp? Можете не отвечать, но все мы знаем, что человеческое любопытство также является одной из причин утечки информации.

Шифрование паролей в базе данных

Одна из причин, по которой не следует шифровать пароли в базе данных, заключается в проверке пароля пользователя. То есть, как сравнить пароль пользователя, сохраненный в базе данных, с паролем, введенным на экране входа в систему?

Просто выполните следующее трехшаговое задание:

1 — Создайте структуру (таблицу).
2 — Вставьте данные.
3 — Проверить сохраненный пароль.

1 — Создание таблицы для вставки пользовательских данных в зашифрованном виде.

В дидактических целях наша таблица будет включать только три поля: id, login и password:


CREATE TABLE 'user'(
   'id' BIGINT NOT NULL AUTO_INCREMENT,
   'login' VARCHAR(20) NOT NULL,
   'password' VARCHAR(50) NOT NULL,
   PRIMARY KEY('id')
  );
Вход в полноэкранный режим Выход из полноэкранного режима

2 — Вставка значений в нашу таблицу пользователей.

На данном этапе мы будем вставлять записи (пароль) уже в зашифрованном виде, но сначала я укажу на две формы шифрования, существующие в MySQL:

Пароль

Родная функция MySQL для шифрования данных работает однонаправленно, то есть невозможно обратить информацию вспять. Ввод данных в нее осуществляется через строки, с возвратом также в том же типе данных.
Функция возвращает 42-символьную двоичную строку или null, если входной аргумент равен null.

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

MD5

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

Следует ли ее использовать?

CompTIA Security+ 2008 in depth говорит, что «К середине 1990-х годов были обнаружены слабые места в функциях сжатия, которые могли привести к коллизиям, а через 10 лет были проведены успешные атаки на MD5. Большинство экспертов по безопасности рекомендуют заменить семейство хэшей MD на более безопасный алгоритм хэширования». Эти коллизии означают, что хакер или злонамеренный пользователь может создавать файлы, которые будут иметь точно такой же хэш, как и другие, что делает невозможным быть уверенным в том, что файл не был подделан.

Что же следует использовать вместо этого? Автор продолжает: «Большинство экспертов по безопасности рекомендуют использовать SHA-2 вместо MD5».

Мы рассмотрим тему SHA-2 в следующих неделях, следите за новостями.

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

INSERT INTO user
        (id,
         Login,
         password)
  VALUES (NULL,
      'admin',
      MD5('admin'));
Вход в полноэкранный режим Выход из полноэкранного режима

Обратите внимание, что для шифрования пароля нет никакого секрета, просто передайте значение для шифрования в функцию md5().

3 — Теперь, как сравнить и проверить зашифрованный пароль?

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

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

DELIMITER $
 DROP FUNCTION IF EXISTS `fun_valid_user`$
 CREATE FUNCTION `fun_valid_user`(p_login VARCHAR(20)
                , p_password VARCHAR(50) ) RETURNS INT(1)
 BEGIN
 DECLARE l_ret INT(1) DEFAULT 0;
     SET l_ret = IFNULL((SELECT DISTINCT 1
                       FROM user
                      WHERE login = p_login
                       AND password = MD5(p_password)),0);
 RETURN l_ret;
 END$
 DELIMITER;
Вход в полноэкранный режим Выйти из полноэкранного режима

В функции я проверяю, есть ли в базе данных информация, соответствующая значениям, переданным в параметрах p_login и p_password. Если да, то функция вернет значение 1 (единица), в противном случае — 0 (ноль).
Обратите внимание, что для сравнения пароля я использовал функцию MD5(), передав в качестве значения параметр p_password.
Будьте внимательны: Обратите внимание, что я не использовал кавычки при передаче значения в функцию MD5, это потому, что параметр p_password уже является строкой. Если вы передадите значение p_password с двойными кавычками (‘p_password’), функция зашифрует значение p_password и сравнит со значением, которое находится в базе данных, и это не сработает.
Создав функцию, мы просто выполняем вызов, передавая значения, и получаем результат, подтвержденный или нет.

SELECT fun_valid_user('admin','admin') as Validated
validated
-------
       1
Вход в полноэкранный режим Выход из полноэкранного режима

ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ:
Существуют ли другие способы шифрования данных в MySQL?
О: Да, смотрите более подробную информацию на странице документации MySQL.

Могу ли я также зашифровать вход пользователя в систему?
О: Да, это может быть бизнес-правилом, но не так часто встречается.

Безопасен ли MD5 в наше время? Что мне следует использовать?
О: К сожалению, MD5 был криптографически нарушен и считается небезопасным. По этой причине его не следует использовать ни для чего. Вместо него разработчикам следует перейти на безопасный хэш-алгоритм или симметричный криптографический алгоритм. При современных графических процессорах и инструментах для взлома хэшей использование MD5 едва ли лучше, чем вообще ничего не использовать. Всегда рекомендуется хранить пароли пользователей с помощью алгоритма хэширования, и вы должны обнаружить, что использовать SHA-2 вместо MD5 одинаково легко в любой современной среде программирования.

Как видите, никакого секрета в шифровании паролей нет. Это не ракетостроение. Если у вас есть вопросы или вы хотите поделиться другим способом прохождения этого процесса, пожалуйста, поделитесь с нами.

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

Оцените статью
devanswers.ru
Добавить комментарий