【问题标题】:Realm DB - How to decrypt the Realm DB in Android?Realm DB - 如何在 Android 中解密 Realm DB?
【发布时间】:2019-07-01 12:40:00
【问题描述】:

我在需要保护我的数据库安全的应用程序中工作,因此我正在使用带有SecureRandom 类的领域数据库,该类在 java 中可用。

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

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

这里有人可以建议如何解密 Realm DB。

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)

【问题讨论】:

    标签: android realm


    【解决方案1】:

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

    有关如何根据 Realm 文档加密和正确存储加密密钥的更多信息:https://docs.mongodb.com/realm/sdk/android/advanced-guides/encryption/

    【讨论】:

      猜你喜欢
      • 2020-05-31
      • 1970-01-01
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多