Открыть сервис

Шифрование на уровне столбцов

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

История

Концепция шифрования отдельных полей в базах данных возникла в конце 1990-х — начале 2000-х годов как реакция на ужесточение требований к защите персональных данных (например, в связи с принятием в США закона HIPAA для медицинской информации и стандарта PCI DSS для платёжных данных). Первые реализации были встроены в коммерческие СУБД (Oracle, Microsoft SQL Server) в виде дополнительных модулей или функций.

В 2005 году в Microsoft SQL Server 2005 была представлена функция шифрования столбцов с помощью встроенных криптографических функций (ENCRYPTBYKEY, DECRYPTBYKEY). В 2014 году компания Microsoft выпустила технологию Always Encrypted, которая шифрует данные на стороне клиента, не раскрывая ключи серверу. В 2016 году в PostgreSQL появилось расширение pgcrypto, позволяющее шифровать отдельные столбцы с использованием симметричных алгоритмов. В 2018 году в MySQL 8.0 была добавлена возможность шифрования табличных пространств, но не отдельных столбцов напрямую — для этого используются триггеры или пользовательские функции.

Принцип работы

Шифрование на уровне столбцов может быть реализовано двумя основными способами:

Серверное шифрование

Ключи шифрования хранятся на сервере базы данных. При записи данных СУБД автоматически шифрует содержимое столбца с помощью заданного алгоритма (например, AES-256) и ключа. При чтении — расшифровывает. Пользователь или приложение не видят процесса шифрования, работая с данными как с обычными. Недостаток: администратор базы данных имеет доступ к ключам и может расшифровать данные.

Клиентское шифрование (end-to-end)

Ключи шифрования генерируются и хранятся на стороне клиента (приложения). Сервер базы данных получает уже зашифрованные данные и не имеет доступа к открытому тексту. Расшифровка происходит только на стороне клиента. Пример — технология Always Encrypted в Microsoft SQL Server. Этот подход обеспечивает более высокий уровень безопасности, но ограничивает возможности сервера по обработке данных (например, невозможно выполнить поиск по подстроке или сортировку зашифрованного столбца).

Алгоритмы шифрования

Для шифрования на уровне столбцов используются симметричные алгоритмы с длиной ключа не менее 128 бит:

  • AES (Advanced Encryption Standard) — наиболее распространённый алгоритм, поддерживается всеми современными СУБД.
  • Triple DES — устаревший алгоритм, используется редко из-за низкой производительности.
  • Blowfish / Twofish — применяются в некоторых реализациях (например, в расширении pgcrypto для PostgreSQL).

Асимметричные алгоритмы (RSA) для шифрования столбцов используются редко из-за низкой скорости и ограничений на размер данных.

Реализации в популярных СУБД

Microsoft SQL Server

  • Always Encrypted (с 2016 года) — клиентское шифрование, поддерживает детерминированное (одинаковые открытые значения дают одинаковый шифротекст) и случайное шифрование. Детерминированное шифрование позволяет выполнять поиск по точному совпадению и объединение таблиц по зашифрованным столбцам.
  • Cell-level encryption (с 2005 года) — серверное шифрование с использованием сертификатов и симметричных ключей.

Oracle Database

  • Transparent Data Encryption (TDE) для столбцов — серверное шифрование, автоматически шифрует данные при записи на диск и расшифровывает при чтении. Поддерживает AES, Triple DES.
  • Oracle Advanced Security — опциональный модуль, добавляющий шифрование столбцов с управлением ключами через Oracle Key Vault.

PostgreSQL

  • Расширение pgcrypto — предоставляет функции encrypt() и decrypt() с поддержкой AES, Blowfish, PGP-шифрования. Шифрование выполняется на уровне запросов, что требует явного вызова функций.
  • pg_column_encryption (стороннее расширение) — автоматическое шифрование столбцов с использованием ключей, хранящихся в отдельной таблице.

MySQL / MariaDB

  • Встроенное шифрование на уровне столбцов отсутствует. Реализуется через триггеры или пользовательские функции с использованием AES_ENCRYPT() / AES_DECRYPT().
  • В MariaDB 10.1+ есть возможность шифрования табличных пространств, но не отдельных столбцов.

SQLite

  • Расширение SEE (SQLite Encryption Extension) — коммерческое, шифрует всю базу данных целиком. Для шифрования отдельных столбцов используются пользовательские функции на основе sqlite3_create_function().

Преимущества и недостатки

Преимущества

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

Недостатки

  • Снижение производительности — операции шифрования/расшифровки требуют дополнительных вычислительных ресурсов, особенно при массовых операциях.
  • Ограничения на запросы — при клиентском шифровании невозможно выполнять операции сравнения (кроме точного совпадения при детерминированном шифровании), сортировку, агрегацию по зашифрованным столбцам.
  • Управление ключами — требуется безопасное хранение и ротация ключей, что усложняет администрирование.
  • Уязвимость к атакам по побочным каналам — при детерминированном шифровании злоумышленник может определить частоту встречаемости значений.

Применение

  • Финансовый сектор — шифрование номеров банковских карт, счетов, транзакций (требования PCI DSS).
  • Медициназащита персональных данных пациентов (требования HIPAA, 152-ФЗ «О персональных данных» в РФ).
  • Электронная коммерция — хранение паролей, адресов доставки, платёжных реквизитов.
  • Государственные информационные системы — защита данных, содержащих государственную тайну или персональные данные (требования 152-ФЗ, 98-ФЗ «О коммерческой тайне»).

Критика и ограничения

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

В России использование криптографических средств регулируется Федеральным законом № 63-ФЗ «Об электронной подписи» и приказами ФСБ России, которые требуют сертификации алгоритмов шифрования (ГОСТ 28147-89, ГОСТ Р 34.12-2015). Иностранные алгоритмы (AES) в государственных информационных системах допускаются только при наличии сертификата ФСБ.

Альтернативы

  • Шифрование на уровне файловой системы (например, BitLocker, LUKS) — шифрует весь диск или раздел, но не позволяет гибко управлять доступом к отдельным полям.
  • Шифрование на уровне базы данных (TDE для табличных пространств) — шифрует все данные в таблице или базе, но не даёт избирательности.
  • Динамическое маскирование данных — скрывает данные от определённых пользователей без изменения хранимых значений (например, замена символов на «*»).
  • Гомоморфное шифрование — позволяет выполнять вычисления над зашифрованными данными без расшифровки, но на практике пока не применяется из-за крайне низкой производительности.

Источники

  • Microsoft Docs. «Always Encrypted (Database Engine)».
  • Oracle Help Center. «Transparent Data Encryption».
  • PostgreSQL Documentation. «pgcrypto».
  • MySQL 8.0 Reference Manual. «Encryption Functions».
  • Федеральный закон от 27.07.2006 № 152-ФЗ «О персональных данных».
  • Стандарт PCI DSS v4.0.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →