2012-05-10 90 views
5

在我的iOS4 +应用程序中,我在多个地方使用AES加密,整个应用程序必须非常安全。为了做到这一点,我必须硬编码在这个应用程序中的几个键,然后随机选择当我需要加密的东西...在iOS中保存加密密钥的安全方式

我的问题是如何存储这些私钥?使用NSString对它们进行硬编码是否安全?或者

#define SecretKeyString @"febd9a24d8b65c1c787d50a4ed3619a9" 

如果用户越狱iPhone安装了这个应用程序,他不能得到那些硬编码的密钥?我怎样才能最有效地隐藏它们?

感谢您的任何建议...

回答

4

别人怎么做的应用程序是需要用户“登录”,他们可以使用该应用程序之前。然后,您使用其用户ID /密码作为密钥来加密密钥或使用安全的Web服务获取该用户的密钥。

如果您使用#define甚至是NSString,则可以使用猜测密钥的方法。很显然,你必须真正愿意花费大量时间在编译代码中找到这些密钥,但根据你所寻找的安全级别以及你所反对的人,这可能是一个问题。

+0

以及我不能使用登录关键信息,将是巨大的,虽然:)我需要有几个静态密钥,这将是硬编码。 ..但这可能是一个很好的解决方案 - 如果生病有5个密钥,其中4个将被加密,我将不得不用第一个密钥对它们进行解密,只有这样它们才会成为有效的密钥......没有人即使在编译后的代码中找到这些密钥,也能找到真正的密钥......谢谢!:) –

+2

如果你真的对你的硬编码密钥是否可以读取有偏见,其中一个选项也是存储你的转换密钥。然后有一种方法将存储的密钥转换回真正的密钥。例如,一个简单的转换就是反向字符串。因此,如果您的密钥是ABC,那么您每次使用密钥时都需要对CBA进行硬编码并调用反向方法。当然,在真正的应用程序中,你会想要一些比仅仅反转更复杂的东西。只是一个额外的想法... – mprivat

+0

确切...这样的事情听起来很真实...我没有偏执狂,我不认为它是一个巨大的问题,但我必须在工作中做它,他们是偏执狂:)再次感谢! –

2

我推荐阅读一些关于安全性的文章,这些文章基本上就是你试图达到的目标(至少这就是所有的推荐意见)并且最终并不安全。

但是,iOS的沙盒是您的第一个也是最有效的安全形式。

其次,输入验证将是您应用程序需要的下一个最重要的安全功能。如果不验证所有输入(从用户输入的信息到网络对通过方案启动应用程序的响应),那么全部加密意味着什么都没有意义。最后,如果你不硬核(或者混淆你的硬编码),安全加密只在必要时才是安全的。 mprivat是正确的,您需要使用用户生成的数据(登录),公共密钥加密(因此只有未包含的私钥可以解密)或使用SSL进行传输的服务器端加密。

我还会说,如果您的安全数据只能在使用Keychain API的设备上进行维护,并且特别要确保您使用的表单需要用户登录才能进行项目检索。

如果您在设备上同时在设备和其他设备(如服务器)上解密的设备上有数据,则说明存在基本的体系结构缺陷。加解密只有客户端 - 客户端(也就是用户的设备)或客户端 - 服务器(可以是服务器的用户设备或用户设备的服务器)是非常重要的。将这两个结果混合在一起发现漏洞。我在这里特别指的是相同的加密机制,对客户端客户端和客户端服务器使用单独加密是很好的(有时也是必需的)。

这里有一个必须阅读那些谁需要编写安全代码:http://www.amazon.com/gp/aw/d/0735617228