我正在使用 MongoDB 的自动客户端字段级加密,但我观察到字段在集合中没有得到加密。
代表我想要执行字段加密的文档的类使用带有数据密钥 ID 和加密算法的 @Encrypted 注释进行注释 而且我想要加密的类中的字段只是用 @Encypted 注释进行注释。
所以它看起来像这样 ->
@Data // lombok
@Document
@Encrypted (keyID="<the key id>", algorithm= "<The algorithm>")
public class MyDocument{
@Id
private UUID dataID;
@Encrypted
private String fieldToBeEncrypted;
private String otherField;
}
我使用 MongoJsonSchemaCreator 的 createSchemaFor() 方法和过滤器方法 MongoJsonSchemaCreator.encryptedOnly() 来生成 Json Schema,然后从中创建 SchemaMap。
然后我在创建 AutoEncryptionSettings 时填充此 schemaMap。->
MongoClientSettings clientSettings = MongoClientSettings.builder()
.autoEncryptionSettings(AutoEncryptionSettings.builder()
.keyVaultNamespace(keyVaultNamespace)
.kmsProviders(kmsProviders)
.schemaMap(schemaMap)
.extraOptions(extraOptions)
.build())
...(other settings)
.build();
我放入 kmsProviders 中的主密钥是使用 OpenSSL 随机命令生成的 96 字节随机字符。
现在的问题是我没有看到任何数据被加密,而且我在控制台日志中也没有看到任何失败消息。
现在我的问题是->
mongocryptd 进程似乎没有标记要加密的写入字段,因此没有进行加密,但不确定
编辑1:
分享我在 AutoEncryptionSettings 中尝试过的粗略 SchemaMap,但这失败了 ->
schemaMap.put(getDatabaseName() + ".MyDocument", BsonDocument.parse("{"
+ " bsonType: \"object\","
+ " encryptMetadata: {"
+ " keyId: [UUID(\"" + keyUuid + "\")]"
+ " },"
+ " properties: {"
+ " fieldToBeEncrypted: {"
+ " encrypt: {"
+ " bsonType: \"string\","
+ " algorithm: \"AEAD_AES_256_CBC_HMAC_SHA_512-Deterministic\""
+ " }"
+ " }"
+ " }"
+ "}"));
这里的“keyUuid”是使用 ClientEncryption 类的 createDataKey() 方法生成的数据密钥的 UUID。为了传递这个硬编码的 SchemaMap,我暂时在 MyDocument 类上注释了 @Encrypted 注释。
因为它很大,所以将其写为答案:
Where does the actual encryption happens ?
- 在 java 驱动程序内部(特别是在 libmongocrypt 库内部),但 mongocryptd 也是此工作流程所需的守护进程。Is there any settings we have to enable in the mongo cluster in order to enable auto field encryption.
- 有一些选项可以禁用加密,但默认情况下,只要您指定了正确的 schemaMap,它就应该可以工作。are those inter compatible with each other
- 应该是这样,但即使不是,这样简单的功能从一开始就在 csfle 逻辑中。@Encrypted
属性来自哪里,我不是java开发人员,但我在文档中没有找到它。请参阅文章如何配置它这里。另外,为了进一步排除故障,请提供您添加到 clientSettings 的 schemaMap 值。我将生成 schemaMap 的代码放在下面 ->
private Map<String, BsonDocument> generateSchemaMap() {
MongoJsonSchemaCreator schemaCreator = MongoJsonSchemaCreator.create(mappingContext);
Map<String, BsonDocument> schemaMap = new HashMap<>();
Class encryptedEntityClass = MyDocument.class ; //Class that has fields to be encrypted -> MyDocument
MongoJsonSchema schema = schemaCreator
.filter(MongoJsonSchemaCreator.encryptedOnly); // this checks for entity marked with @Encrypted annotation only.
.createSchemaFor(encryptedEntityClass);
schemaMap.put("dbName.MyDocument",
schema.schemaDocument().toBsonDocument(encryptedEntityClass,
MongoClientSettings.getDefaultCodecRegistry()));
return schemaMap;
}
这个 SchemaMap 然后我放入我的 AutoEncryptionSettings ->
MongoClientSettings.Builder.autoEncryptionSettings(
AutoEncryptionSettings.builder()
.keyVaultNamespace(encryptionConfig.getKeyVaultNamespace())
.kmsProviders(LocalKmsUtils.providersMap(encryptionConfig.getMasterKeyPath()))
.schemaMap(generateSchemaMap())
.build())
.build();