Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带服务器后端的iPhone应用程序-如何确保所有访问仅来自iPhone应用程序?_Iphone_Security_Backend - Fatal编程技术网

带服务器后端的iPhone应用程序-如何确保所有访问仅来自iPhone应用程序?

带服务器后端的iPhone应用程序-如何确保所有访问仅来自iPhone应用程序?,iphone,security,backend,Iphone,Security,Backend,我不太介意盗版等,但我想确保后端(基于Rails)不会对可以执行此操作的自动化服务开放。因此,我只想确保所有对后端的访问(这将是获取和放置数据的一些REST查询)都将通过有效的iPhone应用程序进行,而不是在机器上运行的脚本 我希望避免使用帐户,以便用户体验无缝 我的第一个意图是将UDID和一个秘密散列在一起,并通过HTTPS连接提供它(和UDID)。这将允许创建经过身份验证的会话或返回错误 如果被窃听,那么攻击者可以获取散列并重放它,从而使此方案可以重放攻击。然而,HTTPS连接不应该保护我

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

我希望避免使用帐户,以便用户体验无缝

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

如果被窃听,那么攻击者可以获取散列并重放它,从而使此方案可以重放攻击。然而,HTTPS连接不应该保护我免受窃听吗


谢谢

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


如果你真的想走这条路(老实说,除非你在这里做一些非常关键的任务,否则你可能是在浪费时间),你可以传递iPhone设备令牌。或者把它杂凑一下,然后传下去。当然,你没有办法在服务器端或其他任何地方验证它,但是如果一个坏人真的想干掉你,他必须首先解决一个障碍。

就像bpapa说的,它可以被欺骗,但是,就像你说的,您不必担心这一点,因为任何人都会连续向您的服务器发送一千个请求,而您的服务器必须处理每一个请求

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


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

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

我不能给出Rails的代码细节,但从架构角度来看,这是最安全的,尽管可能有点过火。SSL with certificates是一个标准的行业解决方案,iPhone/客户端和服务器端都有库,因此您不必发明任何东西或实现太多,只需让它们很好地协同工作即可


<>你也可以考虑HMAC,比如HMAC-Sa1,它基本上是其他人谈论的散列东西的标准化。如果您向其添加nonce,您也可以安全地抵御重播攻击。要了解如何使用nonce实现HMAC-SHA1,您可以查看OAuth协议(不是整个流程,而是它们如何将nonce和其他参数绑定到经过身份验证的请求中)。

这是一个极好的答案。我认为在客户端使用私钥对我来说可能有点太复杂了,但我知道这是最正式、最安全的方法。我一定会看看需要什么,谢谢!我想这可能就是我要走的路。我也没有考虑过对时间戳(或者至少是当前日期)进行散列,我喜欢它防止重播攻击的方式。如果有人在午夜前半秒提交请求,并且服务器选择第二天获取哈希的日期值,则可能会出现哈希不匹配的轻微问题,但只要我检查任意一方的日期,这应该是好的。我认为这是一个很好的选择组合。我将获得一个SSL证书,这样我就不会被窃听,并对数据使用一个包含时间和秘密的哈希。谢谢