2012-10-03 289 views
11

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

安全地做到这一点的最佳方式是什么?

我可以只依靠应用程序保持挂起状态并将标记保存在“内存”中吗?

+0

您可能也想看看OWASP指南 - https://www.owasp.org/index.php/IOS_Developer_Cheat_Sheet – rajagp

回答

15

2个选项

  • 利用NSUserdefault(店作为访问令牌或文本框输入[记住我的选项])
  • 钥匙扣做工作访问(推荐)。

NSUserdefaults对于存储用于验证目的的可信值是不安全的。另一方面,钥匙链是为了做到这一点,安全和可靠的。

7

你不能依靠那个iOS将你的应用永远留在内存中。因此,您必须在某个时刻将令牌保存到持久存储中。

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

+0

但是,如果凭证位于远程数据库中,并且他不想存储这些凭据本地?是否需要使用钥匙串来保存令牌或类似的东西? –

+1

不需要。您不必在钥匙链中存储任何东西。这取决于你在哪里存储任何秘密。但是,假设您将凭证存储在远程数据库中。现在的问题是您的应用程序如何验证远程数据库?如果它将存储硬编码的用户名/密码,那么任何人都可以反编译你的应用程序,从它获取远程数据库的用户名/密码,并使用它来获得真正的凭据。所以,最后你需要在你的设备上存储一些东西,并且Keychain服务是一种常见且合理的安全方式。 –

5

你不能“安全”。令牌是公共知识,只要您的设备上的黑客可以访问它,无论您尝试如何保护它。把它放在钥匙链里不会改变这个事实。即使你将它存储在那里,它会在它存在的时候保证它的安全,但它们可以等到它到期,然后在下一次通过线路时阻塞下一个。您的访问令牌不是您需要担心的安全问题,因为事实上,您无法在移动环境中执行此操作。

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

+6

虽然我同意受损的设备或连接会使大多数事情变得不安全,但安全主要是通过使攻击者非常难以获取信息或破坏某些东西。考虑到这一点,将更敏感的信息保存在安全的环境中(例如iOS Keychain)非常有意义。当然,一个坚定的黑客可能会击败它,但一个不太确定的黑客不会这样做,这是一场胜利。 – lm2s

相关问题