Шифрование данных в Managed Service for MySQL
Managed Service for MySQL предоставляет инструменты для защиты данных, включая встроенные функции шифрования на уровне столбцов и возможность шифрования на стороне клиента. Эти механизмы обеспечивают безопасность конфиденциальной информации, такой как персональные и финансовые данные.
Встроенные функции шифрования в MySQL
MySQL поддерживает встроенные криптографические функции для шифрования и расшифрования данных на уровне столбцов с использованием алгоритма AES.
Подробнее см. в официальной документации MySQL.
Основные функции
AES_ENCRYPT(plain_text, key_string) — шифрует строку plain_text с использованием ключа key_string и алгоритма AES (по умолчанию AES-128 в режиме ECB).
AES_DECRYPT(encrypted_data, key_string) — расшифровывает данные encrypted_data с использованием того же ключа, который применялся при шифровании.
Рекомендации
Управление ключами — храните ключи шифрования в безопасном месте, например, в специализированных сервисах управления секретами. Избегайте хранения ключей в коде приложения или в базе данных.
- Производительность — тестируйте влияние шифрования на производительность, особенно при работе с большими объёмами данных.
- Безопасность режима:
- включите TLS при создании кластера для защиты данных при передаче между клиентом и сервером MySQL;
- MySQL по умолчанию использует режим ECB, который менее безопасен. Для повышения безопасности рассмотрите шифрование на стороне клиента с более надёжными режимами, такими как GCM или CBC.
Шифрование на стороне клиента (Client-Side Encryption)
Шифрование на стороне клиента позволяет зашифровывать данные перед их отправкой в MySQL и расшифровывать после получения. Это минимизирует доступ к данным на сервере.
Подробнее см. в официальной документации MySQL.
Как работает
Приложение шифрует данные перед вставкой в MySQL (например, через команду INSERT) и расшифровывает после получения (через команду SELECT).
Ключи хранятся на стороне клиента, что исключает их доступность для сервера.
Используемые библиотеки
Python:
cryptography — современная библиотека для выполнения криптографических операций, включая симметричное шифрование (AES-256) и управление ключами. Поддерживает безопасные режимы, такие как GCM;
PyCryptodome — библиотека с поддержкой широкого набора алгоритмов (AES, RSA, ChaCha20) и криптографических примитивов;
JavaScript/Node.js:
crypto — встроенный модуль Node.js, предоставляющий функции для шифрования, хеширования и генерации ключей. Подходит для базовых задач;
crypto-js — легковесная библиотека для выполнения операций шифрования (AES, SHA-256), удобна для веб-приложений;
Java:
Java Cryptography Extension (JCE) — встроенный инструментарий Java для шифрования, включая алгоритмы AES, RSA и SHA. Подходит для большинства приложений;
Bouncy Castle — расширенная библиотека с поддержкой множества криптографических стандартов и форматов, включая дополнительные режимы шифрования;
.NET:
System.Security.Cryptography — встроенная библиотека .NET для реализации шифрования (AES, RSA), хеширования и управления ключами. Обеспечивает высокую производительность и интеграцию с платформой.
Пример
где:
- <host> — внутренний или публичный IP-адрес кластера MySQL, к которому нужно подключиться;
- <логин> — логин пользователя, созданного вручную на вкладке Пользователи;
- <пароль> — пароль пользователя, созданного вручную на вкладке Пользователи;
- <имя базы данных> — имя базы данных, к которой нужно подключиться.
Подробнее см. раздел Доступ к кластеру MySQL.
Пояснение к примеру
Генерация ключа: Fernet.generate_key() создаёт криптографически безопасный ключ для симметричного шифрования с использованием алгоритма AES-128 в режиме CBC.
Подключение к MySQL: устанавливается соединение с базой данных через mysql.connector с указанием параметров подключения.
Шифрование и вставка данных: данные (sensitive_data) шифруются с помощью cipher.encrypt, преобразуются в строку и сохраняются в таблице my_table с помощью команды INSERT.
Получение и расшифрование данных: данные извлекаются командой SELECT, расшифровываются с помощью cipher.decrypt и выводятся в исходном виде.
Закрытие соединения: курсор и соединение закрываются для освобождения ресурсов.
Рекомендации
Управление ключами — храните ключи в сервисах управления секретами. Регулярно обновляйте ключи.
Алгоритмы — используйте AES-256 в режимах GCM или CBC. Избегайте устаревших алгоритмов (DES, MD5).
Производительность — шифруйте только конфиденциальные данные и тестируйте производительность на больших объёмах.
Совместимость — храните зашифрованные данные как TEXT или BLOB. Зашифрованные данные не поддерживают поиск и индексацию.
Безопасность — включите TLS при создании кластера для защиты данных при передаче между клиентом и сервером MySQL. Реализуйте обработку ошибок и аудит операций.