题目
移动端敏感数据存储的安全风险与防范
信息
- 类型:问答
- 难度:⭐
考点
数据存储安全,敏感信息保护,安全实践
快速回答
移动端存储敏感数据时的主要风险及防范措施:
- 风险:设备丢失、root/jailbreak访问、备份文件泄露
- 防范:避免明文存储,使用系统加密API(Android KeyStore/iOS Keychain),敏感数据及时清除
- 禁止行为:切勿在SharedPreferences/UserDefaults中存储密码、令牌等敏感信息
一、核心安全风险
移动端本地存储敏感数据时面临三大主要风险:
- 设备物理丢失:未加密数据可直接被读取
- Root/Jailbreak访问:攻击者绕过权限直接访问应用沙盒
- 备份泄露:Android备份文件或iTunes备份可能包含未加密数据
二、安全存储方案(代码示例)
Android最佳实践(使用EncryptedSharedPreferences):
// 初始化加密组件
MasterKey masterKey = new MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build();
// 创建加密的SharedPreferences
SharedPreferences encryptedPrefs = EncryptedSharedPreferences.create(
context,
"secret_prefs",
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
);
// 安全存储数据
encryptedPrefs.edit().putString("api_token", "s3cr3t_t0k3n").apply();iOS最佳实践(使用Keychain):
// 配置Keychain查询参数
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: "apiToken",
kSecValueData as String: "s3cr3t_t0k3n".data(using: .utf8)!
]
// 添加数据到Keychain
let status = SecItemAdd(query as CFDictionary, nil)
guard status == errSecSuccess else {
// 错误处理
return
}三、最佳实践原则
- 最小化存储:仅存储必要敏感数据,及时清除过期信息
- 系统级加密:优先使用平台提供的加密API(KeyStore/Keychain)
- 避免反模式:
- ❌ 明文存储到SharedPreferences/UserDefaults
- ❌ 硬编码密钥在代码中
- ❌ 日志输出敏感信息
四、常见错误案例
危险做法(Android):
// 明文存储到SharedPreferences(极易泄露)
SharedPreferences prefs = getSharedPreferences("unsafe", MODE_PRIVATE);
prefs.edit().putString("password", "123456").apply();危险做法(iOS):
// 明文存储到UserDefaults(不安全)
UserDefaults.standard.set("123456", forKey: "userPassword")五、扩展知识
- Android备份风险:在AndroidManifest.xml中设置
android:allowBackup="false"禁用备份 - iOS数据保护:使用
FileProtectionType为文件添加额外加密(如.completeUntilFirstUserAuthentication) - 安全检测工具:使用MobSF(Mobile Security Framework)扫描存储漏洞