我正在使用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注解。
2条答案
按热度按时间n3h0vuf21#
因为它很大,所以把它写为答案:
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开发人员,但我没有在文档中找到它。请参阅文章如何配置here。此外,为了进一步诊断,请提供您添加到clientSettings的schemaMap值。lg40wkob2#
我将生成schemaMap的代码放在下面->
字符串
这个SchemaMap然后我把我的AutoEncryptionSettings ->
型