侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

移动应用中如何安全存储用户的登录令牌?

2025-12-11 / 0 评论 / 4 阅读

题目

移动应用中如何安全存储用户的登录令牌?

信息

  • 类型:问答
  • 难度:⭐

考点

敏感数据存储,加密基础,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(不安全的数据存储)是核心风险