如何在iOS / Cocoa应用程序中安全地包含密钥/签名

我想包括一个密钥到一个iOS应用程序,以便应用程序可以“certificate”某个服务器的请求来自应用程序本身而不是其他系统。 我知道,简单地将密钥硬编码到代码本身是非常脆弱的,因为任何人都可以越狱他们的手机,并将GDB附加到我的应用程序的进程来获得密钥。 有没有更安全的方法来做到这一点? 是否可以充分混淆密钥以使其几乎不可能?

我相信这是与序列号validation类似的问题。 不幸的是,这似乎是定期和容易破获。 有没有解决办法?

所有与我的服务器通信都将使用HTTPS完成,因此至less在中间的攻击中嗅探/人应该不是一个问题。

谢谢,M

恐怕这是不可能的。 但据我所知苹果将确保没有其他应用程序欺骗你的应用程序的秘密。 如果是越狱手机,那么用户将采取全面责任的方式,可能的损害应该仅限于越狱手机用户的数据。

我也一直在想这个问题,想到几个潜在的解决scheme,前提是你需要的是获得一个用户/密钥到你的应用的KeyChain(这受到iOS和硬件的powershell保护)和将其拉出以供按需使用:

  1. 使用特定于应用程序的iCloud无处不在容器将秘密分发给您的应用程序。 这些数据应该从本地计算机的备份中排除,并据称是使用硬件级别的安全性将数据安全地传输到非越狱应用程序。 亲:它不是在你的应用程序的初始分布,很难发现,iCloud需要一个非越狱设备,你可以更新你的秘密,它会同步到所有的应用程序。 con:它不是真的在安全的KeyChain中,这意味着如果iCloud同步,然后设备被越狱,它可能会在文件系统中被嗅探出来。

  2. 将这个秘密作为免费的应用程序商店托pipe的应用内购买内容提供给您的应用程序。 当应用程序交付(应用程序商店安全,只有非越狱设备)到应用程序,将其转移到钥匙串。 亲:这不是在你的应用程序在初始分配,很难发现,应用程序商店需要一个非越狱设备。 con:更难以快速更改所有安装的秘密,即使免费的应用程序商店购买可能需要用户身份validation,这是麻烦的用户体验。

一个理想的解决scheme是,如果我们可以以某种方式将秘密(一个KeyChain键/值字典)绑定到应用程序,当我们提交它分发,应用程序商店将剥离这些并将其安全地交付给操作系统注入到KeyChain期间安装,但带正常的应用程序包与您的台式机和iTunes同步,他们不会出现在二进制文件。 除了苹果增加这样一个function,我认为没有真正的固体解决scheme。

  • 2015年6月更新:在解决iOS(和OS X)钥匙串安全性中令人惊讶的糟糕问题之前(请参阅MAC OS X和iOS上的未经授权的跨应用程序资源访问 ),您无法使用钥匙串来合理安全地进行安全保护。 不要使用它。

由于攻击者将完全控制客户端,所以唯一的方法就是通过默默无闻的安全方式。 您可以实施挑战/响应模式,但是您必须使其不受其他因素(重放攻击等)的影响。

这个问题包含一个隐藏二进制密码的方法。

不要认为通过简单地使用https你不能有数据包嗅探。 如果攻击者将您的可执行文件中的URL更改为指向其服务器,该怎么办? 然后,他们可以作为一个接力。

更好的方法是在应用程序内部提供一些身份pipe理(用户select用户名,密码是用户/机器生成的),并将这些凭据用于服务调用。

我同意@Nubis,没有100%的防弹的方法来做到这一点。

但是,这个库似乎是解决这个问题的实用方法:

https://github.com/UrbanApps/UAObfuscatedString

这可能不会帮助你从一个高度积极的攻击者,但它不会让他们的生活轻松。

通常的答案是实现“握手”协议,服务器发送“挑战”,客户端必须提供有效的答案。

这比硬编码的答案启用了更多的安全性,但需要一个智能algorithm(例如避免标准散列)。

如果您在应用程序中对密钥进行硬编码,则有更多的机会破解它,所以如果应用程序每次向服务器发送请求并从服务器接收密钥,会更好。