Функции 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;
Исправляем ошибку, путем приведения типов.
На этом всё.
Вопросы приветствуются.