Функции AES_ENCRYPT и AES_DECRYPT в MySQL

Функции AES_ENCRYPT() и AES_DECRYPT() производят симметричную шифровку и дешифровку данных с использованием алгоритма AES (Advanced Encryption Standard), при этом используется кодирование с 128-битным ключом. Есть возможность расширить до 256-бит, но как стандарт в MySQL выбран 128-битный, как достаточный по надёжности и более быстрый.

Синтаксис функций:
AES_ENCRYPT('Шифруемая строка','Ключ');
AES_DECRYPT('Дешифруемая строка','Ключ');
--Входные параметры AES_ENCRYPT() могут быть любой длины.
--Если любой из входных параметров равен NULL - то и результат выполнения тоже будет NULL.
--Ключ в AES_DECRYPT() должен совпадать с ключом в AES_ENCRYPT().


Приведем рабочий пример работы с функциями:

Для начала создадим таблицу пользователей с паролями с которой будем работать:

CREATE TABLE `test_users` (
  `name` varchar(50) NOT NULL,
  `crypt_pass` varbinary(50) DEFAULT NULL,
  PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


Теперь добавим в неё пользователя, с зашифрованным при помощи функции AES_ENCRYPT() паролем:
insert into test_users (name,crypt_pass) values ('Петр', aes_encrypt('12345_!','Мой ключ'));


Теперь посмотрим данные из таблицы test_users:
select * from test_users;


И выполнив запрос увидим следующее:
+------+------------------+
| name | crypt_pass       |
+------+------------------+
| Петр | ┐hэ▌╗╖К<iП!┴Ь╓R |
+------+------------------+


Теперь мы видим, что наш пароль зашифрован.

Попробуем вывести пароль в его первоначальном виде с использованием функции AES_DECRYPT():
select name, aes_decrypt(crypt_pass,'Мой ключ') from test_users;


Выполнив запрос увидим не совсем то, что ожидали:
+------+------------------------------------+
| name | aes_decrypt(crypt_pass,'Мой ключ') |
+------+------------------------------------+
| Петр | {Здесь билиберда или NULL}         |
+------+------------------------------------+


Причина может быть исправлена использованием в качестве ключа, только латинского алфавита, либо вот таким способом:
select name, cast(aes_decrypt(crypt_pass,'Мой ключ') as char(50)) from test_users;

Исправляем ошибку, путем приведения типов.

На этом всё.
Вопросы приветствуются.

0 комментариев

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.