You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetpack Security EncryptedFile加密assets下JSON文件反编译仍可见如何解决

问题根因
  • 你项目assets目录下的plants.json是APK编译打包阶段就内置的只读资源,你写的Jetpack EncryptedFile逻辑仅操作应用私有存储filesDir下的文件,完全没有触及到打包进APK的明文源文件,反编译时自然能直接看到assets目录下的明文内容。
  • 当前代码仅完成了EncryptedFile实例的初始化,没有执行「明文转加密→移除明文使用路径」的完整流程。
解决步骤
  1. 首要前提是删除项目中assets/plants.json明文源文件,绝对不能把明文配置直接打包进APK。
  2. 本地提前对原始plants.json做预加密,将加密后的文件重命名为plants_encrypted.dat放入assets目录,也可以把加密后的内容转成字符串常量写在代码中,进一步提升逆向难度。预加密使用和EncryptedFile一致的AES256_GCM算法即可。
  3. 应用首次启动时,读取assets目录下的预加密文件,写入到私有存储的EncryptedFile中,后续所有业务逻辑仅从私有目录的加密文件读取数据,全程不暴露明文内容。
参考代码
// 初始化加密文件实例
val encryptedFile = EncryptedFile.Builder(
    File(filesDir, "plants"),
    applicationContext,
    MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC),
    EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
).build()

// 首次启动:将assets中的预加密文件写入私有加密目录
if (!File(filesDir, "plants").exists()) {
    val assetInputStream = assets.open("plants_encrypted.dat")
    encryptedFile.openFileOutput().use { outputStream ->
        assetInputStream.copyTo(outputStream)
    }
    assetInputStream.close()
}

// 业务场景读取解密后的内容
encryptedFile.openFileInput().use { inputStream ->
    val jsonContent = inputStream.bufferedReader().use { it.readText() }
    // 解析JSON执行后续逻辑
}

注意不要将加密密钥硬编码在代码中,可配合Jetpack Security的密钥存储能力实现密钥安全托管。

内容的提问来源于stack exchange,提问作者SVK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 00:36:03