跳过主要内容

移动开发者安全存储令牌最佳实践

了解如何在移动应用中安全存储身份验证令牌以保护用户数据免受泄露和攻击。

马丁·多纳迪

马丁·多纳迪

内容营销人员

安全令牌存储:移动开发者最佳实践

安全存储令牌对于移动应用程序安全至关重要。令牌是用户帐户、敏感数据和服务的密钥。如果被破坏,它们可能会导致 身份盗窃、金融欺诈和数据泄露。以下是如何保护它们的方法:

关键要点:

  • 使用平台原生安全存储: 在 iOS Keychain 或 Android Keystore 中存储令牌以获得硬件背后的安全性。
  • 在休眠状态下加密令牌: 使用工具,如 EncryptedSharedPreferences (Android) 或 CryptoKit (iOS) 进行安全加密。
  • Limit Token Exposure: 使用短期令牌和令牌刷新轮换来降低风险。
  • Secure Communication: 始终使用 HTTPS 并实施证书固定以防止截取。
  • Manage Token Lifecycles: 定期过期、刷新和撤销令牌以最小化窃取造成的损害。

Quick Comparison of Storage Methods:

存储方法安全级别易用性最佳使用场景
内存存储短会话,高安全需求
本地存储非敏感数据
安全CookieWeb应用程序与服务器端控件
iOS钥匙串__CAPGO_KEEP_0____CAPGO_KEEP_0__iOS 应用程序存储敏感令牌
Android Keystore__CAPGO_KEEP_0____CAPGO_KEEP_0__Android 应用程序需要安全存储
自定义加密变量__CAPGO_KEEP_0__特殊化的安全要求

首先审计您的应用程序当前令牌存储方法,并实施这些最佳实践来保护您的用户和您的品牌。

移动设备上的安全存储现实:对虚拟磁盘加密的探索 - Daniel Mayer & Drew Suarez

安全令牌存储的基本规则

保护令牌需要多层次的安全措施。通过结合多个安全手段,确保即使一个措施失败,其他措施仍然保护敏感数据。对于Capacitor应用,遵循这些最佳实践至关重要,以在多个平台上维护令牌安全。

使用 HTTPS 和证书固定

HTTPS 加密是令牌拦截的第一道防线。您的应用程序与服务器之间的每次交互都必须使用 HTTPS 来加密数据传输,防止攻击者窥探。

为了进一步加强这一点,实施 证书固定。这个技术确保您的应用程序只与您的信任服务器通信,即使有人尝试使用伪造的证书。通过在应用程序中硬编码您的服务器的证书或公钥,您建立了直接信任关系之间的应用程序和服务器。

“You should pin anytime you want to be relatively certain of the remote host’s identity or when operating in a hostile environment. Since one or both are almost always true, you should probably pin all the time.” – OWASP pinning cheat sheet [5]

A real-world example: Twitter introduced certificate pinning in its mobile apps after experiencing Man-in-the-Middle (MitM) attacks. Their team embedded the server’s SSL certificate public key directly into the app. When users connected, the app verified the certificate against the pinned one. If there was no match, the connection was terminated immediately. This approach significantly reduced MitM attacks and boosted user confidence in the platform [5].

您可以选择 certificate pinning (验证整个证书)以获得最高安全性或 public key pinning (仅验证公共密钥)以便于证书续期时具有更大的灵活性 工具如 OkHttp 用于Android和 Alamofire [5].

用于iOS简化了这些技术的实现

一旦安全传输建立起来,下一步就是最小化令牌暴露。

减少令牌暴露的风险涉及限制令牌的范围和寿命。这个想法很简单:令牌的有效时间越短,权限越少,令牌被破坏的风险就越低。

  • 使用 短期令牌 令牌有效时间以分钟为单位。将它们与刷新令牌配对,以维持用户会话而不保留长期令牌。这种方法确保盗窃的令牌迅速变得无用。
  • 应用 最小特权原则。例如,如果令牌只需要读取用户资料,则不要授予修改帐户设置或访问付款详细信息的权限。
  • 启用 刷新令牌轮换,在此过程中,每次使用刷新令牌请求新访问令牌时都会发行新刷新令牌。如果刷新令牌被盗,使用它的合法应用会使其失效,从而缩短风险窗口。 [4].

通过限制令牌暴露,减少了由于违约而造成的重大损害的机会。接下来,确保令牌即使设备被物理破坏也保持安全。

在令牌休眠时进行加密

