有些开发者不太喜欢把数据保存到Keychain中,因为实现起来不那么直观。不过,把信息保存到Keychain中可能是非越狱设备上最安全的一种保存数据的方式了。而在越狱设备上,没有任何事情是安全的。这篇文章展 示了使用一个简单的wrapper类,把数据保存到keychain是多么的简单。使用这个wrapper来保存数据到keychain就像把数据保存到 NSUserDefaults那么简单。下面就是一段把字符串保存到keychain的代码。请注意和使用NSUserDefaults的语法非常类似。
PDKeychainBindings *bindings =[PDKeychainBindings sharedKeychainBindings];
[bindings setObject:@"XYZ"forKey:@"authToken"];
下面是一段从keychain中取数据的代码。
PDKeychainBindings *bindings =[PDKeychainBindings sharedKeychainBindings];
NSLog(@"Auth token is %@",[bindings objectForKey:@"authToken"]]);
正如之前讨论过的那样,没有任何信息在越狱设备上是安全的。攻击者能够拿到Plist文件,导出整个keychain,替换方法实现,并且攻击者能做他想做的任何事情。不过开发者能够使用一些小技巧来使得脚本小子从应用获得信息变得更难。比如把文件加密放到本地设备上。这里这篇文章详细的讨论了这一点。或者你可以使得攻击者更难理解你的信息。比如考虑要把某个用户的认证令牌(authentication token)保存到keychain当中,脚本小子可能就会导出keychain中的这个数据,然后试图劫持用户的会话。我们只需再把这个认证令牌字符串反转一下(reverse),然后再保存到keychain中,那么攻击者就不太可能会知道认证令牌是反转保存的。当然,攻击者可以追踪你的应用的每一个调用,然后理解到这一点,但是,一个如此简单的技术就能够让脚本小子猜足够的时间,以至于他们会开始寻找其它应用的漏洞。另一个简单技巧就是在每个真正的值保存之前都追加一个常量字符串。
在接下来的文章里,我们将讨论使用GDB进行运行时分析。