Здесь будут рассмотрены многочисленные функции шифрования данных, которые входят в состав СУБД MySQL. Чаще всего шифрованию подвергаются пароли. В случае взлома базы данных злоумышленник получит доступ только к зашифрованным записям, на расшифровку которых потребуется время, за которое пароли могут стать не актуальными.
Различают два вида шифрования: обратимое и необратимое. При обратимом шифровании зашифрованный текст может быть подвергнут дешифровке. При необратимом шифровании результатом является хэш, который невозможно восстановить в исходный текст.
Примечание. Если функции передается в качестве одного из аргументов значение NULL, она также возвращает NULL.
Функции | Описание |
AES_ENCRYPT(str, key_str) |
Принимает в качестве аргумента str строку, которую необходимо подвергнуть шифрованию, и секретный ключ key_str. Входные аргументы могут быть любой длины |
AES_DECRYPT(crypt_str, key_str) |
Принимает в качестве первого аргумента зашифрованную при помощи AES_ENCRYPT() строку. Ключ key_str при этом должен совпадать как в первой так и во второй строках. Если функция AES_DECRYPT() обнаруживает некорректные данные или некорректное заполнение строки, должно возвращаться значение NULL. Однако AES_DECRYPT() вполне может вернуть величину отличную от NULL, или просто "мусор" |
ENCODE(str, pass_str) | Шифрует строку str, используя аргумент pass_str как секретный ключ |
DECODE(crypt_str, pass_str) |
Дешифрует строку crypt_str, зашифрованную функцией AES_DECRYPT(). Аргумент pass_str используется как секретный ключ |
DES_ENCRYPT(str [, (key_number|key_string)]) |
Шифрует строку str, используя аргумент pass_str как секретный ключ. В качестве второго необязательного параметра может выступать строка key_string, задающая секретрый ключ. В случае использования секретного ключа необходимо приводить его в качестве второго параметра и в функции дешифровки DES_DECRYPT(). Вместо секретного ключа можно указать номер key_number, принимающий значение от 0 до 9. Номер указывает на запись в ключевом DES-файле сервера, местоположение которого можно задать при старте сервера MySQL в параметре |
DES_DECRYPT(str [, key_string]) |
Дешифрует строку str, зашифрованную при помощи функции DES_ENCRYPT(). Если при шифровании в качестве второго параметра функции DES_ENCRYPT() было передано число или второй параметр был опущен, то параметр key_string функции DES_DECRYPT() указывать уже не требуется, так как он прописывается в зашифрованную строку. Такой подход, когда секретный ключ хранится на сервере и не передается через сетевое соединение, значительно безопаснее, поскольку значение ключа невозможно извлечь из сетевого трафика. Если второй параметр не указывается, то предполагается, что используется первая строка DES-файла |
ENCRYPT(str [, salt]) |
Подвергает строку str необратимому шифрованию, используя вызов системной функции crypt() UNIX. Если второй необязательный параметр salt не указывается, то результат каждый раз получается новым. |
MD5(str) |
Принимает строковой параметр str и возвращает 128-битную контрольную сумму, вычисленную по алгоритму MD5. Возвращаемая величина представляет собой 32-разрядное шестнадцатеричное число, которое уникально для строки. Таким образом для строк, отличающихся хотя бы одним символом, результат функции MD5 будет разный. В тоже время для двух одинаковых строк всегда возвращается одинаковый результат |
PASSWORD(str) |
Подвергает необратимому шифрованию данные str. Именно эта функция используется для шифрования паролей в MySQL |
OLD_PASSWORD(str) | Эмулирует работу функции PASSWORD() версий MySQL, предшествующих MySQL 4.1 |
SHA1(str) | Вычисляет 160-битную контрольную сумму по алгоритму SHA1(Secure Hach Algorithm) для строки str |
При обратимом шифровании, как правило, предоставляется две функции для шифровки и расшифровки данных.
Рассмотрим примеры с использованием функций AES_ENCRYPT(str, key_str) и AES_DECRYPT(crypt_str, key_str), описание которых дано в таблице.
Функция AES_ENCRYPT(str, key_str)
А теперь рассмотрим шифрование поля email, в таблице users базы данных wet. Шифрование данного поля позволит уберечь пользователей от спамеров в случае, если база данных попадет им в руки. Создадим таблицу users и заполним ее поля.
Шифрование e-mail
Как видно из листинга, прямой просмотр поля email приводит к выводу "мусора". Для того чтобы узнать настоящие адреса email, необходимо воспользоваться функцией дешифровки AES_DECRYPT() и знать секретный ключ.
Дешифровка данных
Функция MD5() осуществляет необратимое шифрование.
Использование функции MD5()
Примечание. Алгоритм MD5() часто используется для создания уникального хэш-кода объемных файлов, которые передаются по сети. Загрузив файл, всегда можно проверить его целостность, вычислив код по алгоритму MD5() и сравнив полученный результат с хэш-кодом, представленным распространителем. Это позволяет отследить повреждения файла, вызванные передачей через сеть, а также предотвращает фальсификацию дистрибутива.
Необратимое шифрование может применяться для шифрования паролей — в базе данных храняться не сами пароли, а их MD5-хэши. Во время аутентификации пароль, введенный пользователем, также подвергается обработке функцией MD5(), после чего MD5-хэши подвергаются сравнению. Такая схема позволяет хранить пароли в защищенном виде, и никто, даже администратор базы данных, не имеет возможности узнать пользовательские пароли. В последнее время такой вид аутентификации приобретает все большую популярность. Поскольку в следствии применения паузы после ввода некорректного пароля время, необходимое для подбора пароля, многократно возросло, средства подбора единичных паролей по сети практически вышли из употребления — злоумышленники стараются получить всю базу с паролями. Если же в базе храняться только MD5-хэши, злоумышленнику придется восстанавливать методом перебора каждый из зашифрованных паролей
Функция PASSWORD() подвергает необратимому шифрованию данные и используется для шифрования паролей MySQL в столбце password в таблице привлегий user системной базы данных mysql.
Использование функции PASSWORD()
Функция PASSWORD() используется в системе аутентификации в сервер MySQL, поэтому ее не следует использовать в приложениях — лучше пользоваться функциями MD5() и SHA1().