Шифрование базы данных mysql

Шифрование базы данных mysql

Для защиты конфиденциальных данных в MySQL 5.7 появилась возможность шифрования данных с помощью движка InnoDB . В этой статье я объясню принципы шифрования баз данных, используя конкретные примеры.

Шифрование на уровне базы данных

Шифрование всей системы может быть неоправданно дорогим, когда нужно защитить лишь часть данных. Также не всегда возможно изменить код и разработать механизм шифрования на уровне приложения. В таких случаях важно использовать шифрование на уровне базы.

Шифрование данных в MySQL 5,7 имеет следующие преимущества:

  • Надежное шифрование AES-256 для таблиц InnoDB ;
  • Прозрачное для приложений. Отсутствие кода для приложения, схемы. Нет необходимости изменять тип данных;
  • Прозрачное для администраторов баз данных. Ключи не управляются администраторами баз данных;
  • Управление ключами. Ключи можно безопасно хранить отдельно от данных, а смена ключей является простой.

MySQL 5.7 свойственно шифрование только таблиц InnoDB , при этом остаются открытыми следующие файлы: binlogs , redo logs , relay logs , slow log , error log , general log , и audit log .

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

Начнем с того, что разрешим шифрование MySQL , добавив следующие параметры в файл конфигурации my.cnf .

Следующим шагом является запуск службы и проверка активности плагина.

Мы также можем проверить настройки шифрования баз данных.

Чтобы зашифровать таблицы в InnoDB, следует убедиться в том, что параметр innodb_file_per_table включен ( ON ).

Читайте также:  Как поставить номер на клавиатуре телефона

Если этот параметр выключен ( OFF ), нужно добавить следующие параметры для файла конфигурации my.cnf , и перезапустить службу.

Рассмотрим шифрование базы данных MySQL в действии. Создадим таблицу для хранения конфиденциальных данных.

Добавляем строку к таблице.

Используем команду strings , чтобы извлечь каждую строку символов в двоичном файле, который относится к таблице sensitive_data_tb .

Также можно проверить, что ключевой файл пуст ( нет главного ключа ).

Чтобы использовать шифрование баз данных в таблице sensitive_data_tb , нужно сменить таблицу.

Если мы попытаемся вывести таблицу sensitive_data_tb , то увидим, что теперь данные зашифрованы, и их невозможно увидеть из файловой системы.

Хотя мы не можем видеть данные из файловой системы, их можно увидеть из MySQL , используя традиционный оператор SQL .

Также можно проверить, что главный ключ генерируется в MySQL .

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

Можно верифицировать смены ключа, проверив временную отметку ключевого файла.

Просмотреть список зашифрованных таблиц, можно выполнив запрос.

Заключение

В этой статье я объяснил принципы шифрования данных на уровне базы в новой версии MySQL . Также я продемонстрировал их на реальных примерах. Теперь вы можете применять эти принципы и приведенные примеры для защиты конфиденциальной информации.

Данная публикация представляет собой перевод статьи « Data Encryption at Rest in MySQL 5.7 » , подготовленной дружной командой проекта Интернет-технологии.ру

Дата: 19:32 03.05.2018

Иногда может пригодится, если нужно сделать на сайте секретную переписку, то может пригодится встроенное в MySQL шифрование. Можно, конечно, и средствами PHP, но это будет лишняя нагрузка на веб-сервер, который обрабатывает каждую команду.

По этому переложим все на MySQL!

В MySQL три способа зашифровать данные, ну и разумеется — расшифровать.

Читайте также:  Почему браузер сам открывает рекламные страницы

Для тех кто использует кирилицу или другие кодировки — все же лучше строку закодировать в Base64, а потом уже шифровать.

Шифрование Дешифрование

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-файла

Читайте также:  Может ли тормозить телефон из за аккумулятора

В MySQL есть несколько встроенных функций шифрования, подробное описание на dev.mysql.com. Рассмотрим основные на примерах c использованием PHP PDO.

Пароли и ключи переданные в запросах SQL отправляются сервер MySQL в открытом виде, если не используется SSL-соединение. Кроме того, такие значения будут отображаться в логах. Чтобы этого избежать рекомендуется шифровать значения на стороне клиента или использовать хранимые процедуры.

Хранение данных в БД

Функции шифрования возвращают зашифрованный текст в виде двоичных данных, поэтому хранить их нужно в полях с типом BLOB:

Алгоритм DES

DES_ENCRYPT(str, key) – шифрует строку с использованием алгоритма Triple-DES.

DES_DECRYPT(crypt_str, key) – расшифровывает строку, если возникает ошибка, эта функция возвращается NULL.

Алгоритм AES

AES, также известный как Rijndael – симметричный алгоритм блочного шифрования, рекомендуется использовать в место DES.

AES_ENCRYPT(str, key) – шифрует строку str ключом key.

AES_DECRYPT(crypt_str, key) – расшифровывает строку.

Ссылка на основную публикацию
Adblock detector