跳过主要内容

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

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

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

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

关键点:

  • 使用平台原生安全存储:在iOS Keychain或Android Keystore中存储令牌以获得硬件背后的安全性。
  • 在休眠状态下加密令牌:使用像 EncryptedSharedPreferences (Android)或 CryptoKit (iOS)这样的工具进行安全加密。
  • 限制令牌暴露: 使用短期令牌和令牌刷新轮换来降低风险。
  • 安全通信: 始终使用 HTTPS 并实施证书固定以防止截取。
  • 管理令牌生命周期: 定期过期、刷新和撤销令牌以最小化窃取造成的损害。

快速比较存储方法:

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

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

Medium

安全令牌存储的基本规则

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

使用 HTTPS 和证书固定

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

为了进一步加强这一点,实施 证书固定。对于 Capacitor 应用程序, @capgo/capacitor-ssl-https-验证 固定 HTTPS 连接到 iOS 和 Android 上的 CapacitorHttp 的捆绑证书。这一技术确保应用程序只与您信任的服务器通信,即使有人尝试使用伪造的证书。通过在应用程序中硬编码您的服务器的证书或公钥,您建立了应用程序与服务器之间的直接信任关系。

'你应该固定任何时候你想对远程主机的身份有相对确定的信任或在恶意环境中操作。由于一个或两个条件几乎总是成立,你应该固定所有时间。' – OWASP 固定指南 [5]

实例:Twitter在其移动应用中引入了证书固定(certificate pinning)后,证书固定帮助其避免了中间人攻击(Man-in-the-Middle,MitM)。他们将服务器的SSL证书公钥直接嵌入到应用中。当用户连接时,应用会验证证书与固定证书是否匹配。如果没有匹配,连接会立即终止。这一方法显著减少了中间人攻击的发生,并提高了用户对平台的信心。 [5].

您可以选择使用 证书固定 (验证整个证书) 以获得最高安全性 公钥固定钉定 (仅验证公共密钥) 以便在证书续期时具有更大的灵活性。类似工具 OkHttp 为 Android 和 Alfresco 为 iOS 方便实施这些技术 [5].

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

限制令牌暴露

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

  • 使用 短期访问令牌 短期访问令牌
  • 使用 应用最小权限原则
  • Enable 启用刷新令牌轮换 [4].

每次使用刷新令牌请求新访问令牌时都会发行一个新的刷新令牌。如果刷新令牌被盗用,它在合法应用使用它后就会失效,减少了风险窗口。

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

__CAPGO_KEEP_0__ 设备上的令牌存储

即使设备丢失、被盗或被恶意软件破坏,数据加密也确保令牌无法读取 [4].

  • For Android对于Android EncryptedSharedPreferences : 使用 SecureJWTStorage (适用于Android 10及后续版本) EncryptedSharedPreferences without requiring complex custom encryption code.
  • 类可以使用安全地存储和检索JWT令牌,而无需进行复杂的自定义加密 KeychainHelper 对于iOS CryptoKit 在存储它们到Keychain之前 [4].

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

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

移动平台特定的令牌存储方法

每个移动平台都提供了自己的工具来保护令牌,这些工具是为了满足安全性和用户体验的需求而设计的。这些本地选项基于核心实践,如HTTPS、加密和限制暴露,这些实践在前面已经讨论过

Android:Keystore和 EncryptedSharedPreferences

EncryptedSharedPreferences

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

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

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

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

iOS:Keychain和 安全环境

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

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

Capacitor安全存储插件

Capacitor 框架文档网站

For cross-platform apps, Capacitor offers secure storage plugins that simplify token security without requiring platform-specific code. @capgo/capacitor-数据存储-SQLite 在本地存储数据使用 SQLite 和可选的加密, @capgo/capacitor-持久账户 在 iOS 上,插件将数据存储在加密的系统 Keychain 中,而在 Android 上,它使用 AES 在 GCM 模式下加密数据,并使用 Android Keystore 生成密钥,然后将其保存在 SharedPreferences 中。对于 web 环境,插件使用未加密的 localStorage - 但仅用于调试目的。

In February 2025, martinkasa updated the capacitor-secure-storage-plugin to support Capacitor v7, ensuring secure storage of string values across iOS and Android. These plugins are ideal for storing login credentials and JSON data. However, they may lack the granular control offered by native solutions. For enterprise-level apps with advanced security needs, native options like iOS Keychain Services and Android Keystore APIs - or enhanced tools like Ionic’s Identity Vault - might be better suited. Capacitor’s official documentation also advises using native secure storage for sensitive data, such as encryption keys or session tokens.

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

令牌管理最佳实践

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

令牌过期和刷新方法

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

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

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

注销和注销令牌

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

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

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

安全令牌更新与OTA系统

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

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

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

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

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

内存存储与持久存储

内存存储 将令牌存储在应用程序内存或 JavaScript 变量中,使其成为一种高度安全的选项。由于令牌未写入持久存储 __CAPGO_KEEP_0__攻击者使用传统的XSS攻击时,攻击他们的机会较少。

