iOS:在我的代码中对AES密钥进行硬编码是否安全?

时间:2013-03-04 05:04:28

标签: iphone ios encryption aes

我有一个项目需要通过AES加密一些数据。但是,我在我的项目中硬编码AES键如下:

NSString *passwd = @"someStringAsKey";
NSData *encryptedData = [Encrypter encrypteData:unencryptedData];

如果有人想破解我的二进制文件以找到我硬编码的AES密钥,那么它会变得容易吗?如果是,存储AES密钥的更好方法是什么?

修改 密钥用于加密和解密大量数据,app从服务器下载数据,然后应用程序对其进行加密并将加密数据保存在磁盘上。 此密钥用于每个设备,这意味着只要每次应用程序运行,每个设备都可以拥有自己的密钥,它知道如何生成密钥。

EDIT2: 数据下载过程受这种方式保护:客户端每次登录时都会生成一个随机的私钥/公钥对。它将公钥发送到服务器,服务器使用公钥加密AES密钥,然后将加密的AES密钥发送到客户端。客户端解密AES密钥并将其放入内存。然后客户端和服务器传输由该AES密钥加密的数据。

我的目标是保护磁盘上的数据不被黑客解密。我假设黑客可以获得的是我的二进制映像和磁盘上的数据。黑客也可以在自己的设备上运行我的应用程序并分析内存。

我不需要保护这种攻击:黑客非常聪明,他写了一个病毒运行在越狱设备上,病毒可以分析我的应用程序的运行内存,以搜索内存中的一些密钥。所以我们不需要担心网络传输的安全性。

3 个答案:

答案 0 :(得分:5)

是的,它很可能很容易找到。事实上,不可能以完全安全的方式在本地存储密钥。您可以希望做的最好的事情是混淆,并使潜在的攻击者不值得努力。例如,将密码存储在带有一堆垃圾字母的文件中,并在内存中挑选出正确的密码。说密码是“密码”:

efgwhi的 P buobgweu A egiwhip 取值 IPH的取值 hipwgie的瓦特马力< b> o neifgwnp r ipndpa d (我没有做过任何广泛的研究,但我认为 Blowfish 使用类似的内存缓冲区上的技术)

您可以将这样的大字符串存储为您想要的任何编码(一个模糊的编码可以更好地工作),然后只需选择您想要的位。我能看到的唯一问题是你必须将它存储在内存中,如果它存在于内存中,那么据我所知,确定的个人可以通过GDB或LLDB获取它。为了使这更加烦人,请避免将密码作为NSString存储在内存中(尽量留在NSData)。但它必须非常值得。最后,不幸的是,您的数据在iOS设备上永远不会安全。

最佳方案是此文件位于服务器上。您下载文件,对其进行操作,将密码存储在钥匙串中,然后删除该文件。从那时起,只需使用钥匙串值。

您知道,我不是安全专家,这只是我想到的第一个想法。

编辑我假设你有预先加密的数据。如果您的应用程序正在加密来自服务器的数据,那么是什么阻止攻击者只是从服务器下载数据?好吧,假设你有一些适当的系统,你可以像其他一些答案那样生成一个密钥,然后将它以混淆的形式存储在钥匙串中。这样即使攻击者掌握了它,他们也不会知道该怎么办。

答案 1 :(得分:1)

作为一个字符串存在,并且没有任何其他保护,在你的二进制文件中找到密钥将是 trivial 。所有人都需要一个符号调试器,和/或一个关于键应该是什么样子(它应该有多大,以及有效值范围)的体面想法。

iOS显然内置了一些安全性内容,您可以将敏感数据存储在恶意应用程序范围之外。问题是,它的很大一部分似乎假设设备按预期运行。在越狱设备上运行的代码可能仍然可以获得大部分(如果不是全部)数据。

答案 2 :(得分:1)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

启动应用程序时只调用此方法一次创建随机密钥:

-(NSString) generateKey{
       char data[NUMBER_OF_CHARS];
        for (int x=0;x<NUMBER_OF_CHARS;data[x++] = (char)('A' + (arc4random_uniform(26))));
        return [[NSString alloc] initWithBytes:data length:NUMBER_OF_CHARS encoding:NSUTF8StringEncoding];
}