Android应用中存储机密数据且避免缓存/应用数据清除时丢失的方案有哪些?
Android应用机密数据存储解决方案
一、常规安全存储方案(随应用数据清除删除)
这些是Android官方推荐的安全存储方式,但都属于应用私有存储范畴,用户清除应用数据时会被一并删除:
- KeyStore密钥管理:Android自带的硬件级(部分设备支持)密钥仓库,只能存加密密钥,不能直接存明文。用它生成的密钥无法导出,只能在应用内使用,用来加密其他数据再存在别处。示例代码:
// 生成AES密钥存入KeyStore val keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore") val spec = KeyGenParameterSpec.Builder( "app_secret_key", KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT ) .setBlockModes(KeyProperties.BLOCK_MODE_GCM) .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE) .build() keyGenerator.init(spec) val secretKey = keyGenerator.generateKey()
- 加密SharedPreferences:Jetpack库封装的加密键值对存储,底层用KeyStore加密,直接存敏感键值对(比如用户token),用法和普通SharedPreferences差不多。
- 加密SQLite:用SQLCipher或Room加密插件给数据库全库加密,适合存结构化的敏感数据(比如用户隐私信息)。
- 内部存储加密文件:在
getFilesDir()目录下创建文件,用KeyStore生成的密钥加密后写入,这个目录只有当前应用能访问,安全性高,但清除应用数据会被删。
二、不受清除缓存/应用数据影响的存储方案
这类方案把数据存在应用私有目录之外,用户清除缓存或应用数据时不会丢失,但要注意权限和合规性:
- 外部存储私有目录:Android 10+新增的
getExternalFilesDir(null)目录,是应用在SD卡上的专属文件夹,清除应用数据不会删,只有卸载应用才会清理。操作步骤:- 用KeyStore生成加密密钥
- 把机密数据加密后写入该目录下的文件
- 无需额外存储权限(Android 10+),其他应用也访问不了
- MediaStore私密集合(Android 11+):如果是加密后的媒体文件(比如加密的证件照),可以存入MediaStore的私密集合,标记为应用私有,其他应用无法读取。清除应用数据不会删除,卸载时才会被移除,适合需要和系统媒体框架交互的场景。
- 硬件安全芯片(Secure Element):部分旗舰机内置SE芯片,是独立于主CPU的硬件模块,数据存在这里完全隔离,就算应用被删、数据被清,只要不重置设备,数据还在。需要用KeyStore的硬件支持特性,或者厂商提供的专属SDK(比如三星Knox、华为HMS安全存储)。
- 云端端到端加密存储:把加密后的机密数据传到自己的服务器,本地只存KeyStore里的加密密钥。清除应用数据时本地密钥会被删,但云端数据还在,用户重新登录后用恢复的密钥或者重新生成的密钥解密即可。必须做到端到端加密,确保服务器看不到明文。
- 系统全局设置(慎用):通过
Settings.Secure存少量敏感数据,但需要WRITE_SECURE_SETTINGS权限,这个权限只有系统应用或厂商签名的应用才能拿到,普通APP用不了,而且容易违反隐私规范,不推荐。
关键注意事项
- 所有方案都必须先加密再存储,绝对不能存明文,密钥一定要存在KeyStore里,别硬编码在代码里。
- 外部存储方案虽然不会被应用数据清除影响,但用户可能手动删除SD卡上的文件,要做容错处理。
- 硬件级存储依赖设备支持,兼容性有限,要做降级处理。
- 云端存储要确保传输用HTTPS,存储加密,避免数据泄露。
内容的提问来源于stack exchange,提问作者Sunbey13
相关产品推荐
相关产品推荐