__CAPGO_KEEP_0__ 设备上的令牌存储受到加密保护。即使设备丢失、被盗或被恶意软件破坏,数据也无法被读取。

现代移动操作系统提供了安全、硬件支持的存储选项,这比标准方法如Android的SharedPreferences或iOS的NSUserDefaults要可靠得多 [4].

  • 对于Android: 使用 EncryptedSharedPreferences (可用于Android 10及以上版本) SecureJWTStorage 此工具会自动处理加密和密钥管理,简化了实现,同时提高了安全性。例如, EncryptedSharedPreferences without requiring complex custom encryption code.
  • 安全地存储和检索JWT令牌,而无需进行复杂的自定义加密。对于iOS KeychainHelper : Keychain提供了硬件级别的加密,用于安全存储令牌。开发者可以使用 类来管理JWT令牌,或者通过使用 在存储它们之前将它们存储在Keychain中 [4].

两者都使用硬件加密,例如iOS中的Secure Enclave和Android中的Hardware Security Module。这些组件将加密密钥存储在抗篡改硬件中,隔离在主操作系统之外

最后,建立明确的数据保留政策。自动删除过期令牌并在设备不再需要时安全地从设备中删除敏感数据。这些实践确保令牌只存储在绝对必要的时间内 [6].

平台特定的令牌存储方法

每个移动平台都提供自己的工具来保护令牌,旨在满足安全和用户体验的需求。这些本地选项基于核心实践,如HTTPS、加密和限制暴露,这些实践在早些时候讨论过

Android:Keystore和 EncryptedSharedPreferences

EncryptedSharedPreferences

Android设备通过Keystore系统和EncryptedSharedPreferences提供了强大的令牌保护 Keystore系统EncryptedSharedPreferences。Keystore安全存储加密密钥在受保护的环境中,使其难以提取并确保它们保持不可导出。这意味着密钥只能用于安全操作。此外,您还可以添加限制,如要求用户身份验证。对于运行Android 9(API级别28)或更高版本的设备, StrongBox KeyMint 提供了比标准信任执行环境(TEE)更大的隔离。要检查是否可用,请使用 FEATURE_STRONGBOX_KEYSTORE,并使用 KeyGenParameterSpec.Builder.setIsStrongBoxBacked().

EncryptedSharedPreferences提供了一个更简单的方式来安全存储key-value pairs。它会加密数据并安全地管理密钥,支持API级别23及以上。Android工程师Arun突出了其易用性:

“只需几行code,我们就可以 显著提高安全性 通过使用 EncryptedSharedPreferences。它是一个强大且易于使用的解决方案,用于在Android应用中安全存储敏感数据。”

为了最佳实践,实现错误处理、每90-180天轮换密钥,并避免在SharedPreferences中存储高度敏感数据(如信用卡号码)。此类数据应在安全后端处理而不是在SharedPreferences中处理。

iOS:Keychain和 Secure Enclave

iOS中,令牌安全性依赖于 KeychainSecure Enclave。 Keychain 是一种使用 AES-256-GCM 加密的安全存储库,用于敏感数据,如密码和令牌。它采用双钥系统:元数据键由 Secure Enclave 保护,元数据键缓存在 Secure Enclave 中以实现快速查找,而秘密键需要将其发送到 Secure Enclave 以实现额外的安全性。 Keychain 还支持同一开发者应用之间的安全共享项,通过 securityd daemon

进行管理。 kSecAttrAccessibleWhenUnlockedSecure Enclave 使用 P256 密钥和约 4 MB 的安全存储来增强保护。您可以通过配置访问控制列表(ACL)来进一步增强安全性,要求使用 Face ID、Touch ID 或密码验证的设置,如 .whenPasscodeSetThisDeviceOnly 。 为了实现更严格的安全性,

Capacitor__CAPGO_KEEP_0__

:Secure Storage 插件,Capacitor 框架文档网站

For cross-platform apps, Capacitor offers a 安全存储插件 该插件简化了令牌安全性,而无需要求平台特定的code。在 iOS 上,插件将数据存储在加密的系统 Keychain 中,而在 Android 上,它使用 AES 在 GCM 模式下加密数据,并使用 Android Keystore 生成密钥,然后将其保存在 SharedPreferences 中。对于 Web 环境,插件使用未加密的 localStorage - 但仅用于调试目的。

