题目
移动应用中如何安全存储用户的登录令牌?
信息
- 类型:问答
- 难度:⭐
考点
敏感数据存储,加密基础,SharedPreferences安全
快速回答
在Android开发中安全存储登录令牌的核心要点:
- 避免明文存储:绝不直接写入SharedPreferences或文件
- 使用Android密钥库(Keystore):生成并保护加密密钥
- 加密敏感数据:采用AES-GCM等强加密算法
- 使用EncryptedSharedPreferences(AndroidX安全库组件)
为什么需要安全存储?
登录令牌(Token)相当于用户的数字身份证。若被窃取会导致:
• 账户被盗用
• 用户数据泄露
• 服务端API被非法调用
实现方案(Android示例)
最佳实践:使用EncryptedSharedPreferences
// 添加依赖:implementation "androidx.security:security-crypto:1.1.0-alpha03"
val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()
val sharedPreferences = EncryptedSharedPreferences.create(
context,
"secret_shared_prefs",
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
// 存储Token
sharedPreferences.edit()
.putString("auth_token", "user_jwt_token_here")
.apply()
// 读取Token
val token = sharedPreferences.getString("auth_token", null)原理说明
- Android Keystore系统:在硬件级隔离环境中生成和存储密钥,系统级保护
- AES-GCM加密:认证加密模式,防止数据篡改(256位密钥符合NIST标准)
- 双密钥机制:EncryptedSharedPreferences使用独立密钥分别加密键名和值
常见错误
- 错误1:Base64编码代替加密(Base64不是加密!)
- 错误2:硬编码密钥在代码中(APK反编译可获取)
- 错误3:使用ECB等不安全加密模式(应选GCM/CBC)
- 错误4:将Token存储在外部存储(SD卡)
扩展知识
- iOS方案:使用Keychain Services(Security框架)
- 动态令牌:JWT应设置合理有效期(推荐≤24小时)
- 额外防护:
• 开启BiometricPrompt生物认证
• 定期轮换令牌
• 网络传输使用HTTPS+证书绑定 - OWASP建议:
Mobile Top 10中M2(不安全的数据存储)是核心风险