我不太介意盗版等等,但我想确保后端(基于Rails)不对可以DOS等的自动化服务开放。因此我想简单地确保所有访问权限到后端(这将是对GET和PUT数据的一些REST查询)将通过有效的iPhone应用程序,而不是在机器上运行的某些脚本。
我希望避免使用帐户,以便用户体验无缝。
我的第一个目的是将UDID和秘密一起散列,并通过HTTPS连接向服务器提供(和UDID)。这将允许创建经过身份验证的会话或返回错误。
如果被窃听,则攻击者可以获取哈希并重播它,使该方案可以重放攻击。但是,HTTPS连接不应该保护我免受窃听?
谢谢!
答案 0 :(得分:6)
就像bpapa说的那样,它可能是欺骗性的,但是,就像你说的那样,你并不担心这一点,就像任何人一样,只是连续向你的服务器发送一千个请求,你的服务器必须处理每一个。
你对哈希的想法是一个好的开始。从那里,您还可以将当前时间戳附加到预哈希值,并将其发送。如果给定的时间戳与服务器的当前时间不同超过1天,则禁止访问。无论如何,这会在一天以后停止重播攻击。
另一种选择是使用随机数。任何人都可以从您的服务器请求一个nonce,但是在将哈希发送到服务器之前,设备必须将其附加到预哈希数据。生成的nonce必须存储,或者可能只是服务器的当前时间戳。然后,设备必须将服务器的时间戳而不是自己的时间戳附加到预先散列的数据,从而允许比重播攻击发生的整天更短的时间。
答案 1 :(得分:3)
将SSL与客户端证书一起使用。在您的客户端中拥有一个私钥并为其颁发证书,您的Web服务器可以要求此客户端证书存在,以便会话继续进行。
我无法为Rails提供代码详细信息,但在体系结构方面,这是最安全的事情,即使可能有点矫枉过正。带证书的SSL是一个标准的行业解决方案,并且iPhone /客户端和服务器端都有库,因此您不必发明任何东西或实现太多,只需让它们很好地协同工作。
您也可以考虑使用HMAC,就像HMAC-SHA1一样,它基本上是其他人在这里讨论的散列内容的标准化。如果你添加了nonce,你也可以安全地防止重放攻击。有关如何使用nonce实现HMAC-SHA1的想法,您可以查看OAuth协议(不是整个流程,而是它们如何将nonce和其他参数组合在一起进行经过身份验证的请求)。
答案 2 :(得分:2)
没有办法确保它,因为它可能是欺骗性的。
如果你真的想走这条路(老实说,除非你在这里做一些非常关键的任务,你可能会浪费你的时间),你可以传递iPhone设备令牌。或者可以哈希它然后传递它。当然,你无法在服务器端或其他任何方面对其进行验证,但如果一个坏人真的想让你失望,那么他必须首先解决这个障碍#1。