8

我有一个项目需要用 AES 加密一些数据。但是,我在我的项目中硬编码 AES 密钥,如下所示:

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

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

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

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

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

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

4

3 回答 3

5

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

efgwhi p buobgweu a egiwhip s iph s hipwgie w hp o neifgwnp r ipndpa d(我没有做任何广泛的研究,但我认为Blowfish在内存缓冲区上使用了类似的技术)

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

最好的情况是该文件位于服务器上。您下载文件,对它施展魔法,将密码存储在钥匙串中,然后删除文件。从那时起,只需使用钥匙串值。

请注意,我不是安全专家,这只是我想到的第一个想法。

编辑我在假设您有预加密数据的情况下工作。如果您的应用程序正在加密来自服务器的数据,那么是什么阻止攻击者简单地从服务器下载数据?好吧,假设您为此设置了一些系统,则可以像其他一些答案所说的那样生成一个密钥,然后将其以混淆的形式存储在钥匙串中。这样即使攻击者得到它,他们也不会知道如何处理它。

于 2013-03-04T05:36:41.007 回答
2

作为字符串卡在那里,并且没有任何其他保护,在二进制文件中找到密钥将是微不足道的。某人所需要的只是一个符号调试器,和/或大致了解密钥应该是什么样子的一个体面的想法(它应该有多大,以及有效值的范围)。

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

于 2013-03-04T05:37:11.387 回答
1
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

This method is called only once when launching the application So create your random key:

-(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];
}
于 2013-03-04T05:42:36.857 回答