安全的iPhone应用程序↔服务器通信


14

在我的iOS应用与其服务器组件之间实现私人通信的最佳方法是什么?将一个不变的“秘密密钥”烘焙到应用程序源中是否足够,还是我需要以某种方式动态设置此类“握手”密钥的生成?

服务器本身无法访问任何敏感数据,因此,即使用户访问了一些专用端点,也无法将它们带到任何地方,但我只想对公众隐藏这些端点。基本上,我想忽略所有命中特定路由的请求,除非它们来自我的iOS应用。

如果重要的话,服务器组件可在RoR上运行。

Answers:


8

您不能有效地拒绝连接,除非为每个客户提供一个可以单独撤消的私钥。但这可能太过分了。如果大多数人不愿意发射子弹,则不需要防弹解决方案。

这是一个安全性问题,因此让我们描述一个威胁模型和缓解策略。

假设您命中了一个URL,这会给您带来可观的成本(例如,处理成本),并且您想保护它免受简单的DoS攻击和仿冒应用程序的攻击。

使用SSL隐藏连接以免被轻易分析。在执行请求中昂贵的部分之前,请使用一个不完整的端口号,一个重定向序列,一个cookie交换来使连接复杂化。使用应用程序中附带的一些秘密代码让服务器知道它必须接受连接。

现在,仅通过运行数据包嗅探器或查看代码中类似URL的字符串,某人就无法学习代价高昂的URL。潜在的攻击者必须反编译您的应用程序。

您不能真正保护代码不被反编译和/或在调试器下运行。攻击者最终了解了密钥和连接顺序。

您会注意到,您开始以昂贵的URL接收到大量请求:以攻击的形式,或者以必须访问您的服务才能运行的模仿应用程序的形式,或者可能是公开发布了漏洞利用代码。但是,您不能从合法请求中分辨出恶意请求。

使用其他密钥为您的应用创建免费的次要更新。它应该访问另一个昂贵的URL,该URL提供与受损的昂贵URL相同的数据。在一段时间内,使两个URL都可访问。

观看您的用户群切换到更新版本。限制受损的昂贵URL,并最终对其进行404处理。您刚刚缓解了安全漏洞,希望不会损失太多。回到原点。

免责声明:我不是安全专家。


如果用户拥有该应用程序,则即使通过SSL(客户端可以完全控制证书等),他们也可以发现代价昂贵的URL。这使得其余的论点毫无意义,更不用说这是反对通过模糊性实现安全性的经典示例。
2016年

@aleemb:绝对不能将昂贵的URL完全保密。坚定的攻击者将发现它。关键是要使这项发现也付出高昂的代价,以便“脚本小子”有更多的时间,因此没有动力去挖掘和利用它,并使缓解成为可能。如果缓解的成本相当低,并且与使用高成本的URL可以从攻击者获得的收益相比,攻击者的发现成本很高,那么攻击就变得毫无意义。同样,这不是严格的安全性。
9000

5

您有一个经典的问题,实际上是无法解决的。

为确保简单的隐私(即确保您的数据在传输过程中不会被窥探或更改),您可以通过SSL进行所有操作,并通过iPhone认可的CA为服务器提供正确颁发的证书。

但是,对于授权而言,没有一个好的解决方案可以100%保证除您的应用之外的任何人都不能访问该API。您建议的解决方案起作用,但以下情况除外:

  • 下载您的应用程序的任何人必定拥有私钥
  • 如果他们设法以某种方式解压缩您的应用程序并对其进行反编译,则他们将拥有纯文本格式的私钥
  • 一旦拥有纯文本私钥,他们就可以使用它来签署自己的恶意请求。

这是不可能的。这并不是说您不能采用这种方法,而是要了解它并非万无一失。正是这个问题使DRM完全无效


0

这就是TLS和SSL的目的。任何一种都可以创建安全的连接,而无需固定的密钥。阅读链接页面上的“描述”部分,以了解他们如何执行此操作。

无需执行大量(任何)工作即可获得TLS / SSL好处的有效方法是让您的服务器实现客户端使用HTTPS协议访问的Web服务。HTTPS只是通过安全连接进行的HTTP,iOS中的URL加载系统会为您实现它。


尽管HTTPS确实使通信不被窃听,但它不会阻止随机客户端连接到端点,除非服务器需要客户端证书。可以将其“烘焙”到应用程序中,并需要一些知识来提取。
9000
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.