But there’s a catch: tokens stored in memory disappear when users refresh the page or open a new tab. This makes in-memory storage less practical for web apps where users expect a seamless browsing experience.

另一方面 持久存储 持久性存储 [9].

- 本地存储、会话存储或 cookie 等方法 - 提供更流畅的体验。持久性存储的令牌允许用户关闭浏览器,稍后返回并从上次离开的地方继续使用,无需再次登录 [4]然而,这种便利性伴随着安全风险。持久性存储更容易受到 XSS 攻击,恶意脚本可以从本地或会话存储中窃取令牌

For mobile apps using Capacitor, Web Workers Web Worker [9]提供了一个中间地带。运行在单独的全局作用域中,它们提高了安全性,同时比内存存储更好地维护了可用性 [9]. 如果 Web Worker 不是可行的选项,JavaScript 闭包可以模拟私有方法来添加额外的保护层级

Keychain/Keystore vs. 自定义加密

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

这些本地工具的美妙之处在于它们的简单性。它们是操作系统的一部分,因此开发人员不需要编写大量的code来实现它们。另外,它们支持像 生物识别认证 和集中化凭证管理 [10].

这两种功能都可以提高安全性和用户体验自定义加密 [10]另一方面,给开发人员提供了更多的控制权,但带来了重大挑战。安全性完全依赖于加密的实现以及密钥的管理

安全性与可用性比较表格

安全性与可用性比较表格 安全等级 易用性 实现复杂度 最佳使用场景
内存存储 高 刷新后丢失(低) 低 高安全性,短会话
本地存储 低 高 低 仅非敏感数据
会话存储 中 高 低 临时会话数据
安全Cookie 高(带有适当标志) 中 中 支持服务器的Web应用
iOS Keychain 极高 中等 低 iOS原生/混合应用
安卓密钥库 极高 中等 低 Android原生/混合应用
自定义加密 可变 Medium High 专门的安全要求

本表强调了平台本地存储选项,如Keychain和Keystore,提供了安全性和易于实现的强大组合,使其成为移动应用的理想选择。它们提供了强大的保护,而不需要开发人员掌握加密。

对于Capacitor开发者来说,使用安全存储插件来访问这些本机解决方案是一个明智的决定。它结合了Keychain和Keystore的硬件背后的安全性与Capacitor提供的跨平台灵活性。

最终,您的令牌存储选择应与您的应用的威胁模型和用户期望相一致。处理敏感数据的应用,如医疗保健或金融应用,应将安全性置于一切之上。相比之下,面向消费者的应用可能会接受更高的风险以提供更Smooth的用户体验。通过了解这些权衡,您可以选择最适合您的需求的存储方法。

关键点

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

最佳实践摘要

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

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

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

保密签名密钥,仅与必要的服务共享 [1].避免不安全的做法,如记录令牌或将其嵌入URL [11].这些步骤共同加强了令牌管理策略。

开发者下一步

context

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

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

  • 使用OTA(无线空中)更新系统 进行安全和即时的更新。工具,如Capgo,使Capacitor应用程序能够进行加密的实时更新,确保安全修复能够安全地到达用户,而不会在更新过程中损害令牌安全。

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

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

虽然移动安全不断进步,但核心原则仍然相同:使用本机安全存储,有效管理令牌生命周期,并确保加密不可或缺。随着 2022 年 的 [12] 81% 的智能手机配备了生物识别技术

,开发者有了强大的工具来增强安全性和用户体验。

FAQs

常见问题解答

::: faq

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

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

::: faq

什么是移动应用程序中安全管理令牌生命周期的最佳实践?

在移动应用程序中安全地处理令牌生命周期,开发人员应该坚持几个基本的实践。首先使用 短期令牌例如那些15分钟过期的令牌。这样可以最小化令牌被泄露的窗口。为了保持用户的便利性而不损害安全性,实现 令牌刷新。这些令牌允许在不迫使用户重复登录的情况下重新发行令牌。

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

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

:::

常见问题

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

说到这一点,某些情况下自定义加密变得不可避免 - 比如当你处理极其敏感的数据或试图满足标准工具无法处理的严格法规要求时。 在这些情况下,开发者必须遵循 最佳实践 以确保他们的 加密方法 不仅安全可靠,还符合行业标准。 在选择自定义加密方法之前,务必要考虑各项权衡。

:::

继续阅读 Secure Token Storage: Mobile Developers 的最佳实践 如果你正在使用 Secure Token Storage: Mobile Developers 的最佳实践 来规划安全性和合规性,连接它与 加密 加密 合规 为 Compliance 的实现细节 Capgo 安全扫描器 为 Capgo 安全扫描器 的产品工作流程 Capgo 安全 为 Capgo 安全 的产品工作流程 Capgo 信任中心 为 Capgo 信任中心 的产品工作流程

Capacitor应用程序的即时更新

当 web 层面的 bug 活跃时,通过 Capgo 将修复推送给用户,而不是等待几天的 app store 审核。用户在后台接收更新,而本机更改仍然在正常审查路径中。

来自 Martin 的人性化支持

立即开始

最新博客文章

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