题目
移动应用敏感数据存储安全实践
信息
- 类型:问答
- 难度:⭐⭐
考点
数据加密,密钥管理,安全存储API
快速回答
在移动端安全存储敏感数据的关键实践:
- 避免明文存储:绝不直接存储密码、令牌等敏感数据
- 使用系统级安全存储:Android KeyStore/iOS Keychain管理加密密钥
- 分层加密策略:对敏感数据采用AES-256等强加密算法
- 动态密钥管理:结合设备硬件特性生成唯一密钥
- 最小化存储原则:仅存储必要数据,及时清除过期信息
核心安全风险
移动设备易丢失或被破解,常见风险包括:
- 设备物理访问:攻击者直接读取设备存储
- root/jailbreak:绕过系统权限访问沙盒数据
- 备份泄露:未加密的iTunes/云备份暴露数据
- 日志泄露:调试日志意外记录敏感信息
加密实现方案
Android示例(使用EncryptedSharedPreferences)
// 初始化主密钥
MasterKey masterKey = new MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build();
// 创建加密存储
SharedPreferences encryptedPrefs = EncryptedSharedPreferences.create(
context,
"secret_data",
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
);
// 安全存储数据
encryptedPrefs.edit().putString("api_token", "dG9rZW4tMTIzNA==").apply();iOS示例(使用Keychain)
// 配置Keychain参数
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: "userToken",
kSecValueData as String: "encryptedData".data(using: .utf8)!
]
// 安全存储
let status = SecItemAdd(query as CFDictionary, nil)
guard status == errSecSuccess else {
// 错误处理
throw KeychainError.storeFailure
}最佳实践
- 密钥生命周期管理:
- Android:使用KeyStore自动轮换密钥
- iOS:利用Secure Enclave保护生物特征关联密钥
- 加密策略选择:
- 对称加密:AES-GCM(256位)用于大数据块
- 非对称加密:RSA/OAEP用于密钥交换
- 深度防御:
- 应用层加密 + 文件系统加密(FBE)
- 禁用ADB备份(AndroidManifest中设置android:allowBackup="false")
常见错误
- 硬编码密钥:在代码中直接写加密密钥(可通过反编译获取)
- 使用不安全API:如Android的SharedPreferences或iOS的UserDefaults存敏感数据
- 弱加密算法:使用DES、RC4或自定义加密算法
- 密钥存储不当:将密钥与加密数据存在相同位置
扩展知识
- 白盒加密:针对高安全场景,防止内存提取攻击
- 证书锁定(Certificate Pinning):防止中间人攻击获取传输数据
- 运行时保护:使用Jailbreak/Root检测,触发数据自毁机制
- OWASP MASVS标准:
- MSTG-STORAGE-1:系统凭证存储规范
- MSTG-STORAGE-2:敏感数据必须加密
威胁场景验证
测试存储安全性的方法:
- 使用adb backup提取Android应用数据
- 通过Xcode设备管理器下载iOS应用沙盒
- 使用Frida进行运行时内存扫描
- 检查SQLite数据库和SharedPreferences文件