java MongoDB自动客户端字段级加密|mongoCryptD守护进程未标记要加密的字段

hfyxw5xn  于 2023-08-01  发布在  Java
关注(0)|答案(2)|浏览(165)

我正在使用MongoDB的自动客户端字段级加密,但我观察到集合中的字段没有加密。

  • 我使用的MongoDB-crypt库是1.6.1
  • mongo驱动核心和同步版本是4.9.1
  • MongoCryptD版本为5.0.3
  • 操作系统为Linux(RHEL 7.9)
  • MongoDB 4.2.11企业版。
  • Java JDK- 17

表示我想要执行字段加密的文档的Class使用带有数据密钥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中放入的主密钥是一个96字节的随机字符,我使用OpenSSL random命令生成。
现在的问题是,我没有看到任何数据被加密,也没有看到任何失败的消息,在控制台日志。
现在我的问题是->
1.实际的加密发生在哪里?它肯定不是在mongocryptd中,因为文档是这样说的。那么,究竟是什么在处理加密呢?
1.为了启用自动字段加密,我们必须在mongo集群中启用任何设置吗?
1.我在问题的最前面提到的版本是那些相互兼容的版本,也是那些与Linux操作系统兼容的版本?
1.是否有任何检查表,我可以使用,以解决这个问题的加密没有发生?
看起来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()方法生成的datakey的UUID。为了传递这个硬编码的SchemaMap,我暂时在MyDocument类上注解了@Encrypted注解。

n3h0vuf2

n3h0vuf21#

因为它很大,所以把它写为答案:

  1. Where does the actual encryption happens ?-在java驱动程序中(特别是在libmongocrypt库中),但mongocryptd也是此工作流所需的守护进程。
  2. Is there any settings we have to enable in the mongo cluster in order to enable auto field encryption.-有一些选项可以禁用加密,但默认情况下,只要您指定了正确的schemaMap,它就应该工作。
  3. are those inter compatible with each other-它应该,但即使没有,这样简单的功能从一开始就在csfle逻辑中。
  4. @Encrypted属性是从哪里来的,我不是java开发人员,但我没有在文档中找到它。请参阅文章如何配置here。此外,为了进一步诊断,请提供您添加到clientSettings的schemaMap值。
lg40wkob

lg40wkob2#

我将生成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();

相关问题