【问题标题】:How to apply encryption to an existing realm database in Android?如何对 Android 中的现有领域数据库应用加密?
【发布时间】:2016-12-05 14:19:49
【问题描述】:

我已经解决了this问题和类似问题,但我仍然无法弄清楚。

之前我在我的安卓应用中使用SQLite预填充的 Sqlite 数据库的大小约为 15 MB。我制作了一个临时的 android 应用程序,将我的记录复制到一个新的 Realm 数据库中。这个新的 Realm 数据库的大小约为 150 MB。然后我用Mac中的Realm浏览器打开它并压缩它。大小现在减小到 15 MB。

但如果我在创建新数据库并将 sqlite 行复制到其中时使用加密,则大小约为 150 MB。当我使用十六进制密码打开它时,它可以正常打开。然后我像之前一样压缩它-> 大小恢复到正常的 15 MB。但是,我不知道为什么,现在加密被删除了

为了解决这个问题,我只能想到一种解决方案。如果我可以对已经压缩的 Realm 数据库应用加密。但是,我想不通,如何在 Android 中做到这一点?

编辑 - 一些相关部分 -

第 1 部分 -

Realm.init(this);
byte[] key = new byte[64]; // Just for demonstration
RealmConfiguration config = new RealmConfiguration.Builder()
                .name("QBank.realm")
                .directory(getExternalFilesDir(null))
                .encryptionKey(key)
                .build();
Realm realm = Realm.getInstance(config);

第 2 部分 -

 @Override
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.button_sqlite2realm:
                DatabaseAccess databaseAccess = DatabaseAccess.getInstance(this);
                databaseAccess.open();
                questionsList = databaseAccess.getAllQuestions();
                databaseAccess.close();

                Realm realm = Realm.getInstance(config);
                realm.executeTransaction(new Realm.Transaction() {
                    @Override
                    public void execute(Realm realm) {
                        for (QuestionBank question : questionsList){
                            realm.copyToRealmOrUpdate(question);
                        }
                    }
                });
                break;
        }
    }

用于将加密数据库转换为压缩数据库 -> 我从 android 模拟器中提取了这个领域数据库 -> 在领域浏览器中打开它(使用十六进制密码) -> 压缩(但是这个新创建的压缩数据库现在没有加密)

附: - 我知道我的问题是描述性的,但我找不到这样做的方法。

【问题讨论】:

  • 你要关闭你的领域数据库吗?如果可能,请分享您的代码以供复制?
  • 对不起,我没有得到你。您的意思是从sqlite 复制到realm 或从加密到压缩的代码?
  • @PravinD,我已经用相关信息更新了我的问题。
  • 你试过先压缩再加密吗?
  • 您可以使用 writeEncryptedCopyTo 编写您的 Realm 副本。该方法将使用新密钥进行加密并压缩领域。看看realm.io/docs/java/2.2.1/api/io/realm/…

标签: android database encryption realm realm-java


【解决方案1】:

我认为this question 指向与您面临的相同问题。

压缩需要在数据中找到模式。加密删除 所有这些模式。

您需要在加密之前进行压缩。 加密将您的数据转换为高熵数据,通常与随机流无法区分。压缩依赖于模式以获得任何尺寸减小。由于加密会破坏此类模式,因此如果将压缩算法应用于加密数据,则无法大幅减少大小。

如果有任何其他帮助,请告诉我。

希望这会对您有所帮助。快乐编码!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多