2010-10-25 57 views
21

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

我相信这是序列号验证的类似问题。不幸的是,这似乎经常被轻易破解。有没有解决这个问题的方法?

我的服务器的所有通信将与HTTPS进行,以便至少在中间人攻击嗅探/人不应该是一个问题。

感谢,男

回答

5

恐怕不可能这样做。但据我所知苹果将确保没有其他应用程序欺骗你的应用程序的秘密。如果这是一部越狱手机,则用户需要全权负责,并且可能的损害应该仅限于越狱手机用户的数据。

+4

+1因为“有*无法确保这样的事情。”如果你把“秘密”放到应用程序中,那么这不是什么秘密。这就像一只狗覆盖骨头。有一点挖掘会发现它......特别是在草看起来很有趣的地方。 – 2011-10-04 15:59:26

+0

对不起,我的意思是'架构'而不是'秘密',小的lapsus。显然OP了解反正:) – Nubis 2011-10-04 16:05:11

0

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

借此与硬编码的答案了更多的安全性,但需要一种智能算法(避免标准哈希值的实例)。

3

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

This question包含一个方法来隐藏二进制代码的密钥。

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

一个更好的办法是提供应用程序内部的一些身份管理(用户选择一个用户名,密码是用户/计算机生成的),并使用你的服务调用这些凭据。

18

我也一直在想这个,并且想到几个潜在的解决方案,前提是你需要的是获得一个用户/密钥到你的应用程序的KeyChain(这是iOS和硬件),并根据需要使用它:

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

  2. 传递秘密到您的应用程序作为一件免费的应用程序商店托管应用程序内购买的内容。当它被应用程序交付(由应用程序商店安全,仅适用于非越狱设备)时,将其转移到钥匙串中。亲:它不是在你的应用程序在初始发行,很难发现,应用程序商店需要一个非越狱设备。 con:更难以快速更改所有安装的秘密,即使免费的应用程序商店购买也可能需要用户身份验证,这是麻烦的用户体验。

一个理想的解决方案是,如果我们能以某种方式捆绑秘密(钥匙扣键/值字典)直接进入时,我们将其提交分发应用程序,应用程序商店会剥夺这些和安全地提供他们的操作系统在安装期间注入KeyChain,但是与您的桌面计算机和iTunes同步的正常应用程序包带外,并且它们不会出现在二进制文件中。除了苹果增加这样一个功能,我认为没有真正的固定解决方案。

+0

这是非常有益的,natbro! iOS 7有更新吗? – AlexR 2013-11-21 15:02:03

+1

我还没有发现任何额外的途径,只是在iOS7中做到这一点(但还没有深入)。由于iCloud的不稳定性,我确实发现使用iCloud分发这类数据在首次运行时可能会非常尴尬。一旦你获得了价值,这是一个很好的解决方案,但你不能确定它将会到达设备的时间。真的希望苹果会添加一些东西来支持这一点。 – natbro 2013-12-01 20:38:54

+0

将私钥存储到iCloud容器的方法是什么? – 2015-02-10 12:13:21

-2

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

+3

'client_secret'用于向服务器认证客户端。那么,如何阻止恶意客户向服务器请求密钥? – ma11hew28 2014-02-19 13:59:43

3

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

然而,这个库似乎是一个务实的解决问题的办法:

https://github.com/UrbanApps/UAObfuscatedString

它可能不会救你从一个很高的积极性攻击, 但它不会使他们的生活更轻松。