【问题标题】:How to read an encrypted Realm Database Android如何读取加密的 Realm 数据库 Android
【发布时间】:2020-06-08 16:50:39
【问题描述】:

我在访问加密的 Realm DB 时遇到了一些问题。 这是我的流程: - iOS 团队创建加密数据库 - 他们创造了钥匙 - 然后我在 API 响应中收到密钥,以避免在本地存储密钥。

收到密钥后,我使用以下方法将其转换为 SHA-512:

fun String.getSHA512Pass(): String {
return MessageDigest
    .getInstance("SHA-512")
    .digest(this.toByteArray())
    .fold("", { str, it -> str + "%02x".format(it) })}

然后我将它应用到我的 RealmConfiguration:

class AppDatabase {

companion object {
    fun init(context: Context) {
        Realm.init(context)

        val hasKey = "xxxxx-key_from_server-xxxxxx".getSHA512Pass()

        try {
            val config = RealmConfiguration.Builder()
                .assetFile("org.realm")
                .encryptionKey(hasKey.toByteArray())
                .schemaVersion(1)
                .readOnly()
                .build()

            Realm.setDefaultConfiguration(config)

        } catch (exception: Exception) {
            Timber.e(exception)
        }
    }
}}

它会因为这个异常而崩溃:

java.lang.IllegalArgumentException: The provided key must be 64 bytes. Yours was: 128

我尝试实现 Base64、BigInteger(hasKey, 16).toByteArray() 和其他一些方法,但它们没有给我所需的长度。我不知道这是否可行。

任何建议将不胜感激。

【问题讨论】:

    标签: android kotlin realm realm-mobile-platform


    【解决方案1】:

    在此处找到问题的解决方案: https://github.com/realm/realm-java/issues/2835

    我只是将它应用到我的 Hex 并给我所需的长度:

    public static byte[] hexStringToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                             + Character.digit(s.charAt(i+1), 16));
    }
    return data;
    

    }

    【讨论】:

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