Realm DB-如何在Android中解密Realm DB?

时间:2019-07-01 12:40:00

标签: android realm

我在需要确保数据库安全的应用程序中工作,因此,我正在使用Java中可用的SecureRandom类的领域DB。

这是我的问题-通过使用能够加密数据库的示例,我进行了一些研究。但是,当我重新启动该应用程序时,它崩溃了,下面是代码和日志

例外结果:我想解密数据库并重新启动应用程序。

请在这里提出一些如何解密Realm数据库的建议。

Realm.init(this);

        byte[] key = new byte[64];
        new SecureRandom().nextBytes(key);

        Log.v("Test", Util.bytesToHex(key));

        RealmConfiguration realmConfiguration = new RealmConfiguration.Builder()
                .name(mTableName)
                .encryptionKey(key)
                .schemaVersion(1)
                .deleteRealmIfMigrationNeeded()
                .build();

        Realm.setDefaultConfiguration(realmConfiguration);

解密方法:

private final static char[] hexArray = "0123456789ABCDEF".toCharArray();
    public static String bytesToHex(byte[] bytes) {
        char[] hexChars = new char[bytes.length * 2];
        for ( int j = 0; j < bytes.length; j++ ) {
            int v = bytes[j] & 0xFF;
            hexChars[j * 2] = hexArray[v >>> 4];
            hexChars[j * 2 + 1] = hexArray[v & 0x0F];
        }
        return new String(hexChars);
    }

崩溃日志:

Caused by: io.realm.exceptions.RealmFileException: Unable to open a realm at path '/data/data/com.trident.dpperformance/files/Trident_DB': Realm file decryption failed Path:. (Realm file decryption failed Path: /data/data/com.trident.dpperformance/files/Trident_DB) (/data/data/com.trident.dpperformance/files/Trident_DB) in /Users/Nabil/Dev/realm/master2/realm-java/realm/realm-library/src/main/cpp/io_realm_internal_OsSharedRealm.cpp line 101 Kind: ACCESS_ERROR.
        at io.realm.internal.OsSharedRealm.nativeGetSharedRealm(Native Method)
        at io.realm.internal.OsSharedRealm.<init>(OsSharedRealm.java:171)
        at io.realm.internal.OsSharedRealm.getInstance(OsSharedRealm.java:241)
        at io.realm.internal.OsSharedRealm.getInstance(OsSharedRealm.java:231)
        at io.realm.RealmCache.doCreateRealmOrGetFromCache(RealmCache.java:318)
        at io.realm.RealmCache.createRealmOrGetFromCache(RealmCache.java:284)
        at io.realm.Realm.getDefaultInstance(Realm.java:407)
        at com.trident.dbperformance.RealmController.<init>(RealmController.java:17)
        at com.trident.dbperformance.RealmController.with(RealmController.java:22)
        at com.trident.dbperformance.MainActivity.onCreate(MainActivity.java:26)
        at android.app.Activity.performCreate(Activity.java:7224)

2 个答案:

答案 0 :(得分:0)

这是一篇非常不错的教程。请仔细阅读-

https://medium.com/@strv/encrypted-realm-android-keystore-d4f0915905e9

它具有加密的完整Realm数据库实现-

https://github.com/kotoMJ/db-showcase-android

注意:有关您的问题的更多详细信息,请参阅本教程的“示例应用程序中有关加密领域的更多信息”。

答案 1 :(得分:0)

请勿使用new SecureRandom().nextBytes(key);这种方法来生成密钥。每次您打开应用程序时,都会生成一个新的随机密钥。而对于Realm,您每次都必须使用相同的密钥进行加密和解密。