android - 如何读取加密的 Realm 数据库 Android
问题描述
我在访问加密的 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() 和其他一些方法,但它们没有给我所需的长度。我不知道这是否可行。
任何建议将不胜感激。
解决方案
在这里找到了问题的解决方案: 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;
}
推荐阅读
- cmd - cd %C^ 在命令提示符中?
- javascript - 如何使用 Nodejs 和 APIGatewayProxyEvent 发送带有请求的文件
- python-3.x - 使用opencv遮蔽颜色
- html - 如何从表列中的输入中获取值并将它们总结起来?
- sql-server - 在 SQL Server 代理启动后 X 分钟安排 SQL 作业
- xml - OpenAPI 3.0 - 在具有属性和值的 OpenAPI 3.0 (Swagger 3.0) 对象中描述 XML 标记对象的问题
- javascript - javascript异步函数,调用者不等待。清单 V3
- angular - 如何将 excel 数据导入/上传到动态加载 excel 工作表并响应工作的表中?
- json - 使用 Go 解析 JSON 中包含 unicode 字符的键
- mysql - 使用 TypeORM 插入数组时,作为结果出来的 id 的顺序?