Поле Шифрование

Поле коллекции: шифрованиеProfessional Edition+

Введение

Вы можете шифровать чувствительные бизнес-данные — например, номера телефонов клиентов, email-адреса или номера карт — чтобы в базе данных они хранились в виде шифротекста.

20251104192513

Метод шифрования

Warning

Плагин автоматически генерирует ключ приложения (application key), который хранится в директории /storage/apps/main/encryption-field-keys.

Каждый application key сохраняется в файле, имя которого является ID ключа, с расширением .key. Не переименовывайте эти файлы.

Храните файлы application key в безопасности. При потере файла application key расшифровать данные будет невозможно.

Если плагин включен в дочернем приложении, ключ хранится по пути /storage/apps/${sub-app-name}/encryption-field-keys

Как это работает

Плагин использует схему Конвертного шифрование.

20251118151143

Создание ключа приложения и ключа поля

  1. При создании первого зашифрованного поля NocoBase автоматически генерирует 32-байтный application key, сохраняет его в директории по умолчанию и кодирует в base64.
  2. При каждом создании нового зашифрованного поля система генерирует случайный 32-байтный ключ поля(field key), шифрует его с использованием application key и случайно сгенерированного 16-байтного вектора инициализации поля (field IV) (AES), затем сохраняет зашифрованный результат в колонке options таблицы fields.

Процесс шифрования поля

  1. При записи данных в зашифрованное поле NocoBase получает зашифрованные field key и field IV из колонки options таблицы fields.
  2. Система расшифровывает field key с использованием application key и field IV. Затем шифрует фактические данные с использованием field key и случайно сгенерированного 16-байтного data IV (AES).
  3. Расшифрованный field key также используется для подписи открытого текста через HMAC-SHA256, в результате чего формируется data signature в base64 (используется позже для запросов).
  4. 16-байтный data IV и ciphertext объединяются и кодируются в base64.
  5. data signature в base64 и ciphertext в base64 объединяются через разделитель ..
  6. Итоговая строка сохраняется в базе данных.

Переменные окружения

Если вы хотите использовать собственный application key, можно задать переменную окружения ENCRYPTION_FIELD_KEY_PATH. Плагин загрузит все .key файлы из этой директории как application keys.

Требования к файлу ключа приложения:

  1. Расширение файла должно быть .key.
  2. Имя файла трактуется как ID ключа; рекомендуется использовать UUID.
  3. Содержимое файла должно быть 32-байтными бинарными данными, закодированными в base64.
ENCRYPTION_FIELD_KEY_PATH=/path/to/my/app-keys/270263524860909922913.key

Настройка поля

20240802173721

Как шифрование влияет на фильтрацию

Зашифрованные поля поддерживают только следующие операторы фильтрации: Равно, Не равно, Существует, Не существует

20240802174042

Внутренний механизм фильтрации

  1. Получить зашифрованный field key и расшифровать его с помощью application key.
  2. Использовать field key для генерации HMAC-SHA256 signature для пользовательского ввода.
  3. Объединить подпись с . и выполнить Поиск по префиксу (prefix search) по значению зашифрованного поля в базе данных.

Ротация ключей

Warning

Перед запуском команды ротации ключей nocobase key-rotation убедитесь, что этот плагин уже включен в приложении.

При переносе приложения в новое окружение может потребоваться заменить старый application key. Для генерации нового application key используйте команду nocobase key-rotation.

Команда требует application key из старого окружения. После запуска NocoBase генерирует новый application key и заменяет старый. Новый ключ сохраняется в директории по умолчанию в кодировке base64.

# --key-path указывает на файл старого application key, соответствующий зашифрованным данным в базе
yarn nocobase key-rotation --key-path /path/to/old-app-keys/270263524860909922913.key

Для ротации ключа дочернего приложения добавьте параметр --app-name:

yarn nocobase key-rotation --app-name a_w0r211vv0az --key-path /path/to/old-app-keys/270263524860909922913.key