如何通过编程保护Android WebView缓存文件不被篡改
Android WebView缓存防篡改解决方案
以下是针对WebView缓存文件防篡改的可行方案,覆盖不同安全需求场景:
1. 缓存文件哈希校验机制
- 首次下载并缓存文件时,为每个文件生成SHA-256哈希值,将哈希值存储在Android Keystore或应用私有安全存储区(避免存放在普通缓存目录)。
- 后续启动加载缓存前,重新读取目标缓存文件计算哈希,与存储的合法哈希值比对:
- 比对一致则正常加载;
- 比对失败则丢弃篡改后的缓存,重新从远程获取合法文件并更新缓存及哈希记录。
- 核心逻辑代码示例:
// 计算文件SHA-256哈希 public String calculateFileHash(File file) throws NoSuchAlgorithmException, IOException { MessageDigest digest = MessageDigest.getInstance("SHA-256"); FileInputStream fis = new FileInputStream(file); byte[] buffer = new byte[8192]; int read; while ((read = fis.read(buffer)) != -1) { digest.update(buffer, 0, read); } fis.close(); return bytesToHex(digest.digest()); }
2. 自定义加密缓存目录
- 放弃WebView默认缓存路径,将缓存文件存储在应用私有内部存储目录(内部存储比外部私有目录更难被第三方访问)。
- 对缓存文件采用AES对称加密存储,密钥通过Android Keystore生成和管理(绝对禁止硬编码密钥)。
- 利用WebView的
shouldInterceptRequest方法拦截资源请求,读取加密缓存文件并解密后返回给WebView加载,全程不在磁盘留下明文缓存。
3. 严格限制缓存目录访问权限
- 创建缓存目录时设置仅应用自身可读可写的权限,阻止普通第三方应用篡改:
File cacheDir = new File(getFilesDir(), "web_secure_cache"); if (!cacheDir.exists()) { cacheDir.mkdirs(); // 设置仅应用自身可访问的权限 cacheDir.setReadable(false, false); cacheDir.setWritable(false, false); cacheDir.setReadable(true, true); cacheDir.setWritable(true, true); } - 注意:此方案无法应对设备被Root后权限被绕过的情况,需配合其他方案使用。
4. 定期远程校验缓存完整性
- 每次应用启动时,向服务器请求当前缓存文件的最新哈希列表,与本地存储的哈希值比对,发现不一致则触发缓存更新。
- 若设备被盗且断网,此方案暂时失效,但联网后会自动修复缓存。
内容的提问来源于stack exchange,提问作者harikrishnan
相关产品推荐
相关产品推荐

