使用CSFLE加密MongoDB数组对象指定字段及schemaMap配置问题
MongoDB CSFLE数组对象部分字段加密schemaMap实现方案
核心逻辑
针对数组内对象的指定字段加密,需要在schemaMap中明确声明数组类型,再在items属性下定义数组元素的结构,仅对需要加密的字段添加encrypt配置即可。之前配置不生效通常是遗漏了数组类型声明或items结构层级错误导致。
可运行schemaMap示例
以下示例针对test库的users集合配置,集合中contacts字段为对象数组,仅加密数组每个元素下的phone、idCard两个字段:
const schemaMap = { "test.users": { bsonType: "object", properties: { // 其他明文字段的配置可放在此处 contacts: { bsonType: "array", // 必须明确声明为数组类型,不可省略 items: { bsonType: "object", // 数组元素为对象类型 properties: { // 明文字段无需加encrypt配置,直接声明类型即可 name: { bsonType: "string" }, // 需要加密的字段添加encrypt配置 phone: { encrypt: { bsonType: "string", // 替换为你自己创建的数据加密密钥(DEK)的Base64 ID keyId: [{ "$binary": { "base64": "替换为你的DEK密钥ID", "subType": "04" } }], // 需等值查询选确定性算法,无需查询选随机算法安全性更高 algorithm: "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } }, idCard: { encrypt: { bsonType: "string", keyId: [{ "$binary": { "base64": "替换为你的DEK密钥ID", "subType": "04" } }], algorithm: "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } } } } } } } }
配置生效注意事项
- 初始化MongoDB客户端时必须正确配置KMS服务商、密钥 Vault 以及上述schemaMap,否则自动加密不会触发
- 加密字段的
bsonType需要和实际写入的字段类型保持一致,否则会报错 - 如果需要对加密字段做等值查询,将算法替换为
AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic即可
内容的提问来源于stack exchange,提问作者Vikas P R
相关产品推荐
相关产品推荐

