将数据备份到服务器时验证用户



注意:尽管我在iOS应用的背景下提出了这个问题,但我认为它并不局限于运行在特定操作系统上的应用。

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

  • 用户第一次运行应用
  • 在应用程序中创建帐户,与服务器通信,在服务器上创建帐户并获得唯一的"用户id"(uid)
  • 应用程序存储这个uid,以便在随后与服务器的通信中识别用户

然而,如果有人要破解iphone上的应用程序,他们可以改变用户id值,然后他们就可以立即访问/允许他们修改其他用户的数据。

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

所以,我的问题是双重的:

  1. 这是实现这一目标的正确方法吗?或者我应该采用其他的标准方法吗?
  2. 如果这是正确的方法,建议使用什么方法来生成唯一密钥?

首先,如果您愿意,可以使用更复杂的值作为开始的用户ID(例如UUID)。随着服务规模的扩大,单调增加的id很难管理。

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

那么你要做的是:

  1. 在服务器上生成用户ID,并使用它创建某种"认证令牌",以便客户端必须登录。
  2. 使用只有您的服务器知道的密钥在服务器上签署认证令牌。
  3. 发送认证令牌到客户端,在那里存储所有后续登录。通过HTTPS传输认证令牌,以防止其他人在网络上窥探它。

当应用开始登录时,向服务器发送验证令牌。如果它被黑客攻击,签名验证将失败,您将知道拒绝客户端。

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

其他注意事项:如果你所知道的用户只是他们生成的UID,你没有任何方法让该用户稍后从不同的iOS设备返回并在那里恢复他们的帐户,对吗?一般来说,如果用户将在他们的账户中创建任何"有价值"的东西,他们以后想要访问,你可能会想要创建一个更传统的用户账户,由电子邮件地址和密码或类似的东西支持,这样他们可以在重新安装你的应用后再次访问该账户。

我建议使用"标准的web浏览器方式",让用户设置一个电子邮件(登录名)和密码。

当iOS设备连接到服务器(使用HTTPS)时,它使用常规的"基本认证"登录,并接收一个有效期为一段时间的cookie。只要设备在cookie的生命周期内继续向服务器请求数据,cookie就会更新,当cookie过期时,服务器将自动挑战客户端使用其存储的信息再次登录。

这有一些优点;

  • 用户可以用新设备重新登录他的帐户,并定期重置密码。简单,直接解决问题。

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

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

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

也就是说;无需为您开发特殊的解决方案,一般解决了如何处理登录信息的问题,经过验证的安全性和易用性。

在我看来,没有比这更好的了。

相关内容

  • 没有找到相关文章

最新更新