加密

数据表字段:加密专业版+

介绍

一些私密的业务数据,如客户手机号、邮箱地址、卡号等,可以进行加密,加密后,以密文的方式被存储至数据库中。

20251104192513

加密方式

Warning

插件会自动生成一个应用密钥,该密钥保存在 /storage/apps/main/encryption-field-keys 目录中。

应用密钥文件名为密钥 ID ,后缀名为 .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. 文件名将作为密钥ID使用,最好使用uuid保证唯一性。
  3. 文件内容为 base64 编码的 32 位二进制数据。
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