2025 年 2 月,martinkasa 更新了capacitor-secure-storage-plugin 以支持Capacitor v7,确保了 iOS 和 Android 上的字符串值的安全存储。这些插件适用于存储登录凭证和 JSON 数据。然而,它们可能缺乏本机解决方案提供的细粒度控制。对于企业级应用程序,具有高级安全需求的本机选项,如 iOS Keychain Services 和 Android Keystore APIs - 或增强的工具,如 Ionic’s Identity Vault -可能更合适。Capacitor的官方文档还建议使用本机安全存储来处理敏感数据,例如加密密钥或会话令牌。

当部署Capacitor应用程序的实时更新时,服务如 Capgo 可以进一步增强令牌安全性。Capgo的端到端加密确保了更新 - 包括包含安全补丁或令牌管理改进的更新 - 将安全地传递,维护应用程序安全框架的完整性。

管理令牌生命周期和安全性

有效的令牌管理涉及管理令牌的创建、过期和撤销。开发者需要设计系统以平衡强大的安全措施和流畅的用户体验。以下是令牌过期、撤销和安全的OTA更新策略,以帮助您构建全面令牌管理方法。

令牌过期和刷新方法

使用短期访问令牌和长期刷新令牌是安全令牌处理的关键实践。访问令牌应在5-15分钟内过期,以减少被破坏的风险。另一方面,刷新令牌可以保持几天或几周的有效期,使用户无需频繁重新验证会话。

令牌过期在API安全和高效方面起着至关重要的作用 [7]将令牌过期与令牌轮换(先前发行的令牌无效化)结合起来,会提供额外的保护。这种方法可以最小化因刷新令牌被破坏而造成的损害,并有助于识别可疑活动,如旧令牌的重用。

在设计刷新机制时,确保令牌在刷新过程中严格验证。使用速率限制来防止暴力攻击,并使用自动监控来检测异常,例如来自多个位置的同时刷新请求。平衡安全性和性能是保护用户会话而不影响整体体验的关键。

注销和invalidating 令牌

虽然令牌过期是至关重要的,但令牌注销提供了另一个安全层,尤其是在用户注销、丢失设备或suspected 安全漏洞等场景中。尽管无状态 JWT 访问令牌在到期前保持有效,但有效地管理刷新令牌可以阻止新访问令牌的颁发。

注销令牌及时防止未经授权的访问敏感资源 [8]为了立即invalidating 令牌,考虑在服务器端实现一个黑名单来跟踪注销令牌并在 API 请求期间检查它们。此外,单点注销(SLO)功能允许用户在一个操作中终止多个身份验证会话,确保所有相关的刷新令牌在连接的服务中都被注销。

在处理被破坏的令牌时,也很重要。这些协议应该包括立即令牌注销、自动安全警报、及时通知受影响的用户以及与被破坏令牌相关的所有活动会话的终止。

使用OTA 系统进行安全令牌更新

一旦您建立了强大的令牌生命周期和注销策略,安全的OTA(远程)更新就变得至关重要,以便在威胁演变时维护令牌安全。OTA系统允许您快速部署安全补丁、旋转API密钥、更新证书和精细化验证逻辑——所有这些都不需要用户手动更新。

使用Capacitor的开发人员,工具如Capgo提供了符合OTA的解决方案,具有端到端的加密。这确保了安全更新以安全的方式传递到设备,同时遵守苹果和安卓的指南。这样的系统尤其适合解决紧急安全漏洞。

为了进一步增强令牌安全,监控您的应用程序和基础设施以应对新兴威胁。使用OTA系统来部署运行时防御和其他先进措施,立即阻止可疑用户或设备,同时确保合法用户的服务不受影响。

令牌存储选项比较:安全性与易用性

在决定如何安全存储令牌时,所有的事情都围绕着找到安全性和易用性的平衡。您的选择直接影响您的应用程序的易受攻击性以及整体用户体验。让我们分解不同存储方法的权衡。

内存存储与持久存储

内存存储 将令牌存储在应用程序内存或JavaScript变量中,使其成为一个高度安全的选项。由于令牌没有写入 持久存储攻击者使用传统的 XSS 攻击时,攻击者有更少的机会访问它们。

但是,有一个陷阱:存储在内存中的令牌会在用户刷新页面或打开新标签时消失。这使得内存存储在 web 应用中不太实用,因为用户期望一种无缝的浏览体验。

另一方面, 持久性存储 - 本地存储、会话存储或 cookie 等方法 - 提供了更Smooth 的体验。持久性存储的令牌允许用户关闭浏览器,稍后返回,并在不需要重新登录的情况下继续之前的工作 [9].

