Шифрование данных в 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).

    INSERT INTO sensitive_data (user_id, sensitive_info)
    VALUES (1, AES_ENCRYPT('Очень секретная информация', 'ваш_секретный_ключ'));

    Функция шифрует строку 'Очень секретная информация' с ключом 'ваш_секретный_ключ', сохраняя зашифрованные данные в столбце sensitive_info.

  • AES_DECRYPT(encrypted_data, key_string) — расшифровывает данные encrypted_data с использованием того же ключа, который применялся при шифровании.

    SELECT user_id, AES_DECRYPT(sensitive_info, 'ваш_секретный_ключ') AS decrypted_info
    FROM sensitive_data
    WHERE user_id = 1;

    Функция расшифровывает данные из столбца sensitive_info, возвращая исходную строку, если ключ верный.

Рекомендации

  1. Управление ключами — храните ключи шифрования в безопасном месте, например, в специализированных сервисах управления секретами. Избегайте хранения ключей в коде приложения или в базе данных.

  2. Производительность — тестируйте влияние шифрования на производительность, особенно при работе с большими объёмами данных.
  3. Безопасность режима:
    • включите TLS при создании кластера для защиты данных при передаче между клиентом и сервером MySQL;
    • MySQL по умолчанию использует режим ECB, который менее безопасен. Для повышения безопасности рассмотрите шифрование на стороне клиента с более надёжными режимами, такими как GCM или CBC.

Шифрование на стороне клиента (Client-Side Encryption)

Шифрование на стороне клиента позволяет зашифровывать данные перед их отправкой в MySQL и расшифровывать после получения. Это минимизирует доступ к данным на сервере.

Подробнее см. в официальной документации MySQL.

Как работает

  1. Приложение шифрует данные перед вставкой в MySQL (например, через команду INSERT) и расшифровывает после получения (через команду SELECT).

  2. Ключи хранятся на стороне клиента, что исключает их доступность для сервера.

Используемые библиотеки

  • 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), хеширования и управления ключами. Обеспечивает высокую производительность и интеграцию с платформой.

Пример

from cryptography.fernet import Fernet
import mysql.connector

# Генерация ключа
key = Fernet.generate_key()
cipher = Fernet(key)

# Подключение к MySQL
conn = mysql.connector.connect(host='<host>', port=3306, user='<логин>', password='<пароль>', database='<имя базы данных>')
cursor = conn.cursor()

# Шифрование и вставка данных
sensitive_data = "sensitive_value"
encrypted_data = cipher.encrypt(sensitive_data.encode()).decode()
cursor.execute("INSERT INTO my_table (id, encrypted_data) VALUES (%s, %s)", (1, encrypted_data))
conn.commit()

# Получение и расшифрование данных
cursor.execute("SELECT encrypted_data FROM my_table WHERE id = %s", (1,))
result = cursor.fetchone()
decrypted_data = cipher.decrypt(result[0].encode()).decode()
print(decrypted_data)  # Вывод: sensitive_value

cursor.close()
conn.close()

где:

  • <host> — внутренний или публичный IP-адрес кластера MySQL, к которому нужно подключиться;
  • <логин> — логин пользователясозданного вручную на вкладке Пользователи;
  • <пароль> — пароль пользователясозданного вручную на вкладке Пользователи;
  • <имя базы данных> — имя базы данных, к которой нужно подключиться.

Подробнее см. раздел Доступ к кластеру MySQL.

Пояснение к примеру

  1. Генерация ключа: Fernet.generate_key() создаёт криптографически безопасный ключ для симметричного шифрования с использованием алгоритма AES-128 в режиме CBC.

  2. Подключение к MySQL: устанавливается соединение с базой данных через mysql.connector с указанием параметров подключения.

  3. Шифрование и вставка данных: данные (sensitive_data) шифруются с помощью cipher.encrypt, преобразуются в строку и сохраняются в таблице my_table с помощью команды INSERT.

  4. Получение и расшифрование данных: данные извлекаются командой SELECT, расшифровываются с помощью cipher.decrypt и выводятся в исходном виде.

  5. Закрытие соединения: курсор и соединение закрываются для освобождения ресурсов.

Рекомендации

  1. Управление ключами — храните ключи в сервисах управления секретами. Регулярно обновляйте ключи.

  2. Алгоритмы — используйте AES-256 в режимах GCM или CBC. Избегайте устаревших алгоритмов (DES, MD5).

  3. Производительность — шифруйте только конфиденциальные данные и тестируйте производительность на больших объёмах.

  4. Совместимость — храните зашифрованные данные как TEXT или BLOB. Зашифрованные данные не поддерживают поиск и индексацию.

  5. Безопасностьвключите TLS при создании кластера для защиты данных при передаче между клиентом и сервером MySQL. Реализуйте обработку ошибок и аудит операций.