跳过主内容

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

学习安全存储移动应用程序身份验证令牌的最佳实践,以保护用户数据免受侵害和攻击。

马丁·多纳迪厄

马丁·多纳迪厄

内容营销人员

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

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

关键点总结:

  • 使用本地原生安全存储: 将令牌存储在 iOS Keychain 或 Android Keystore 中以获得硬件级别的安全性。
  • : 使用工具如(Android) 或 EncryptedSharedPreferences (iOS) 进行安全加密。 CryptoKit : 使用短期令牌和令牌刷新轮换来降低风险。
  • : 始终使用 HTTPS 并实现证书固定以防止拦截。__CAPGO_KEEP_0__
  • __CAPGO_KEEP_0____CAPGO_KEEP_0__
  • 管理令牌生命周期: 定期过期、刷新和撤销令牌以最小化盗窃造成的损害。

存储方法快速比较:

存储方法安全性易用性最佳用途
内存存储短会话、高安全性需求
本地存储非敏感数据
安全Cookie使用服务器端控制的Web应用
iOS钥匙串非常高iOS应用程序存储敏感令牌
Android密钥库极高中等需要安全存储的Android应用
自定义加密可变中等特殊的安全要求

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

Daniel Mayer和Drew Suarez - 移动设备上的安全存储的现实 - 虚假磁盘加密

安全令牌存储的基本规则

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

使用 HTTPS 和证书固定

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

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

“在您想要对远程主机的身份有相对确定的信心或在恶意环境中操作时,应始终固定。由于这两种情况几乎总是为真,因此您应该始终固定。” – OWASP 固定指南 [5]

Twitter 在其移动应用程序中引入了证书固定,之后经历了中间人攻击(MitM)。他们的团队将服务器的 SSL 证书公钥直接嵌入到应用程序中。当用户连接时,应用程序验证证书与固定证书是否匹配。如果没有匹配,连接立即终止。这一方法显著减少了 MitM 攻击和提高了用户对平台的信心 [5].

您可以选择 证书固定 (验证整个证书)以获得最高安全性或 公钥固定 (仅验证公钥)以在证书续期时获得更大的灵活性。工具类似于 OkHttp 适用于 Android 和 Alamofire 为 iOS 提供简化实现这些技术 [5].

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

限制令牌暴露

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

  • 使用 短暂的访问令牌 与刷新令牌配对以维持用户会话,而不保留长期的访问令牌在设备上。这一方法确保盗窃的令牌迅速变得无用。
  • 应用 最小权限原则. 例如,如果一个令牌仅用于读取用户资料,不应授予修改帐户设置或访问付款细节的权限。
  • 启用 刷新令牌轮换, 在此过程中,新刷新令牌每次被用来请求新访问令牌时都会被颁发。如果刷新令牌被盗用,它在合法应用程序使用后就会失效,从而减少了窃取风险窗口。 [4].

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

在设备上存储的令牌加密

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

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

  • 在Android上:使用 EncryptedSharedPreferences (适用于Android 10及后续版本)。此工具自动处理加密和密钥管理,简化了实现,同时提高了安全性。例如, SecureJWTStorage class 可以安全地存储和检索 JWTs 使用 EncryptedSharedPreferences 不需要复杂的自定义加密 code.
  • For iOS: Keychain 提供硬件级加密用于安全令牌存储。开发者可以使用一个 KeychainHelper class 来管理 JWT 令牌或添加额外的安全层通过使用 CryptoKit 在 Keychain 中存储令牌之前加密令牌 [4].

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

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

平台特定的令牌存储方法

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

Android: Keystore 和 EncryptedSharedPreferences

EncryptedSharedPreferences

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

EncryptedSharedPreferences offers a simpler way to securely store key–value pairs. It encrypts data and securely manages keys, supporting API levels 23 and above. Arun, an Android Engineer, highlights its ease of use:

“With just a few lines of code, we can 在 iOS 上,token 安全性依赖于 Keychain EncryptedSharedPreferences

Secure Enclave