然而,这种便利性伴随着安全风险。持久性存储更容易受到 XSS 攻击,恶意脚本可以从本地或会话存储中窃取令牌 [4]. cookie 虽然提供了额外的配置选项,但如果不使用适当的标志,也可以被 CSRF 攻击

使用Capacitor的移动应用 Web Workers 提供了一个中间地带。运行在一个单独的全局范围内,它们提高了安全性,同时比内存存储更好地维护了可用性 [9]. 如果 Web Workers 不是可行的选项,JavaScript 闭包可以模拟私有方法来添加额外的保护层 [9]. 移动开发者还需要权衡原生安全存储和自定义加密的利弊

Keychain/Keystore vs. Custom Encryption

对于移动应用来说, 使用平台原生安全存储 如 iOS Keychain 和 Android Keystore 是金标准。这些解决方案提供了硬件级别的安全性,使得令牌提取变得更加困难。

这些本地工具的美丽之处在于它们的简单性。它们是操作系统的一部分,因此开发人员不需要编写大量的code来实现它们。另外,它们支持像 生物识别认证 和集中式凭证管理等功能,这些功能都可以提高安全性和用户体验 [10].

自定义加密另一方面,给开发人员提供了更多的控制权,但这也带来了重大挑战。安全性完全依赖于加密的实现以及密钥的管理 [10]许多开发人员低估了创建安全系统的复杂性,这可能会导致安全漏洞。由于加密标准不断演进,自定义解决方案需要持续的更新和维护,这使得它们除非您的团队在此领域有深入的专长,否则就不是资源高效的

安全性与可用性比较表

存储方法安全级别易用性实现复杂度最佳使用场景
内存存储刷新后丢失(低)刷新后丢失(低)高安全性,短会话
本地存储仅非敏感数据
会话存储临时会话数据
安全Cookie高(使用正确的标志)需要服务器支持的Web应用
iOS Keychain极高中等iOS原生/混合应用
Android Keystore极高中等Android原生/混合应用
自定义加密可变MediumHighSpecialized security requirements

This table highlights how platform-native storage options like Keychain and Keystore offer a strong combination of security and ease of implementation, making them ideal for mobile applications. They provide robust protection without requiring developers to master cryptography.

For Capacitor developers, using secure storage plugins to access these native solutions is a smart move. It combines the hardware-backed security of Keychain and Keystore with the cross-platform flexibility that Capacitor offers.

Ultimately, your choice of token storage should align with your app’s threat model and user expectations. Applications handling sensitive data, like healthcare or financial apps, should prioritize security above all else. In contrast, consumer-facing apps might accept slightly higher risks to deliver a smoother user experience. By understanding these trade-offs, you can choose the storage method that best fits your needs.

Key Takeaways

Protecting user data through secure token storage is not just a technical best practice - it’s a necessity for maintaining your app’s integrity. With 81% of confirmed breaches in 2022 linked to weak, reused, or stolen passwords [12], mobile developers need to prioritize robust token security measures.

Best Practices Summary

An effective token security plan relies on multiple layers of protection. Start by using platform-native secure storage, such as iOS Keychain and Android Keystore, which offer hardware-backed security.

避免将令牌存储在LocalStorage或IndexedDB中 [2], as these methods are vulnerable to XSS attacks. Instead, rely on secure storage options built into the operating system, ensuring limited access. For developers using Capacitor, secure storage plugins provide a way to tap into native protections while maintaining cross-platform functionality.

使用__CAPGO_KEEP_0__的开发者可以通过安全存储插件来利用本机保护,同时保持跨平台功能。 [3]令牌生命周期管理是另一个关键方面。定期过期令牌并实现刷新令牌旋转,生成每次请求访问令牌时的新刷新令牌

.较短的刷新令牌寿命可以减少在窃取的情况下滥用风险. [1]保持签名密钥机密,仅与必要服务共享 [11].避免不安全的做法,如记录令牌或将其嵌入URL中

.这些步骤共同加强了令牌管理策略。

开发者下一步行动

  • 以下是您可以采取的措施来改善应用令牌安全的最佳实践: 如果您正在使用不安全的解决方案,如 LocalStorage,优先考虑迁移到平台本地的安全存储。对于 Capacitor 应用程序,采用安全存储插件以有效利用本机保护。

  • 实现层次式认证。 对于低风险操作,使用更简单的方法,但要求 多因素认证(MFA)或生物识别 (MFA)可以阻止 99.9% 的自动化网络攻击, [12]然而,考虑用户体验 - 研究表明约有三分之一的用户避免 MFA 因为它不方便 [12].

  • 使用 OTA(即时更新)系统 为安全和即时的发布。工具如 Capgo 可以为 Capacitor 应用程序提供加密的实时更新,使安全修复能够安全地到达用户,而在更新期间不会损害令牌安全。

  • 关注令牌生命周期管理。 定期过期、刷新和注销协议至关重要。确保您的实现反映了这些原则,以限制风险。

  • 监控认证模式。 密切关注异常活动并根据不断变化的威胁调整您的安全措施。 [13]. 应该将安全审计纳入开发流程,而不是临时处理。

