ClientEncryption.encrypt()
ClientEncryption.encrypt(keyId, value, algorithm or encOptions)
ClientEncryption.encrypt()
使用指定的keyId
以及algorithm
或encOptions
指定的算法对value
进行加密。encrypt()
支持对字段值进行显式(手动)加密。返回: binary data
具有 子类型6 的 对象 。
语法
clientEncryption = db.getMongo().getClientEncryption() clientEncryption.encrypt( keyId, value, algorithm or encOptions, )
Parameter | 类型 | 说明 |
---|---|---|
keyId | UUID | 用于加密 UUID是具有子类型 |
value | 要加密的值。 | |
algorithm or encOptions | 字符串或文档 |
|
行为
创建加密数据库连接
mongosh
客户端字段级别和可查询Queryable Encryption方法需要为客户端加密配置数据库连接。 如果当前数据库连接不是在启用客户端字段级加密的情况下启动的,则:
or
使用
mongosh
命令行选项,用所需选项建立连接。命令行选项仅支持用于 CMK 管理的 Amazon Web Services KMS 提供商。
不支持的 BSON 类型
不能使用encrypt()
来加密具有以下BSON types的值:
minKey
maxKey
null
undefined
如果使用 AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic
加密字段, encrypt()
不支持以下BSON types :
double
decimal128
bool
object
array
示例
客户端字段级加密 (Client-Side Field Level Encryption)
以下示例使用本地托管的 KMS 进行客户端字段级加密配置。
为本地管理的密钥配置客户端字段级加密:
生成不带换行符的 base64 编码的 96 字节字符串
使用
mongosh
加载密钥
export TEST_LOCAL_KEY=$(echo "$(head -c 96 /dev/urandom | base64 | tr -d '\n')") mongosh --nodb
使用生成的本地密钥字符串创建客户端字段级加密对象:
var autoEncryptionOpts = { "keyVaultNamespace" : "encryption.__dataKeys", "kmsProviders" : { "local" : { "key" : BinData(0, process.env["TEST_LOCAL_KEY"]) } } }
使用配置了客户端字段级加密选项的Mongo()
构造函数来创建数据库连接。 将mongodb://myMongo.example.net
URI 替换为目标集群的连接字符串 URI 。
encryptedClient = Mongo( "mongodb://myMongo.example.net:27017/?replSetName=myMongo", autoEncryptionOpts )
检索ClientEncryption
对象并使用ClientEncryption.encrypt()
方法,通过特定数据加密密钥UUID
和加密算法对值进行加密:
clientEncryption = encryptedClient.getClientEncryption(); clientEncryption.encrypt( UUID("64e2d87d-f168-493c-bbdf-a394535a2cb9"), "123-45-6789", "AEAD_AES_256_CBC_HMAC_SHA_512-Random" )
还可以使用带有 algorithm
字段的文档来指定算法:
clientEncryption = encryptedClient.getClientEncryption(); clientEncryption.encrypt( UUID("64e2d87d-f168-493c-bbdf-a394535a2cb9"), "123-45-6789", { algorithm: "AEAD_AES_256_CBC_HMAC_SHA_512-Random" } )
如果成功, encrypt()
将返回加密后的值:
BinData(6,"AmTi2H3xaEk8u9+jlFNaLLkC3Q/+kmwDbbWrq+h9nuv9W+u7A5a0UnpULBNZH+Q21fAztPpU09wpKPrju9dKfpN1Afpj1/ZhFcH6LYZOWSBBOAuUNjPLxMNSYOOuITuuYWo=")
有关在启用客户端字段级加密的情况下启动 MongoDB 连接的完整文档,请参阅Mongo()
。
可查询加密
以下示例使用本地托管的 KMS 进行 Queryable Encryption 配置。
为本地托管的密钥配置Queryable Encryption需要指定一个没有换行符的基本 64 编码的 96 字节string 。 以下操作生成满足所述要求的密钥并将其加载到mongosh
中:
TEST_LOCAL_KEY=$(echo "$(head -c 96 /dev/urandom | base64 | tr -d '\n')") mongosh --nodb
使用生成的本地密钥字符串创建客户端字段级加密对象:
var autoEncryptionOpts = { "keyVaultNamespace" : "encryption.__keyVault", "kmsProviders" : { "local" : { "key" : BinData(0, process.env["TEST_LOCAL_KEY"]) } } }
使用Mongo()
构造函数创建具有可查询加密选项的数据库连接。 将mongodb://myMongo.example.net
URI 替换为目标集群的连接字符串 URI 。
encryptedClient = Mongo( "mongodb://myMongo.example.net:27017/?replSetName=myMongo", autoEncryptionOpts )
检索ClientEncryption
对象并使用ClientEncryption.encrypt()
方法,通过特定数据加密密钥UUID
和加密算法对值进行加密:
const eDB = "encrypted" const eKV = "__keyVault" const clientEncryption = encryptedClient.getClientEncryption(); const keyVaultClient = Mongo().getDB(eDB).getCollection(eKV) const dek = keyVaultClient.findOne({ keyAltNames: "dataKey1" }) clientEncryption.encrypt( dek._id, "123-45-6789", "Unindexed" )
还可以使用包含字段的文档来指定算法:
algorithm
queryType
contentionFactor
const eDB = "encrypted" const eKV = "__keyVault" const clientEncryption = encryptedClient.getClientEncryption(); const keyVaultClient = Mongo().getDB(eDB).getCollection(eKV) const dek = keyVaultClient.findOne({ keyAltNames: "dataKey1" }) clientEncryption.encrypt( dek._id, "123-45-6789", { algorithm: "Indexed", queryType: "equality", contentionFactor: 4 } )
如果成功, encrypt()
将返回加密后的值:
Binary(Buffer.from("05b100000005640020000000005ab3581a43e39a8e855b1ac87013e841735c09d19ae86535eea718dd56122ba50573002000000000703d2cba9832d90436c6c92eb232aa5b968cdcd7a3138570bc87ef0a9eb3a0e905630020000000009cb61df010b1bb54670a5ad979f25f4c48889059dfd8920782cf03dd27d1a50b05650020000000003f5acea703ea357d3eea4c6a5b19139a580089341424a247839fd4d5cf0d312a12636d00040000000000000000", "hex"), 6)