【问题标题】:iPhone App with a Server Backend - How to ensure all access is from the iPhone app only?带有服务器后端的 iPhone 应用程序 - 如何确保所有访问仅来自 iPhone 应用程序?
【发布时间】:2010-03-09 14:31:10
【问题描述】:

我不太介意盗版等,但我想确保后端(基于 Rails)不对可以执行 DOS 等操作的自动化服务开放。因此我想简单地确保所有访问到后端(这将是一些对 GET 和 PUT 数据的 REST 查询)将通过有效的 iPhone 应用程序,而不是在机器上运行的某些脚本。

我想避免使用帐户,以便无缝的用户体验。

我的第一个意图是将 UDID 和密钥散列在一起,并通过与服务器的 HTTPS 连接提供它(和 UDID)。这将允许创建经过身份验证的会话或返回错误。

如果被窃听,则攻击者可以获取哈希并重放它,从而使该方案对重放攻击开放。但是,HTTPS 连接不应该保护我免受窃听吗?

谢谢!

【问题讨论】:

    标签: iphone security backend


    【解决方案1】:

    就像 bpapa 说的那样,它可以被欺骗,但是,就像你说的那样,你并不担心任何人来,只是连续向你的服务器发送一千个请求,而你的服务器必须处理每一个。

    您对哈希的想法是一个好的开始。从那里,您还可以将当前时间戳附加到预散列值,并将其发送。如果给定的时间戳与服务器的当前时间相差超过 1 天,则禁止访问。无论如何,这会阻止重放攻击超过一天。

    另一种选择是使用随机数。任何人都可以从您的服务器请求一个随机数,但是设备必须在将哈希发送到服务器之前将其附加到预哈希数据中。必须存储生成的随机数,或者,可能只是服务器的当前时间戳。然后,设备必须将服务器的时间戳而不是其自己的时间戳附加到预先散列的数据中,从而允许发生重放攻击的时间比一整天短得多。

    【讨论】:

    • 我想这可能是我要走的路。我也没有考虑过对时间戳(或至少是当前日期)进行哈希处理,我喜欢它可以防止重放攻击的方式。如果有人在午夜前半秒提交请求,并且服务器选择第二天获取哈希的日期值,那么哈希不匹配可能会出现一些轻微的问题,但是只要我检查任何一方的日期,它就应该是好的。我认为这代表了一个很好的选择组合。我将获得一个 SSL 证书,这样我就不会被窃听,并对数据使用带有时间和机密的哈希值。谢谢!
    【解决方案2】:

    将 SSL 与客户端证书一起使用。在您的客户端中有一个私钥并为其颁发证书,您的网络服务器可以要求此客户端证书存在,以便会话继续进行。

    我无法提供 Rails 的代码细节,但从架构角度来说,这是最安全的做法,尽管可能有点矫枉过正。带有证书的 SSL 是一种标准的行业解决方案,并且 iPhone/客户端和服务器端都存在库,因此您无需发明任何东西或实施太多,只需让它们很好地协同工作即可。

    您也可以考虑 HMAC,例如 HMAC-SHA1,它基本上是这里其他人谈论的哈希值的标准化。如果您向其中添加随机数,您也可以安全地抵御重放攻击。有关如何使用 nonce 实现 HMAC-SHA1 的想法,您可以查看 OAuth 协议(不是整个流程,而是它们如何将 nonce 和其他参数绑定到经过身份验证的请求中)。

    【讨论】:

    • 这是一个绝妙的答案。我认为在客户端上拥有私钥对我来说可能有点过于复杂,但我很欣赏这是最正式和最安全的方法。我一定会看看需要什么,谢谢!
    【解决方案3】:

    没有办法确保它,因为它可以被欺骗。

    如果你真的想走这条路(老实说,除非你在这里做一些真正超级关键的任务,否则你可能会浪费你的时间),你可以传递 iPhone 设备令牌。或者也许散列它然后传递它。当然,您无法在服务器端或其他任何地方对其进行验证,但如果一个坏人真的想要让您失望,这是他必须首先处理的第 1 个障碍。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-21
      • 1970-01-01
      相关资源
      最近更新 更多