在 Android 中保护机密:生产环境中真正有效的方法

发布: (2026年1月1日 GMT+8 14:08)
4 min read
原文: Dev.to

Source: Dev.to

Introduction

在 Android 应用中,客户端上没有真正的机密。APK 可以被反编译,字符串可以被提取,内存可以被检查,运行时行为可以被 Hook。把应用当作可信环境是发布不安全软件的最快方式。真正的安全来自于架构设计,而不是隐藏。

Why long‑lived secrets must never live on the device

  • 在应用中存放永久性的 API 密钥或证书会使它们极易被提取。
  • 如果攻击者获取了长期有效的密钥,他们可以无限期冒充该应用。
  • 采用短期、可撤销的凭证可以限制泄露的影响。

Using short‑lived, scoped tokens instead of embedded keys

  • 通过安全的认证流程(例如 OAuth 2.0、OpenID Connect)从后端服务获取令牌。
  • 令牌应具有有限的生命周期(分钟到数小时),并且只授予最小必要的权限范围。
  • 刷新令牌可以兑换新的访问令牌,从而在不更新应用的情况下实现撤销。

Proper use of Android Keystore + AES/GCM for local encryption

  • 将加密密钥存放在 Android Keystore 中,它可以将密钥与应用进程的内存隔离。
  • 使用 GCM 模式的 AES 对本地存储的敏感数据进行认证加密。
  • 仅在需要时检索密钥,并在短暂的上下文中完成加解密操作。

What’s deprecated (Jetpack Security Crypto) and what to use instead

  • androidx.security:security-crypto 库的旧 API 在某些使用场景下已被弃用。
  • 切换到更新的 androidx.security:security-crypto:1.1.0-alpha03(或更高版本),它提供了改进的密钥管理并与 Keystore 集成。
  • 按照迁移指南,将 EncryptedSharedPreferencesEncryptedFile 的构造函数替换为新的 Builder。

Secure transport, integrity signals, and runtime hardening

  • 强制使用 TLS 1.2+ 的 HTTPS,并进行证书固定,以防止中间人攻击。
  • 使用完整性检查(例如 SafetyNet、Play Integrity API)来检测被篡改或已 root 的设备。
  • 应用运行时混淆(ProGuard/R8)和代码拆分,以提升逆向工程的难度。

Designing systems that survive compromise, not deny it

  • 假设客户端可能被攻破;对每个请求在服务器端进行验证。
  • 在后端实现限流、异常检测和撤销机制。
  • 记录安全相关事件并监控可疑活动。

Conclusion

如果你正在构建处理敏感数据、支付或身份验证的 Android 应用,这些实践对于实现生产级安全至关重要。

Read the full article on Medium

Back to Blog

相关文章

阅读更多 »

了解 SSL/TLS 证书

名称游戏:SSL 与 TLS SSL(Secure Sockets Layer)和 TLS(Transport Layer Security)常被交替使用,但 SSL 实际上已经死亡。它已经不再…