首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Realm DB -如何在Android中解密Realm DB?

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

Stack Overflow用户
提问于 2019-07-01 20:40:00
回答 1查看 913关注 0票数 0

我在应用程序中工作,我需要保持我的DB安全,因此我使用领域DB与SecureRandom类,这在java中可用。

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

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

可以在这里一些建议如何解密的领域数据库。

代码语言:javascript
复制
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);

解密方法:

代码语言:javascript
复制
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);
    }

崩溃日志:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2020-07-13 16:38:29

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56835898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档