随着移动安全的不断演进,核心原则仍然保持不变:使用本机安全存储,有效管理令牌生命周期,并确保加密不可动摇。有 2022 年 ,智能手机的 81% 已配备了生物识别功能 [12],开发者现在有了强大的工具来增强安全性和用户体验。

您的用户正在将数据托管给您 - 确保令牌存储实践符合最高的安全标准。

常见问题

常见问题

为什么移动开发者应该使用 iOS Keychain 和 Android Keystore 进行安全令牌存储?

使用本机安全存储,例如 iOS Keychain 和 Android Keystore, plays 在保护移动应用程序中的敏感数据方面起着至关重要的作用。这些工具具有 内置加密,确保令牌免受未经授权访问的威胁。除此之外,它们还包含 用户身份验证, 需要用户确认身份后才能访问存储的数据。这增加了额外的安全层。

其中一个突出的特点是加密密钥是 不可导出。换句话说,这些密钥无法从设备中移除,这显著降低了它们被破坏的风险。由于这些系统旨在与其各自平台无缝集成,开发人员可以轻松地将它们实施,从而避免手动处理复杂的加密过程的麻烦。利用这些工具不仅可以增强应用程序的安全性,还可以帮助开发人员满足 现代安全标准 和遵循 行业推荐的最佳实践. :::

::: faq

什么是安全管理令牌生命周期的最佳实践?

在移动应用程序中安全地处理令牌生命周期,开发人员应该坚持几个基本的实践。首先使用 短期令牌例如那些有效期为 15 分钟的令牌。这有助于最小化令牌被泄露的窗口。如果令牌被泄露,用户不会受到太大影响。为了保持用户的便利性而不损害安全性,实现 refresh tokens。这些令牌允许在不迫使用户反复登录的情况下重新获取令牌。

令牌的正确存储对于防止未经授权的访问至关重要。始终依赖于平台特定的安全存储解决方案,如 Keychain (适用于 iOS)或 Android Keystore。这些解决方案专门设计用于保护敏感数据。避免将令牌硬编码或将它们存储在应用程序的明文中,因为这可能会使它们暴露于潜在威胁中。

通过集成这些实践,开发者可以在移动应用程序中增强令牌管理的安全性,并保护用户免受潜在的漏洞。 :::

::: faq

在什么情况下使用自定义令牌存储加密会带来挑战,何时应该优先考虑本机解决方案?

在存储令牌的移动应用程序中,使用自定义加密可能是一个双刃剑。虽然它可能看起来像一个定制的解决方案提供了更多的控制,但它通常会带来额外的复杂性,打开安全漏洞的门户,并要求持续维护以应对新的威胁。与平台提供的内置加密工具不同,自定义解决方案通常缺乏广泛的测试、详细的文档和强大的开发者社区的支持。这使得调试和集成变得更加困难。

说到这一点,有些情况下自定义加密是不可避免的,例如当您处理极其敏感的数据或试图满足标准工具无法处理的严格监管要求时。 在这些情况下,开发人员必须坚持 最佳实践 以确保他们的 加密方法 不仅安全,还可靠且符合行业标准。 在选择自定义加密方法之前,请仔细考虑权衡。

Keep going from Secure Token Storage: Best Practices for Mobile Developers

如果您正在使用 Secure Token Storage: Best Practices for Mobile Developers 来规划安全性和合规性,连接它与 加密 来实现加密的细节, 合规 关于 Compliance 的实现细节 Capgo 安全扫描器 关于 Capgo 安全扫描器 的产品工作流程 Capgo 安全 关于 Capgo 安全 的产品工作流程 Capgo 信任中心 关于 Capgo 信任中心 的产品工作流程

Capacitor 应用实时更新

当 web 层面的 bug 活跃时,通过 Capgo 直接将修复推送给用户,而不是等待几天的 app store 审核。用户在后台接收更新,而原生代码仍然遵循正常的审查流程。

立即开始

博客最新文章

Capgo 为您提供了创建真正专业的移动应用所需的最佳见解。