MongoDB 4.2字段级加密(FLE)必须由客户端驱动或mongosh显式配置密钥管理,服务端不参与加解密;社区版仅支持显式加密,企业版和Atlas才支持自动加密规则;encrypt()和decrypt()需手动调用,算法选型影响查询能力,DEK须预先创建于__keyVault集合,本地KMS仅限测试,生产必须使用云KMS。

MongoDB 4.2 的字段级加密(FLE)必须通过客户端驱动或 mongosh 显式配置密钥管理,服务端不参与加解密逻辑;社区版仅支持显式加密,自动加密规则功能仅限企业版和 Atlas。
显式加密必须手动调用 ClientEncryption.encrypt() 和 ClientEncryption.decrypt()
你不能把加密当成“开关”一开就全局生效。每次写入敏感字段(如 ssn、phone)前,必须显式调用 encrypt();读取时若要解密,也得手动调用 decrypt(),驱动不会自动处理返回值里的 BinData(6, ...)。
-
encrypt()必须传入三个参数:DEK 的UUID、明文值、算法字符串(如"AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic") - 算法选型直接影响查询能力:
Deterministic支持等值查询,Random不支持任何查询,仅用于保密存储 - 如果连接未配置 KMS(如本地
client.key文件),encrypt()会直接报错KeyNotFound,而不是静默失败 -
decrypt()只能解密由同一 DEK + 同一 KMS 环境加密的值,跨环境(比如开发机加密、生产机解密)需确保密钥文件完全一致且可访问
密钥文件路径和权限必须严格匹配驱动初始化参数
使用本地 KMS 时,mongosh 或 Node.js 驱动加载密钥不是靠环境变量或全局配置,而是硬编码在连接选项的 kmsProviders 字段里。路径写错、权限不对、base64 编码含换行,都会导致 getClientEncryption() 初始化失败。
- 密钥文件必须是 96 字节原始数据经
base64编码后无换行的单行字符串(tr -d '\n'不可省) - 文件权限必须为
600,且运行mongosh或应用进程的用户需有读权限,否则初始化时抛出ENOENT或EACCES - Node.js 驱动中,
kmsProviders.local.key字段值必须是 Buffer(不是字符串),常见错误是直接填入 base64 字符串而未Buffer.from(..., 'base64') - 本地 KMS 仅用于测试;生产必须用 AWS KMS / Azure Key Vault 等,否则密钥与数据库共存等于没加密
DEK(数据加密密钥)必须预先创建并存入 __keyVault 集合
ClientEncryption 不会帮你生成 DEK。你得先用 createDataKey() 创建密钥,并显式插入到 keyVaultNamespace 指定的集合(默认 keyvault.datakeys),否则 encrypt() 找不到对应 UUID 就会失败。
- DEK 创建只需一次,但必须在首次加密前完成;重复执行会生成新密钥,旧数据无法用新密钥解密
-
createDataKey()返回的是 BSON UUID,传给encrypt()时必须保持类型一致,不要 toString() 或 JSON.stringify() - DEK 文档里
masterKey字段必须指向你初始化时配置的 KMS 名称(如"local"),名称不匹配会导致加解密失败且错误信息模糊 - 误删
__keyVault集合或其中某条 DEK 文档,所有用该密钥加密的数据将永久不可读
最易被忽略的是密钥生命周期管理:DEK 一旦写入 __keyVault,就不能修改或轮换——MongoDB 不提供密钥更新接口。业务上需要轮换时,只能新建 DEK、批量重加密字段,并废弃旧密钥,整个过程需应用层自行保障一致性与原子性。


















