CSFLE 限制
Overview
在启用 CSFLE 之前,请考虑这些限制和约束。 某些操作不受支持,而其他操作的行为则不同。
有关兼容性限制,请参阅CSFLE 兼容性。
读写操作支持
mongod
仅存储加密的BinData
,并根据BinData
值应用指定加密字段的任何聚合表达式或查询操作符。虽然表达式或操作符可能支持BinData
字段,但与针对解密值发出相同的表达式或操作符相比,结果值可能不正确或意外。如果表达式或操作符不支持BinData
值, mongod
会引发错误。
例如,考虑一个确定性加密的整数Salary
。 查询筛选Salary
大于100000
的文档。 在发出查询之前,应用程序使用确定性加密对查询值进行显式(手动)加密。 mongod
将100000
的加密BinData
值与每个文档中存储的加密BinData
值进行比较。 虽然操作成功返回,但BinData
值的比较可能会返回与解密整数值的比较不同的结果。
客户端字段级自动加密会拒绝读取或写入操作,因为这些操作在针对加密字段发出时会返回不正确或意外的结果。 有关完整文档,请参阅自动加密支持的操作。
执行显式(手动)加密的应用程序可以引用链接页面作为对加密字段发出读/写操作的指导。
视图
如果底层视图聚合管道 或 查询引用了加密字段,则对包含使用客户端字段级加密功能加密的值的集合上的 视图 进行查询时,可能会返回意外或不正确的结果。如果在包含使用客户端字段级加密的加密值的collection上创建视图,请避免对字段进行操作,以降低出现意外或不正确结果的风险。
虽然为客户端字段级自动加密配置的 4.2+ 兼容驱动程序支持自动加密操作,但对于不支持的读取和写入操作,底层支持库无法对collection目录进行内省以将给定collection标识为视图。 因此,应用程序不能依赖自动客户端字段级加密验证来防止对具有加密字段的collection上的视图进行不支持的查询。
对于使用显式(手动)加密来查询包含加密值的collection上的视图的应用程序,请考虑仅使用在针对加密字段发出时具有已知正常行为的查询操作符来构造查询。
排序规则
客户端字段级加密不遵循用户指定的排序规则或collection默认排序规则。字段级加密会掩盖字段值并阻止正常的排序规则行为。 针对加密字段的排序规则敏感查询可能会返回意外或不正确的结果。
虽然为自动客户端字段级加密配置的 4.2+ 兼容驱动程序支持自动加密操作,但对于不支持的读取和写入操作,底层支持库无法对集合目录进行内省以识别默认排序规则。 因此,应用程序不能依赖客户端字段级加密验证来阻止使用默认排序规则对加密字段进行查询。
Unique Indexes
Unique indexes 如果索引键指定任何 随机加密 字段, 则无法 保证唯一性。
给定特定输入,使用随机算法加密的字段始终会生成不同的加密值。 即使解密值本身不是唯一的,服务器也会认为每个加密值是唯一的。 因此,该collection可以包含多个文档,而这些文档的某个字段具有重复的解密值,而该字段具有索引强制执行的唯一约束。
虽然为自动客户端字段级加密配置的 4.2+ 兼容驱动程序支持对不支持的读取和写入操作进行自动加密,但底层支持库无法自省索引目录以将给定字段标识为唯一字段。 因此,应用程序不能依赖自动客户端字段级加密验证来防止违反随机加密字段的唯一约束条件。
片键
在加密字段上指定分片键或加密现有分片键的字段可能会导致意外或不正确的分片行为。
虽然为自动客户端字段级加密配置的 4.2+ 兼容驱动程序支持自动加密操作,但对于不支持的读取和写入操作,底层支持库无法自省分片目录元数据以识别分片键字段。 因此,应用程序不能依赖自动字段级加密验证来防止对分片键字段进行加密。
读/写查询支持
客户端字段级自动加密支持命令子集、查询操作符、更新操作符、聚合阶段和聚合表达式。有关完整文档,请参阅自动加密支持的操作。