如何读取Android的加密Realm数据库

问题描述 投票:0回答:1

我在访问加密的Realm数据库时遇到一些问题。这是我的流程:-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个回答
0
投票

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

我只是将其应用于十六进制,并给了我所需的长度:

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;

}

© www.soinside.com 2019 - 2024. All rights reserved.