最新的稳定版请使用 Spring Data MongoDB 4.3.1Spring中文文档

最新的稳定版请使用 Spring Data MongoDB 4.3.1Spring中文文档

客户端加密是一项功能,可在将应用程序中的数据发送到 MongoDB 之前对其进行加密。 我们建议您熟悉这些概念,最好先从MongoDB文档中了解有关其功能和限制的更多信息,然后再继续通过Spring Data应用加密。Spring中文文档

请确保将驱动程序设置为使用客户端加密。 MongoDB 不支持所有字段类型的加密。 特定数据类型需要确定性加密,以保持相等性比较功能。com.mongodb.AutoEncryptionSettingsSpring中文文档

请确保将驱动程序设置为使用客户端加密。 MongoDB 不支持所有字段类型的加密。 特定数据类型需要确定性加密,以保持相等性比较功能。com.mongodb.AutoEncryptionSettingsSpring中文文档

自动加密

MongoDB支持使用具有自动加密功能的MongoDB驱动程序进行开箱即用的客户端字段级加密。 自动加密需要一个 JSON 架构,该架构允许执行加密的读写操作,而无需提供显式的 en-/decryption 步骤。Spring中文文档

有关定义包含加密信息的 JSON 架构的更多信息,请参阅 JSON 架构部分。Spring中文文档

要利用它,它需要与可以完成的结合,例如。通过 .MongoJsonSchemaAutoEncryptionSettingsMongoClientSettingsBuilderCustomizerSpring中文文档

@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@ExplicitEncryptedSpring中文文档

带注释的字段始终作为整体加密。 请看以下示例:@ExplicitEncryptedSpring中文文档

@ExplicitEncrypted(…)
String simpleValue;        (1)

@ExplicitEncrypted(…)
Address address;           (2)

@ExplicitEncrypted(…)
List<...> list;            (3)

@ExplicitEncrypted(…)
Map<..., ...> mapOfString; (4)
1 加密简单类型的值,例如 if not 。Stringnull
2 将整个对象及其所有嵌套字段加密为 。 要仅加密 ,例如 中的字段需要用 进行注释。AddressDocumentAddressAddress#streetstreetAddress@ExplicitEncrypted
3 Collection类似 -like 的字段被加密为单个值,而不是每个条目。
4 Map类似 -like 的字段作为单个值加密,而不是作为键/值条目加密。

客户端字段级加密允许您在确定性算法和随机算法之间进行选择。根据所选的算法,可能支持不同的操作。 要选择某个算法,请使用 ,请参阅算法常量。 请阅读加密类型手册,了解有关算法及其用法的更多信息。@ExplicitEncrypted(algorithm)EncryptionAlgorithmsSpring中文文档

要执行实际加密,我们需要数据加密密钥 (DEK)。 有关如何设置密钥管理和创建数据加密密钥的更多信息,请参阅MongoDB文档。 DEK 可以通过其或定义的替代名称直接引用。 注释仅允许通过备用名称引用 DEK。 可以向任何 DEK 提供 ,稍后将讨论。id@EncryptedFieldEncryptionKeyResolverSpring中文文档

例 1.引用数据加密密钥
@EncryptedField(algorithm=…, altKeyName = "secret-key") (1)
String ssn;
@EncryptedField(algorithm=…, altKeyName = "/name")      (2)
String ssn;
1 使用与备用名称 .secret-key
2 使用将读取实际字段值并将其用于键查找的字段引用。 始终要求存在完整的文档才能执行保存操作。 字段不能用于查询/聚合。

默认情况下,该属性引用 . 通过提供相应的类型引用,可以更改默认实现并将其与任何实现交换。 要了解有关自定义和所需配置的更多信息,请参阅属性转换器 - 映射特定字段部分。@ExplicitEncrypted(value=…)MongoEncryptionConverterPropertyValueConverterPropertyValueConvertersSpring中文文档

MongoEncryptionConverter 安装程序

转换器设置需要几个步骤,因为涉及多个组件。 Bean 设置包括以下内容:MongoEncryptionConverterSpring中文文档

  1. 发动机ClientEncryptionSpring中文文档

  2. 配置了 和 的实例。MongoEncryptionConverterClientEncryptionEncryptionKeyResolverSpring中文文档

  3. 使用已注册 Bean 的 A。PropertyValueConverterFactoryMongoEncryptionConverterSpring中文文档

使用带注释的键解析的副作用是注释不需要指定 alt 键名称。 使用提供对属性的访问,允许动态 DEK 解析。@ExplicitEncryptedEncryptionKeyResolverEncryptionContextSpring中文文档

例 2.示例 MongoEncryptionConverter 配置
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 会处理这个问题,因为 .Encryptioncom.mongodb.client.vault.ClientEncryptionClientEncryptionCloseable
2 设置基于注释以确定 from 注释。EncryptionKeyResolverEncryptionKey
3 创建 .MongoEncryptionConverter
4 启用从 .PropertyValueConverterBeanFactory

带注释的字段始终作为整体加密。 请看以下示例:@ExplicitEncryptedSpring中文文档

@ExplicitEncrypted(…)
String simpleValue;        (1)

@ExplicitEncrypted(…)
Address address;           (2)

@ExplicitEncrypted(…)
List<...> list;            (3)

@ExplicitEncrypted(…)
Map<..., ...> mapOfString; (4)
1 加密简单类型的值,例如 if not 。Stringnull
2 将整个对象及其所有嵌套字段加密为 。 要仅加密 ,例如 中的字段需要用 进行注释。AddressDocumentAddressAddress#streetstreetAddress@ExplicitEncrypted
3 Collection类似 -like 的字段被加密为单个值,而不是每个条目。
4 Map类似 -like 的字段作为单个值加密,而不是作为键/值条目加密。
1 加密简单类型的值,例如 if not 。Stringnull
2 将整个对象及其所有嵌套字段加密为 。 要仅加密 ,例如 中的字段需要用 进行注释。AddressDocumentAddressAddress#streetstreetAddress@ExplicitEncrypted
3 Collection类似 -like 的字段被加密为单个值,而不是每个条目。
4 Map类似 -like 的字段作为单个值加密,而不是作为键/值条目加密。
1 使用与备用名称 .secret-key
2 使用将读取实际字段值并将其用于键查找的字段引用。 始终要求存在完整的文档才能执行保存操作。 字段不能用于查询/聚合。
1 使用 设置引擎。 实例是有状态的,使用后必须关闭。 Spring 会处理这个问题,因为 .Encryptioncom.mongodb.client.vault.ClientEncryptionClientEncryptionCloseable
2 设置基于注释以确定 from 注释。EncryptionKeyResolverEncryptionKey
3 创建 .MongoEncryptionConverter
4 启用从 .PropertyValueConverterBeanFactory