Keychain 是一个安全存储敏感数据的仓库,例如密码和令牌,使用 AES-256-GCM 加密。它采用双密钥系统:元数据密钥由

Secure Enclave 保护,而每个存储项的秘密密钥则需要进行回环到 enclave 以增加安全性。 Keychain 还支持同一开发者之间的应用程序之间安全共享项,通过 daemon管理。 securityd 在 iOS 上,token 安全性依赖于 Keychain 和 Secure Enclave。 Keychain 是一个安全存储敏感数据的仓库,例如密码和令牌,使用 AES-256-GCM 加密。它采用双密钥系统:元数据密钥由 Secure Enclave 保护,而每个存储项的秘密密钥则需要进行回环到 enclave 以增加安全性。 Keychain 还支持同一开发者之间的应用程序之间安全共享项,通过 daemon 管理。

Secure Enclave 提高了保护措施,使用 P256 密钥和约 4 MB 的安全存储。您可以通过配置访问控制列表(ACL)来进一步加强安全性,要求使用 Face ID、Touch ID 或密码验证的设置,如 kSecAttrAccessibleWhenUnlocked。为了更严格的安全性, .whenPasscodeSetThisDeviceOnly 选项确保数据与设备绑定,减少了未经授权访问的风险。请务必处理边缘案例,如生物识别锁定或设备重置,以及定期审计应用程序权限和许可。

Capacitor: Secure Storage Plugin

Capacitor Framework 文档网站

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

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

在部署Capacitor应用的实时更新时,服务如 Capgo 可以进一步增强令牌安全性。Capgo的端到端加密确保了更新 - 包括包含安全补丁或令牌管理改进的更新 - 都会以安全的方式传递,保持应用的安全框架完整性。

令牌生命周期和安全管理

有效管理令牌涉及监督令牌的创建、过期和注销。开发者需要设计系统来平衡强大的安全措施和流畅的用户体验。以下,我们将深入探讨令牌过期、注销和安全的实时更新策略,以帮助您构建令牌管理的全面方法。

令牌过期和刷新方法

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

令牌过期在保持API安全和高效方面起着至关重要的作用 [7]. 与令牌轮换(令牌轮换)结合起来 - 在此之前发行的令牌被invalidated - 添加了额外的保护层。这种方法最小化了由于refresh令牌被破坏而造成的损害,并且也可以帮助识别可疑活动,例如旧令牌的重用。

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

Revoking and Invalidating Tokens

令牌失效虽然很重要,但令牌revocation添加了另一个安全层,尤其是在用户注销、丢失设备或suspected安全漏洞等场景中。虽然无状态JWT访问令牌在失效之前保持有效,但有效地管理refresh令牌可以阻止新访问令牌的发行。

Revoking令牌及时地防止未经授权的访问敏感资源 [8]. 要立即invalidation令牌,请考虑在API请求期间实施一个server-side黑名单来跟踪revoked令牌并在请求期间检查它们。此外,Single Logout(SLO)功能允许用户在一个动作中终止多个身份验证会话,确保所有相关的refresh令牌在连接的服务中都被revoked。

在处理被泄露的令牌时,应建立清晰的协议。这些协议应包括立即令牌注销、自动安全警报、及时通知受影响用户以及注销与被泄露令牌相关的所有活跃会话。

安全令牌更新

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

使用Capacitor的开发者,可以使用工具如Capgo来获得符合规范的OTA解决方案,具有端到端加密。这确保了安全更新可以安全地传递到设备,同时遵守苹果和安卓的指南。这种系统尤其适合解决紧急安全漏洞。

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

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

When deciding how to store tokens securely, it’s all about finding the right balance between security and usability. Your choice can directly affect your app’s vulnerability to attacks and the overall user experience. Let’s break down the trade-offs of different storage methods.

In-Memory Storage vs. Persistent Storage

In-memory storage 在应用程序内存或 JavaScript 变量中保留令牌,使其成为一种高度安全的选项。由于令牌未写入 持久性存储,攻击者使用传统的 XSS 攻击有更少的机会访问它们。

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

