在我的iOS4 +应用程序中,我在几个地方使用AES加密,整个应用程序必须非常安全。为了做到这一点,我必须在这个应用程序中硬编码几个键,然后在我需要加密时随机选择......
我的问题是如何存储这些私钥?使用NSString
对它们进行硬编码是否安全?或
#define SecretKeyString @"febd9a24d8b65c1c787d50a4ed3619a9"
如果用户越狱iPhone安装了这个应用程序,他不能得到那些硬编码的密钥吗?我怎样才能最有效地隐藏它们?
感谢任何建议......
答案 0 :(得分:5)
其他应用程序所做的是要求用户在使用该应用程序之前“登录”。然后使用他们的用户ID /密码作为密钥来加密密钥或使用安全的Web服务来获取该用户的密钥。
如果您使用#define
甚至NSString,可以通过各种方式猜测密钥。显然,您必须真正愿意花费大量时间在已编译的代码中找到这些密钥,但是根据您正在寻找的安全级别以及您要防范的人员,这可能是一个问题。
答案 1 :(得分:2)
我建议通过混淆阅读一些关于安全性的文章,这实际上是你想要实现的目标(至少是所有建议所说的)并且最终不安全。
但是,iOS的沙盒是您第一个也是最有效的安全形式。
其次,输入验证将是您的应用所需的下一个最重要的安全功能。如果您没有验证所有输入(从用户输入的信息,到通过方案启动应用程序的网络响应),全部加密意味着什么。
最后,只有在您没有硬核(或模糊硬编码)的情况下,安全加密才是必要的。 mprivat是正确的,您需要使用用户生成的数据(登录),公钥加密(因此只有未包含的私钥可以解密)或使用SSL进行传输的服务器端加密。
我还要说,如果您的安全数据仅在您使用钥匙串API的设备上进行维护,尤其要确保您使用要求用户登录以进行项目检索的表单。
如果您在设备上和其他设备(如服务器)上解密的设备上加密数据,则存在基本的架构缺陷。加密 - 解密只是客户端 - 客户端(也就是用户的设备)或客户端 - 服务器(可以是服务器的用户设备或用户设备的服务器)是非常重要的。将两者混合会导致漏洞。我在这里特别指的是相同的加密机制,对客户端 - 客户端与客户端 - 服务器使用单独的加密很好(有时是必要的)。
对于那些需要编写安全代码的人来说,必须阅读:http://www.amazon.com/gp/aw/d/0735617228