Jetpack Security EncryptedFile加密assets下JSON文件反编译仍可见如何解决
问题根因
- 你项目
assets目录下的plants.json是APK编译打包阶段就内置的只读资源,你写的Jetpack EncryptedFile逻辑仅操作应用私有存储filesDir下的文件,完全没有触及到打包进APK的明文源文件,反编译时自然能直接看到assets目录下的明文内容。 - 当前代码仅完成了
EncryptedFile实例的初始化,没有执行「明文转加密→移除明文使用路径」的完整流程。
解决步骤
- 首要前提是删除项目中
assets/plants.json明文源文件,绝对不能把明文配置直接打包进APK。 - 本地提前对原始
plants.json做预加密,将加密后的文件重命名为plants_encrypted.dat放入assets目录,也可以把加密后的内容转成字符串常量写在代码中,进一步提升逆向难度。预加密使用和EncryptedFile一致的AES256_GCM算法即可。 - 应用首次启动时,读取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
相关产品推荐
相关产品推荐

