简体   繁体   中英

How to configure MongoDB field level encryption?

I tried to use the field-level encryption provided by MongoDB in version 4.2. But I got some errors.

Caused by: java.lang.UnsatisfiedLinkError: %1 不是有效的 Win32 应用程序。

    at com.sun.jna.Native.open(Native Method)
    at com.sun.jna.NativeLibrary.loadLibrary(NativeLibrary.java:278)
    at com.sun.jna.NativeLibrary.getInstance(NativeLibrary.java:455)
    at com.sun.jna.Native.register(Native.java:1722)
    at com.mongodb.crypt.capi.CAPI.<clinit>(CAPI.java:759)
    at com.mongodb.crypt.capi.MongoCryptImpl.<init>(MongoCryptImpl.java:91)
    at com.mongodb.crypt.capi.MongoCrypts.create(MongoCrypts.java:36)
    at com.mongodb.client.internal.Crypts.createCrypt(Crypts.java:35)
    at com.mongodb.Mongo.<init>(Mongo.java:328)
    at com.mongodb.Mongo.<init>(Mongo.java:313)
    at com.mongodb.Mongo.<init>(Mongo.java:309)
    at com.mongodb.MongoClient.<init>(MongoClient.java:328)

Then I modified jdk to 32 bits and I got another error message.

Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\Users\longf\AppData\Local\Temp\jna-103156074\jna6619363862608272389.dll: Can't load AMD 64-bit .dll on a IA 32-bit platform
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824)
    at java.lang.Runtime.load0(Runtime.java:809)
    at java.lang.System.load(System.java:1086)
    at com.sun.jna.Native.loadNativeDispatchLibraryFromClasspath(Native.java:947)
    at com.sun.jna.Native.loadNativeDispatchLibrary(Native.java:922)
    at com.sun.jna.Native.<clinit>(Native.java:190)
    at com.mongodb.crypt.capi.CAPI.<clinit>(CAPI.java:759)
    at com.mongodb.crypt.capi.MongoCryptImpl.<init>(MongoCryptImpl.java:91)
    at com.mongodb.crypt.capi.MongoCrypts.create(MongoCrypts.java:36)
    at com.mongodb.client.internal.Crypts.createCrypt(Crypts.java:35)
    at com.mongodb.client.internal.MongoClientImpl.<init>(MongoClientImpl.java:70)
    at com.mongodb.client.internal.MongoClientImpl.<init>(MongoClientImpl.java:61)
    at com.mongodb.client.MongoClients.create(MongoClients.java:114)
    at com.mongodb.client.MongoClients.create(MongoClients.java:50)
OS: Windows 10
MongoDB version: 4.2.0
mongo-java-driver: 3.11.0
mongodb-crypt: 1.0.0-beta4
        System.setProperty("jna.prefix", "win32-x86-64");

        final byte[] localMasterKey = new byte[96];
        new SecureRandom().nextBytes(localMasterKey);

        Map<String, Map<String, Object>> kmsProviders = new HashMap<String, Map<String, Object>>() {{
            put("local", new HashMap<String, Object>() {{
                put("key", localMasterKey);
            }});
        }};

        String keyVaultNamespace = "admin.datakeys";

        AutoEncryptionSettings autoEncryptionSettings = AutoEncryptionSettings.builder()
                                                                              .keyVaultNamespace(keyVaultNamespace)
                                                                              .kmsProviders(kmsProviders)
                                                                              .build();

        MongoClientSettings clientSettings = MongoClientSettings.builder()
                                                                .autoEncryptionSettings(autoEncryptionSettings)
                                                                .build();

        MongoClient mongoClient = MongoClients.create(clientSettings);
        MongoCollection<Document> collection = mongoClient.getDatabase("test").getCollection("coll");
        collection.drop(); // Clear old data

        collection.insertOne(new Document("encryptedField", "123456789"));

        System.out.println(collection.find().first().toJson());

https://mongodb.github.io/mongo-java-driver/3.11/driver/tutorials/client-side-encryption/#mongocryptd-configuration

Update

java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

Error:

Caused by: java.lang.UnsatisfiedLinkError: %1 不是有效的 Win32 应用程序。
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) Client VM (build 25.221-b11, mixed mode)

Error:

Can't load AMD 64-bit .dll on a IA 32-bit platform

It seems like application is trying to load a native library like ".dll" and that library does not exist in that paths of PATH environment variable and java.library.path system property. Please check the value passed in the System.loadLibrary method is correct and that the library actually exists. Moreover you can try to provide absolute path of the library.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM