如何安全地与服务器通信?

时间:2009-12-17 16:33:11

标签: iphone cocoa-touch security json certificate

我正在构建一个由应用和服务器组成的解决方案。服务器提供了一些方法(json),应用程序使用它们。我的目标是使其他客户端无法访问这些API方法。这样做的最佳方法是什么? 我应该查看证书(签署每个传出请求)吗?如果是,我从哪里开始,这样做会对性能产生什么影响? 有什么替代方案?

3 个答案:

答案 0 :(得分:2)

换句话说,您需要一种方法来区分有效客户的请求和无效客户的请求。这意味着客户端需要提供证明请求来自有效来源的凭据。

SSL证书是断言可以验证的身份的绝佳方式。如果证书包含由另一个已知安全的证书(根证书)创建的有效签名,则可以确认SSL证书的有效性。正如其他答案中所述,嵌入式证书无法完成工作,因为可以通过解析应用程序来破坏该证书。一旦被泄露,您就无法接受任何提出请求,锁定所有用户。

您需要为每个有效用户颁发单独的证书,而不是一个嵌入式应用证书。为此,您需要设置(或外包)证书颁发机构并向有效客户颁发单独的签名证书。其中一些证书将被用户破坏 - 要么是因为他们被黑客入侵,不小心或故意试图欺骗您的服务。您需要查看这些被盗证书,将它们放在证书撤销列表(CRL)上,并拒绝为这些受损证书提供服务。任何Web服务器都能够拒绝基于CRL的连接。

这不能解决安全问题,只是将它们移出应用程序。某人仍然可以通过社交工程或窃取您的根证书并制作新的签名证书来创建看似有效的证书。 (这些都是PKI提供商面临的问题。)

会有性能受到打击。命中多少取决于应用程序的请求数量。 iPhone NSURLConnection类提供对SSL客户端证书的支持,客户端证书可以通过电子邮件或经过身份验证的Web请求安装在手机中。管理基础架构以支持客户端证书需要付出更多努力,而不是将其编码到应用程序中。

顺便说一句,对任何你不喜欢的答案进行投票表决会给社区带来寒蝉效应。如果你打算对每个人的声誉评分进行打击,你几乎不可能得到建议 - 好的或坏的。

答案 1 :(得分:0)

我现在可以自由地承认这是一个有趣的问题,但我不知道如何做到这一点。

原始答案:

有趣的问题。假设人们无法对iPhone应用程序进行逆向工程,那么我想到的唯一解决方案就是使用公钥或仅为应用程序知道的其他秘密来签署请求。通过这种方式,我的意思是为每个API调用添加一个额外的参数,该API调用是目标URL的散列,其他参数与仅为您的服务器和应用程序知道的秘密相结合。

要对此进行扩展:假设您的API调用包含参数foobarqux。我会添加一个signature参数,其值可以简单到按名称对其他参数进行排序,将它们与值连接,添加秘密以及对该批次进行散列。然后在服务器端,我会做同样的事情(除了signature参数)并检查哈希是否与我们在请求中给出的哈希匹配。

答案 2 :(得分:0)

考虑经过身份验证的HTTP。

对于更便宜的替代方案,有共享的秘密/哈希方案。客户端和服务器具有共享的秘密文本字符串。根据请求,客户端一起散列(使用MD5,或SHA1,或其他东西 - 您选择)请求字段和密码。哈希值附加到请求 - 例如,作为另一个POST字段。

服务器对请求及其秘密副本执行相同的操作,然后比较哈希值。如果他们不匹配 - 服务被拒绝。

为了增加安全性,您可以使用RSA公钥加密哈希。客户端具有公钥,服务器保留私钥。服务器用私钥解密散列,然后相同。我用C ++ WinMobile客户端和基于PHP的服务做到了 - 就像魅力一样。但是,在iPhone上没有使用加密技术的经验。

更新:现在我想到了,如果我们假设攻击者完全控制了客户端( ahem 越狱的iPhone和调试器),那么上面提到的问题是无法解决的理论上。毕竟,攻击者可能会使用您的位来访问该服务。对可执行文件进行反向工程,找到相关函数并使用所需数据调用它们。如有必要,建立一些全球状态。或者,他们可以自动化您的UI,屏幕刮刀样式。这是悲惨的事态。