Шифрование

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

Введение

Некоторые конфиденциальные бизнес-данные, такие как номера телефонов клиентов, адреса электронной почты, номера карт и т. д., можно зашифровать. После шифрования они хранятся в базе данных в виде шифротекста.

20251104192513

Способ шифрования

Warning

Плагин автоматически создаёт 应用密钥. Этот ключ хранится в каталоге /storage/apps/main/encryption-field-keys.

Имя файла 应用密钥 является идентификатором ключа, а расширение — .key. Не изменяйте имя файла без необходимости.

Храните файл 应用密钥 в надёжном месте. Если файл 应用密钥 будет утерян, расшифровать зашифрованные данные будет невозможно.

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

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

Используется конвертное шифрование

20251118151339

Процесс создания ключа

  1. При первом создании зашифрованного поля система автоматически генерирует 32-битный 应用密钥 и сохраняет его в кодировке base64 в каталоге хранения по умолчанию.
  2. При каждом создании нового зашифрованного поля для этого поля генерируется случайный 32-битный 字段密钥, который затем шифруется с использованием 应用密钥 и случайно сгенерированного 16-битного 字段加密向量 (алгоритм шифрования AES), после чего сохраняется в таблице fields, в поле options.

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

  1. При каждой записи данных в зашифрованное поле сначала из таблицы fields, из поля options, извлекаются зашифрованные 字段密钥 и 字段加密向量.
  2. С помощью 应用密钥 и 字段加密向量 расшифровывается зашифрованный 字段密钥, затем данные шифруются с использованием 字段密钥 и случайно сгенерированного 16-битного 数据加密向量 (алгоритм шифрования AES).
  3. С использованием расшифрованного 字段密钥 данные подписываются (алгоритм дайджеста HMAC-SHA256), а затем преобразуются в строку в кодировке base64 (созданный 数据签名 впоследствии используется для поиска данных).
  4. 16-битный 数据加密向量 и зашифрованный 数据密文 объединяются в двоичном виде и преобразуются в строку в кодировке base64.
  5. Строка в кодировке base64 数据签名 и объединённая строка в кодировке base64 数据密文 соединяются через разделитель '.'.
  6. Итоговая объединённая строка сохраняется в базе данных.

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

Чтобы указать 应用密钥, можно использовать переменную окружения ENCRYPTION_FIELD_KEY_PATH. Плагин загрузит файл из указанного пути в качестве 应用密钥.

应用密钥Требования к формату файла:

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

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

20240802173721

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

Для зашифрованных полей поддерживаются только операторы: равно, не равно, существует и не существует.

20240802174042

Способ фильтрации данных:

  1. Получите 字段密钥 зашифрованного поля и используйте 应用密钥 для расшифровки 字段密钥.
  2. Подпишите введённый пользователем текст поиска с помощью 字段密钥 (алгоритм дайджеста HMAC-SHA256).
  3. Объедините подписанный текст поиска с разделителем . и выполните поиск по префиксу зашифрованного поля в базе данных.

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

Warning

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

После переноса приложения в новую среду, если вы не хотите продолжать использовать тот же ключ, что и в старой среде, можно использовать команду nocobase key-rotation, чтобы заменить 应用密钥.

Для выполнения команды ротации ключей необходимо указать ключ приложения из старой среды. После выполнения команды будет создан новый ключ приложения, который заменит старый ключ. Новый ключ приложения сохраняется в кодировке base64 в каталоге хранения по умолчанию.

# --key-path 指定的是和数据库加密数据对应的旧环境的应用密钥文件
 yarn nocobase key-rotation --key-path /path/to/old-app-keys/270263524860909922913.key

Если заменяется дочернее приложение 应用密钥, необходимо добавить параметр --app-name и указать name

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