另一方面, 持久性存储 -方法,如本地存储、会话存储或 cookie - 提供更平滑的体验。持久性存储的令牌允许用户关闭浏览器、稍后返回并从上次离开的地方继续使用,而无需再次登录 [9].

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

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

Keychain/Keystore vs. Custom Encryption

对于移动应用 平台native安全存储 如iOS Keychain和Android Keystore是金标准。 这些解决方案提供了硬件背后的安全性,使token提取变得更加困难

这些native工具的美丽之处在于它们的简单性。 它们是内置在操作系统中,因此开发者不需要编写大量code来实现它们。 另外,它们支持像 生物识别验证 和集中化凭证管理等功能,这些功能都提高了安全性和用户便利性 [10].

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

安全性与可用性比较表

存储方式安全级别可用性实现复杂度最佳用途
内存存储低(刷新后丢失)高安全性,短会话
本地存储仅非敏感数据
会话存储临时会话数据
__CAPGO_KEEP_0__高级 (使用合适的标志)中级中级需要服务器支持的Web应用
iOS密钥链非常高中级iOS原生/混合应用
Android密钥库非常高{"targetLanguage":"Simplified Chinese","protectedTokens":["Cloudflare","Capacitor","GitHub","Capgo","code","API","SDK","CLI","npm","bun"],"texts":["","","","","","","","","",""],"translations":["","","","","","","","","",""]}"]{"targetLanguage":"Simplified Chinese","protectedTokens":["Cloudflare","Capacitor","GitHub","Capgo","code","API","SDK","CLI","npm","bun"],"texts":["","","","","","","","","",""],"translations":["","","","","","","","","",""]}"]{"targetLanguage":"Simplified Chinese","protectedTokens":["Cloudflare","Capacitor","GitHub","Capgo","code","API","SDK","CLI","npm","bun"],"texts":["","","","","","","","","",""],"translations":["","","","","","","","","",""]}"]
{"targetLanguage":"Simplified Chinese","protectedTokens":["Cloudflare","Capacitor","GitHub","Capgo","code","API","SDK","CLI","npm","bun"],"texts":["","","","","","","","","",""],"translations":["","","","","","","","","",""]}"]{"targetLanguage":"Simplified Chinese","protectedTokens":["Cloudflare","Capacitor","GitHub","Capgo","code","API","SDK","CLI","npm","bun"],"texts":["","","","","","","","","",""],"translations":["","","","","","","","","",""]}"]{"targetLanguage":"Simplified Chinese","protectedTokens":["Cloudflare","Capacitor","GitHub","Capgo","code","API","SDK","CLI","npm","bun"],"texts":["","","","","","","","","",""],"translations":["","","","","","","","","",""]}"]{"targetLanguage":"Simplified Chinese","protectedTokens":["Cloudflare","Capacitor","GitHub","Capgo","code","API","SDK","CLI","npm","bun"],"texts":["","","","","","","","","",""],"translations":["","","","","","","","","",""]}"]{"targetLanguage":"Simplified Chinese","protectedTokens":["Cloudflare","Capacitor","GitHub","Capgo","code","API","SDK","CLI","npm","bun"],"texts":["","","","","","","","","",""],"translations":["","","","","","","","","",""]}"]

{"targetLanguage":"Simplified Chinese","protectedTokens":["Cloudflare","Capacitor","GitHub","Capgo","code","API","SDK","CLI","npm","bun"],"texts":["","","","","","","","","",""],"translations":["","","","","","","","","",""]}"]

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.

{"targetLanguage":"Simplified Chinese","protectedTokens":["Cloudflare","Capacitor","GitHub","Capgo","code","API","SDK","CLI","npm","bun"],"texts":["","","","","","","","","",""],"translations":["","","","","","","","","",""]}"]

{"targetLanguage":"Simplified Chinese","protectedTokens":["Cloudflare","Capacitor","GitHub","Capgo","code","API","SDK","CLI","npm","bun"],"texts":["","","","","","","","","",""],"translations":["","","","","","","","","",""]}"],

