1

注意:虽然我在 iOS 应用程序的上下文中提出了这个问题,但我不认为它仅限于在该特定操作系统上运行的应用程序。

我正在开发一个 iOS 应用程序,它将用户数据备份到服务器,并且我试图找出在服务器端验证被更新的用户实际上是真实用户的最佳方法。每个用户都有一个 id ( uid)。如果这就是我所依赖的服务器端,那么我想这个过程会是这样的:

  • 用户第一次运行应用程序
  • 在应用程序中创建帐户,该应用程序与服务器通信以在服务器上创建帐户并获取唯一的“用户 ID”(uid)
  • 应用程序存储此 uid,以便它可以在与服务器的后续通信中识别用户

但是,如果有人要破解他们 iPhone 上的应用程序,他们可以更改用户 ID 值,然后立即让他们访问/允许他们修改其他用户的数据。

我正在考虑的当前解决方案是用户接收 2 个唯一 ID、uid(只是一个自动递增的数字)和一个更长、更复杂的密钥字符串。因此,与服务器的所有通信都必须同时发送 uid 和密钥。服务器将验证它们是否匹配,以确保用户确实是应用程序所说的那个人。

所以,我的问题有两个:

  1. 这是实现这一目标的正确方法吗?还是我应该采用其他一些标准方法?
  2. 如果这是正确的方法,那么生成唯一密钥的推荐方法是什么?
4

2 回答 2

4

首先,如果您愿意,您可以使用更复杂的值作为用户 ID(例如 UUID)。随着服务的扩展,单调递增的 ID 变得难以管理。

当安全网站在浏览器上留下安全 cookie 以记住会话时,您会遇到同样的问题。这些 cookie 确实包含用户 ID,但必须防止篡改。这通常通过签署 cookie来完成在发送回之前在服务器上

所以你要做的是:

  1. 在服务器上生成用户 ID,并使用它为客户端创建某种“身份验证令牌”以供登录。
  2. 使用只有您的服务器知道的密钥对服务器上的身份验证令牌进行签名。
  3. 将身份验证令牌发送到客户端,并在其中存储所有后续登录。通过 HTTPS 传输身份验证令牌以防止其他人在网络上窥探它。

当应用程序登录时,将身份验证令牌发送到服务器。如果它被黑客入侵,签名验证将失败,您将知道拒绝客户端。

考虑在签名令牌中也包含一个时间戳,这样它会在一段时间后过期,迫使服务器定期重新生成一个身份验证令牌,这样可以在你的密钥被泄露的情况下保护你。除非用户自己有一个共享的秘密/密码,否则他很难完全做到这一点,他也可以使用它来定期进行身份验证。取决于你需要走多远。

其他注意事项:如果您对用户的所有了解都是他们生成的 UID,那么您无法让该用户稍后从不同的 iOS 设备返回并在那里恢复他们的帐户,对吗?一般来说,如果用户将在他们的帐户中创建他们以后想要访问的任何“有价值”的东西,您可能希望创建一个更传统的用户帐户,并以电子邮件地址和密码等为后盾,这样他们就可以重新安装您的应用程序后再次访问该帐户。(这可能与您的情况相关,也可能不相关。)

于 2012-01-06T23:12:53.950 回答
0

我建议采用“标准网络浏览器方式”,只让用户设置电子邮件(登录名)和密码。

当 iOS 设备连接到服务器(使用 HTTPS)时,它使用常规的“基本身份验证”登录,并收到一个在设定的时间段内有效的 cookie。只要设备在 cookie 的生命周期内不断向服务器请求数据,cookie 就会被更新,当 cookie 过期时,服务器会自动要求客户端再次使用其存储的信息登录。

这有一些优点;

  • 用户可以使用具有常规密码重置功能的新设备重新登录他的帐户。简单,直接解决问题。

  • 服务器端没有特殊的解决方案,任何服务器端脚本都可以像浏览器一样需要身份验证 - 内置功能。

  • 您不必发明自己的安全方案。每天有数百万浏览器使用此方案对网站进行身份验证。

  • 不绑定特定手机,如果用户有多个iOS设备,只需登录即可使用所有设备的同一个帐户。无需特殊设置程序。

换句话说; 没有专门的解决方案供您开发,一般解决了如何处理登录信息、经过验证的安全性和易用性的问题。

根据我的说法,你真的无法击败它:)

于 2012-01-13T20:08:54.420 回答