在 iOS 上存储身份验证令牌

Posted

技术标签:

【中文标题】在 iOS 上存储身份验证令牌【英文标题】:Storing authentication token on iOS 【发布时间】:2012-09-24 14:28:54 【问题描述】:

我正在构建一个 ios 应用程序,并且用户使用我的 Web 服务进行身份验证。我不希望他们每次启动应用程序时都登录(令牌持续一个月)。所以我想把它缓存在设备上的某个地方。

安全的最佳方式是什么?

我可以仅依靠应用程序保持暂停状态并将令牌保留在“内存”中吗?

【问题讨论】:

您可能还想查看 OWASP 指南 - owasp.org/index.php/IOS_Developer_Cheat_Sheet 【参考方案1】:

您无法“安全地”执行此操作。令牌是公共知识,一旦它在您的设备上,无论您尝试采取什么措施来保护它,黑客都可以访问它。把它放在钥匙串里不会改变这个事实。即使您将它存储在那里,这样可以确保它在其中时安全,他们也可以简单地等到它过期,然后在下次通过电线进入时阻止下一个。您无需担心访问令牌的安全性,因为事实上您无法在移动环境中做到这一点。

这意味着您可以将其存储在您想要的任何位置。 NSUserDefaults 很好,钥匙串很好,数据库很好,文档目录中的文本文件很好。所有这些都同样安全,因为坚定的黑客可以简单地等待合适的机会来访问他们想要的数据。相反,您应该担心保护用户的身份验证凭据。确保将它们存储在钥匙串中,并且仅通过 HTTPS 与您的 API 与具有有效 SSL 证书的服务器通信。

【讨论】:

虽然我同意受损的设备或连接会使大多数事情变得不安全,但安全工作主要是通过使攻击者非常难以获得信息或破坏某些东西。考虑到这一点,将更敏感的信息保存在安全的环境中(例如 iOS 钥匙串)是有意义的。当然,一个坚定的黑客可能能够击败它,但一个不那么坚定的黑客则不会,这就是一场胜利。 虽然我同意,但你说的大部分时间都是真的——你最好把这个东西放在钥匙串里,免得自己向其他人解释。 默默无闻是不安全的! @Josh 黑客如何在 HTTPS 连接(使用有效的 SSL 证书)下获取刷新的令牌?我认为这在浏览器上是可能的,但在 iOS 上是不可能的。 您可以使用 Charles @allenlinli 等软件自己完成此操作。无论如何,仅仅因为“一个坚定的黑客无论如何都可以得到它”绝对不会完全贬值,从而使其更难(或特别)这样做。这不仅取决于是否有人可以截获密钥,还取决于有多少人可以并且愿意这样做。每个已建立的最佳实践都会将该池过滤到少数和高技能的人,从而降低实际发生的可能性和频率。【参考方案2】:

2 个选项

使用NSUserdefault(存储为访问令牌或文本字段输入[记住我选项]) 钥匙串访问(推荐)完成这项工作。

NSUserdefaults 对于存储用于身份验证目的的可信值是不安全的。另一方面,Keychain 就是这样做的,安全可靠。

【讨论】:

【参考方案3】:

您不能相信 iOS 会将您的应用程序永远保存在内存中。因此,您必须在某个时候将令牌保存到持久存储中。

看看Keychain Service for iOS。这是存储密码、令牌和其他密钥等内容的最佳位置。

【讨论】:

但是如果凭证在远程数据库中并且他不想在本地存储这些凭证怎么办?是否需要使用钥匙串来保存令牌或类似的东西? 没有。您不必在钥匙串中存储任何东西。您想在哪里存储任何秘密取决于您。但是,假设您将凭据存储在远程数据库中。现在的问题是您的应用程序如何对远程数据库进行身份验证?如果它将存储硬编码的用户名/密码,那么任何人都可以反编译您的应用程序,从中获取远程数据库的用户名/密码并使用它来获取真实凭据。所以,最后你需要在你的设备上存储一些东西,而钥匙串服务是一种常见且相当安全的方式。

以上是关于在 iOS 上存储身份验证令牌的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 上使用 AppAuth 库刷新身份验证令牌

AFNetworking 和身份验证令牌错误代码 -1011

如何验证在 jwt.io 上使用 Keycloak 身份验证提供程序创建的 HS256 签名 JWT 令牌

仅使用 Facebook 令牌在 iOS 上发送 Firebase 邀请登录 Firebase 身份验证

是否可以使用 id 令牌进行电子邮件身份验证?

Node Express - 身份验证令牌的存储和检索