我正在处理一个有敏感信息的应用程序。我知道外行人很难入侵iPhone获取信息。如果我直接使用SQLite,我会使用一种名为SQLite Cipher来加密/编码数据库。
无论如何,我可以采用相同的方式加密coredata,这样黑客就很难进入数据。
有人可以对此有所了解吗?
先谢谢
答案 0 :(得分:18)
现在,iPhone 3GS和更高版本的设备(包括iPad)上的核心数据默认加密(硬件加密)。这意味着使用硬件密钥自动加密数据。在iOS 4或更高版本中,通过following the steps at Nick Harris' more detailed blog entry,可以启用第二层加密(称为“数据保护”),它还使用用户密码加密硬件密钥。
所有这些都取决于users setting a secure passcode and enabling data protection in iOS 4。如果您是注册苹果开发人员,则在输入开发人员ID和密码后,您还可以watch the WWDC 2010 video on "Securing Application Data" in iTunes at this link和look at the PDF of the slides here获取有关文件加密的更多详细信息。
要启用数据保护,请在- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
调用中,使用下面的键和值更改.sqlite文件的文件属性。有关更详细的代码,请参阅Nick Harris的博客,包括如何检查iOS 4或更高版本是否处于活动状态。
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"MyAppName.sqlite"];
NSString *storePath = [storeURL path];
NSDictionary *fileAttributes = [NSDictionary dictionaryWithObject:NSFileProtectionComplete forKey:NSFileProtectionKey];
[[NSFileManager defaultManager] setAttributes:fileAttributes ofItemAtPath:storePath error:&error]
答案 1 :(得分:4)
核心数据编程指南明确指出SQL存储类型比XML或二进制文件更安全,但本质上不安全 - 它建议使用加密磁盘映像。不幸的是,这在iPhone上管理起来有点困难。
如果这是您真正关心的问题,您可以考虑建立自己的持久存储类型 - 指南在创建您自己的原子存储时有section,并引用您{{3文件。构建一个商店,在启动时从用户提示中获取一些密钥,然后使用该密钥初始化以进行加密和解密。 (请注意,如果采用此路由,Atomic Store Programming Topics类引用表明Core Data中不支持直接子类化NSPersistentStore - 您应该改为继承NSAtomicStore。)
答案 2 :(得分:2)
如果有人使用的是监狱破损的iphone,那么你无能为力。您可以连接用于加密和解密的功能以获取使用的密钥/ iv。您还可以执行令人讨厌的事情,例如完全转储闪存,键盘缓冲区和其他“调试”信息。
为了使事情变得更加困难,您可以限制秘密存储在设备上的时间。将密钥存储在远程系统上并通过ssl传输,在不需要时删除它们。这可以防止有人窃取iPhone,监禁它,然后转储数据库。我不确定这是否是一种威胁您特定应用的攻击。
对于一个“外行人”(无法阅读的人?)然后你没有太多担心。 Apple已采取保护措施,以防止已安装的应用程序无法读取/写入彼此的资源。
答案 3 :(得分:2)
您可以为实体添加类别,该类别会覆盖对持久性存储的读取和写入值。然后,您可以挂钩CommonCrypto
例程,以便在应用程序存储和检索这些值时对这些值进行私钥和公钥加密和解密。