我在需要确保数据库安全的应用程序中工作,因此,我正在使用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)
答案 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,您每次都必须使用相同的密钥进行加密和解密。