此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Data MongoDB 4.4.0! |
加密 (CSFLE)
Client Side Encryption 是一项功能,可在将应用程序中的数据发送到 MongoDB 之前对其进行加密。 我们建议您熟悉这些概念,最好先从 MongoDB 文档 中了解有关其功能和限制的更多信息,然后再继续通过 Spring Data 应用加密。
确保将驱动程序设置为使用客户端加密。
MongoDB 不支持对所有字段类型进行加密。
特定数据类型需要确定性加密以保留相等比较功能。 |
自动加密
MongoDB 使用 MongoDB 驱动程序及其自动加密功能支持开箱即用的客户端字段级加密。 自动加密需要一个 JSON 架构,该架构允许执行加密的读取和写入操作,而无需提供显式的 en-/decryption 步骤。
请参阅 JSON 架构 有关定义包含加密信息的 JSON 架构的更多信息。
要使用 it 需要与 which 可以完成 for g.通过 .MongoJsonSchema
AutoEncryptionSettings
MongoClientSettingsBuilderCustomizer
@Bean
MongoClientSettingsBuilderCustomizer customizer(MappingContext mappingContext) {
return (builder) -> {
// ... keyVaultCollection, kmsProvider, ...
MongoJsonSchemaCreator schemaCreator = MongoJsonSchemaCreator.create(mappingContext);
MongoJsonSchema patientSchema = schemaCreator
.filter(MongoJsonSchemaCreator.encryptedOnly())
.createSchemaFor(Patient.class);
AutoEncryptionSettings autoEncryptionSettings = AutoEncryptionSettings.builder()
.keyVaultNamespace(keyVaultCollection)
.kmsProviders(kmsProviders)
.extraOptions(extraOpts)
.schemaMap(Collections.singletonMap("db.patient", patientSchema.schemaDocument().toBsonDocument()))
.build();
builder.autoEncryptionSettings(autoEncryptionSettings);
};
}
显式加密
显式加密使用 MongoDB 驱动程序的加密库 () 来执行加密和解密任务。
该注释是用于创建 JSON 架构的注释和属性转换器的组合。
换句话说,使用现有构建块将它们组合起来,以实现简化的显式加密支持。org.mongodb:mongodb-crypt
@ExplicitEncrypted
@Encrypted
@ExplicitEncrypted
带注释的字段始终作为整体加密。
请考虑以下示例:
|
Client-Side Field Level Encryption 允许您在确定性算法和随机算法之间进行选择。根据所选的算法,可能支持不同的操作。
要选择特定算法,请使用 ,请参阅 有关算法常量。
请阅读 加密类型 手册 以了解有关算法及其用法的更多信息。@ExplicitEncrypted(algorithm)
EncryptionAlgorithms
要执行实际加密,我们需要数据加密密钥 (DEK)。
有关如何设置密钥管理和创建数据加密密钥的更多信息,请参阅 MongoDB 文档。
DEK 可以通过其名称或定义的替代名称直接引用。
注释仅允许通过备用名称引用 DEK。
可以向任何 DEK 提供 ,稍后将对此进行讨论。id
@EncryptedField
EncryptionKeyResolver
@EncryptedField(algorithm=…, altKeyName = "secret-key") (1)
String ssn;
@EncryptedField(algorithm=…, altKeyName = "/name") (2)
String ssn;
1 | 使用与备用名称一起存储的 DEK 。secret-key |
2 | 使用字段引用,该引用将读取实际字段值并将其用于键查找。 始终要求存在完整的文档才能进行保存操作。 字段不能用于查询/聚合。 |
默认情况下,该属性引用 .
通过提供相应的类型引用,可以更改默认实现并将其与任何实现交换。
要了解有关自定义和所需配置的更多信息,请参阅 Property Converters — 映射特定字段 中。@ExplicitEncrypted(value=…)
MongoEncryptionConverter
PropertyValueConverter
PropertyValueConverters
MongoEncryptionConverter 设置
由于涉及多个组件,因此 的转换器设置需要几个步骤。
Bean 设置包括以下内容:MongoEncryptionConverter
-
发动机
ClientEncryption
-
配置了 .
MongoEncryptionConverter
ClientEncryption
EncryptionKeyResolver
-
A 使用已注册的 Bean。
PropertyValueConverterFactory
MongoEncryptionConverter
使用带注释的键解析的副作用是 Comments 不需要指定 alt 键名称。
它使用对允许动态 DEK 解析的属性的访问。@ExplicitEncrypted
EncryptionKeyResolver
EncryptionContext
class Config extends AbstractMongoClientConfiguration {
@Autowired ApplicationContext appContext;
@Bean
ClientEncryption clientEncryption() { (1)
ClientEncryptionSettings encryptionSettings = ClientEncryptionSettings.builder();
// …
return ClientEncryptions.create(encryptionSettings);
}
@Bean
MongoEncryptionConverter encryptingConverter(ClientEncryption clientEncryption) {
Encryption<BsonValue, BsonBinary> encryption = MongoClientEncryption.just(clientEncryption);
EncryptionKeyResolver keyResolver = EncryptionKeyResolver.annotated((ctx) -> …); (2)
return new MongoEncryptionConverter(encryption, keyResolver); (3)
}
@Override
protected void configureConverters(MongoConverterConfigurationAdapter adapter) {
adapter
.registerPropertyValueConverterFactory(PropertyValueConverterFactory.beanFactoryAware(appContext)); (4)
}
}
1 | 使用 设置引擎。
该实例是有状态的,使用后必须关闭。
Spring 会处理这个问题,因为 是 。Encryption com.mongodb.client.vault.ClientEncryption ClientEncryption Closeable |
2 | 设置基于 annotation 以确定 from annotations。EncryptionKeyResolver EncryptionKey |
3 | 创建 .MongoEncryptionConverter |
4 | 启用此选项可从 中查找。PropertyValueConverter BeanFactory |