保护用户数据通过安全令牌存储不仅是一种技术最佳实践 - 它是维护应用完整性的必要性。 2022年确认的 81% 的违规事件与弱、重复或盗用的密码有关 [12]移动开发者需要优先考虑强大的令牌安全措施。

最佳实践摘要

有效的令牌安全计划依赖于多层保护。首先使用 平台原生安全存储,例如 iOS Keychain 和 Android Keystore,提供硬件背后的安全性。

避免将令牌存储在 LocalStorage 或 IndexedDB 中 [2],因为这些方法容易受到 XSS 攻击。相反,依赖于操作系统内置的安全存储选项,确保有限访问。对于使用 Capacitor 的开发者,安全存储插件提供了使用原生保护同时保持跨平台功能的方法。

令牌生命周期管理是另一个关键方面。定期过期令牌并实现刷新令牌旋转,生成每次访问令牌请求时的新刷新令牌 [3]。较短的刷新令牌寿命可以减少在被盗时滥用的风险。

保持签名密钥机密,仅与必需服务共享 [1]. 避免使用不安全的实践,如记录令牌或将其嵌入URL中 [11]. 这些步骤集体加强了令牌管理策略。

开发人员的下一步

以下是如何通过改进令牌安全来提高应用程序安全性的最佳实践:

  • 检查令牌存储方法。 如果您正在使用像 LocalStorage 这样的不安全解决方案,优先考虑迁移到平台原生安全存储。对于 Capacitor 应用程序,采用安全存储插件以有效利用原生保护。

  • 实施层次式身份验证。 对于低风险操作使用更简单的方法,但要求 多因素身份验证(MFA)或生物识别 (MFA) 或生物识别 [12](MFA) 或生物识别 [12].

  • 根据 Microsoft 的说法,MFA 可以阻止 99.9% 的自动化网络攻击。然而,考虑用户体验 - 研究表明,约有三分之一的用户避免 MFA 因为它不方便。 为了安全和即时的发布。像Capgo这样的工具使Capacitor应用程序能够实现加密的实时更新,确保安全修复能够安全地到达用户,而不会在更新过程中损害令牌安全性。

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

  • 监控身份验证模式。 保持对异常活动的关注,并根据不断演进的威胁调整您的安全措施。 [13].安全审计应该成为您的开发过程的常规部分,而不是一个后thought。

虽然移动安全继续演进,但核心原则保持不变:使用本机安全存储、有效地管理令牌生命周期,并确保加密是不可谈判的。有 2022年,智能手机的81%已配备了生物识别功能 ,开发者有了强大的工具来增强安全性和用户体验。 [12]您的用户正在将他们的数据托管在您身上——确保您的令牌存储实践符合最高的安全标准。

常见问题解答(FAQs)】

常见问题解答(FAQs)

::: faq

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

使用平台原生安全存储,例如iOS Keychain和Android Keystore,保护移动应用中的敏感数据至关重要。这些工具具有 内置加密,确保令牌免受未经授权访问的威胁。除此之外,它们还集成了 用户身份验证,要求用户确认身份才能访问存储的数据。这增加了安全性的一层。

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

::: faq

移动应用中如何安全地管理令牌生命周期?

在移动应用中安全地管理令牌生命周期,开发者应该遵循一些基本实践。首先使用 短期令牌,例如15分钟过期的令牌。这可以最小化令牌被泄露的窗口,防止滥用。为了保持用户便利性而不损害安全性, 刷新令牌,这些令牌允许在不强制用户重复登录的情况下重新获取令牌。令牌的正确存储对于防止未经授权的访问至关重要。始终依赖平台特定的安全存储解决方案,如

Keychain 用于iOS或 Android Keystore Android Keystore. 这些是专门为保护敏感数据而设计的。另外,避免在应用程序中硬编码令牌或将它们以明文形式存储,因为这可能会使它们暴露于潜在威胁中。

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

::: faq

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

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

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

Capacitor应用的实时更新

当web层面的bug出现时,通过Capgo将修复推送到用户端,而不是等待几天的app store审批。用户在后台接收更新,而native的变化仍然遵循正常的审批流程。

立即开始

博客最新文章

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