检测iPhone应用程序仅访问web服务的最佳实践?

检测iPhone应用程序仅访问web服务的最佳实践?,iphone,web-services,Iphone,Web Services,我正在与web服务一起开发一个iPhone应用程序。iPhone应用程序将使用GET或POST从web服务中检索数据,例如获取前十首歌曲的数据 iPhone应用程序没有用户帐户和密码。确保只有我的iPhone应用程序才能访问web API的最佳实践是什么?iphonesdk的uideviceuniqueueidentifier是不够的,因为任何人都可以使用wget、curl或web浏览器将设备id伪造为进行API调用的参数 不会发布web服务API。web服务的数据不是秘密的和私有的,我只是想防

我正在与web服务一起开发一个iPhone应用程序。iPhone应用程序将使用GET或POST从web服务中检索数据,例如获取前十首歌曲的数据

iPhone应用程序没有用户帐户和密码。确保只有我的iPhone应用程序才能访问web API的最佳实践是什么?iphonesdk的uideviceuniqueueidentifier是不够的,因为任何人都可以使用wget、curl或web浏览器将设备id伪造为进行API调用的参数

不会发布web服务API。web服务的数据不是秘密的和私有的,我只是想防止滥用,因为还有API将一些数据写入服务器,如使用日志。

在请求中使用某种形式的。虽然很难做到完全防篡改(安全性方面也是如此)。要做到“足够好”以防止大多数滥用并不难


当然,这在很大程度上取决于数据的敏感性,如果您的数据事务涉及数百万美元的事务,您会希望它比一些简单的使用统计日志记录更安全(如果它很难篡改,并且攻击者除了惹您生气之外几乎没有任何好处,那么可以安全地假设人们不会打扰您……)一种非常便宜的方法是让iPhone软件在查询时发送额外的数据,比如一个长密码字符串,这样就有人无法访问提要

有人可以对你所做的事情进行反向工程,或者监听通过网络发送的数据来发现密码,如果带宽限制是这样做的原因,那么简单的密码就足够了


当然,这种方法也有它的问题,基于证书的身份验证实际上是安全的,尽管它更难编码。

这里大多数(如果不是所有)解决方案的问题是,一旦在混合中添加代理,它们很容易被破坏。如果代理连接到您的Web服务,可以吗?毕竟,它可能是代表某个地方的iPhone——也许是在中国?如果代理可以模拟iPhone,那么如何确定哪些模拟是可以的?

您可以获得一个只有您知道的密钥,包括md5哈希签名中的密钥,通常您可以将签名构造为参数和值的字符串,并在末尾附加秘密,然后使用md5散列…在客户端和服务端都这样做,并匹配签名字符串,只有签名匹配,您才能获得访问权限…由于机密仅存在于签名中,因此很难进行反向工程和破解。

最安全的解决方案可能是根据请求进行数字签名。您可以在iPhone应用程序中保留一个密钥,并使用它对请求进行签名,然后在服务器端进行验证。这避免了将密钥/密码发送到服务器,这将允许某人使用网络嗅探器捕获密钥/密码

一个简单的解决方案可能只是使用HTTPS——尽管存在潜在的窃听者,但保持消息内容的安全是HTTPS的全部要点。我不确定您是否可以使用标准的NSURLConnection来执行自签名证书,但如果您有服务器端证书,至少可以防止被窃听。而且您编写的代码要少得多(实际上,没有)


我想如果您使用HTTPS作为唯一的安全性,那么您可能会对猜测URL的人开放。如果这是一个问题,那么在web服务中添加任何类型的参数验证都可以解决这个问题。

下面是对Daniel建议的扩展

有一些服务器和客户端都知道的共享秘密。说一些长的随机字符串

然后,当客户端连接时,让客户端生成另一个随机字符串,将其附加到共享字符串的末尾,然后计算MD5哈希

将随机生成的字符串和散列作为请求中的参数发送。服务器知道秘密字符串,因此它可以生成自己的哈希,并确保它与从客户端接收到的哈希匹配


它不是完全安全的,因为有人可以对你的应用程序进行反编译以确定秘密字符串,但这可能是不需要大量额外工作就可以得到的最好结果。

我在WWDC向一位苹果安全工程师询问了这一点,他说没有无懈可击的方法可以做到这一点。你能做的最好的事情就是让它变得不值得付出努力

我还问他是否可能使用推送通知作为一种方式,他认为这是一个非常好的主意。基本思想是,第一次访问将触发服务器中的推送通知,该通知将发送到用户的iPhone。由于您的应用程序是开放的,它将调用
应用程序:didReceiveMemotentification:
方法并交付您自己选择的有效负载。如果您将该有效负载设置为nonce,那么您的应用程序可以在下一个请求中发送nonce,您就完成了循环


您可以在此之后存储UDID,并放弃任何带有未验证UDID的请求。至于对必要参数的强力猜测,无论发生什么情况,您都应该实现一个速率限制算法。

具有某种密钥,该密钥根据使用当前时间(GMT)的算法每5分钟更改一次。始终允许最后两个键进入。当然,这并不完美,但它可以让目标不断移动,你可以将其与其他战略和战术结合起来


我想你只是想劝阻别人使用你的服务。显然,您没有将应用程序设置为安全的。

代理应该将所有数据发送到iPhone发送给代理的服务器,因此我看不出有问题。这有什么困难?您只需读取HTTP请求并读取参数的md5值?如果您嗅探