ресурс для начинающих веб-разработчиков
комплексные веб-услуги по созданию сайтов

Справочный материал по основным языкам программирования и верстки сайтов.

Готовая методика создания простых и сложных динамичных сайтов, с использованием PHP и MySQL.

Использование веб-редактора Adobe Dreamweaver в разработке сайтов.

Использование графических редакторов Adobe Flash, Adobe Photoshop, Adobe Fireworks в подготовке веб-графики.

Разработка веб-сайтов под "ключ".

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

Безопасность и MySQL. Обратимое шифрование. Необратимое шифрование

Безопасность

Безопасность и MySQL

Здесь будут рассмотрены многочисленные функции шифрования данных, которые входят в состав СУБД MySQL. Чаще всего шифрованию подвергаются пароли. В случае взлома базы данных злоумышленник получит доступ только к зашифрованным записям, на расшифровку которых потребуется время, за которое пароли могут стать не актуальными.

Функции шифрования MySQL

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

Примечание. Если функции передается в качестве одного из аргументов значение NULL, она также возвращает NULL.

Таблица. Функции шифрования MySQL
Функции Описание
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-key-file
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)

Функция AES_ENCRYPT(str, key_str)

А теперь рассмотрим шифрование поля email, в таблице users базы данных wet. Шифрование данного поля позволит уберечь пользователей от спамеров в случае, если база данных попадет им в руки. Создадим таблицу users и заполним ее поля.

Шифрование e-mail

Шифрование e-mail

Как видно из листинга, прямой просмотр поля email приводит к выводу "мусора". Для того чтобы узнать настоящие адреса email, необходимо воспользоваться функцией дешифровки AES_DECRYPT() и знать секретный ключ.

Дешифровка данных

Дешифровка данных

Необратимое шифрование

Функция MD5() осуществляет необратимое шифрование.

Использование функции MD5()

Использование функции MD5()

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

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

Функция PASSWORD() подвергает необратимому шифрованию данные и используется для шифрования паролей MySQL в столбце password в таблице привлегий user системной базы данных mysql.

Использование функции PASSWORD()

Использование функции PASSWORD()

Функция PASSWORD() используется в системе аутентификации в сервер MySQL, поэтому ее не следует использовать в приложениях — лучше пользоваться функциями MD5() и SHA1().