如何在iPhone上加密CoreData内容

时间:2009-10-29 16:39:17

标签: iphone encryption core-data

我有一些信息,我想在iPhone应用程序上静态加密。我是iPhone开发的新手,有些我对CoreData以及它与视图的集成方式并不十分熟悉。我将数据作为JSON,但我可以轻松地将其放入SQLITE3数据库或任何其他支持数据格式。我将采取最简单的方法(a)加密,(b)与iPhone视图层集成。

每次启动应用程序时,用户都需要输入密码来解密数据。加密的目的是在用户丢失电话时防止数据被访问。

出于速度原因,我宁愿一次加密和解密整个文件,而不是加密数据库每一行中的每个字段。

注意:此与<{3}}的想法不同,其目的是防止用户弄乱或看到数据。使用时数据应完全透明。

另请注意:我愿意使用Question 929744来存储数据,但更愿意使用iPhone / CoreData框架上已有的东西,而不是经历所涉及的冗长的构建/集成过程。 / p>

9 个答案:

答案 0 :(得分:72)

您可以通过创建transformable properties来加密Core Data模型实体中的各个属性,然后创建一个NSValueTransformer子类,它将加密和解密该属性的数据。虽然这不是您正在寻找的全数据库解密,但它将比将整个数据库解密到内存中的内存占用更少。此外,它将允许懒惰地进行解密,而不是预先完成,因此您的应用程序将加载更快。根据所使用的加密,我甚至希望用于加载每个实体的磁盘上数据访问速度比属性的解密过程慢,因此在访问属性时,您不会看到太多的性能损失。 / p>

像这样的可变形属性非常容易使用,因为你正常地读取和写入它们,而加密/解密在幕后进行。

答案 1 :(得分:8)

你需要加密吗? 较新的iPhone(3Gs,4,iPad ......)加密设备上的所有数据。使用您的应用程序上的单个,哈希,盐渍密码,没有密码,任何人都无法访问数据。数据来自所有其他应用程序的沙箱。

Data Protection on iOS

答案 2 :(得分:4)

我成功地调整了Apple的CustomAtomicStoreSubclass示例代码,以便在Mac桌面应用程序中使用,从而将加密的NSBinaryStore样式持久存储写入文件系统中的单个文件。我的方法:

  • 复制CustomAtomicStoreSubclass&amp;将CustomAtomicStoreSubclassCacheNode类源代码放入我的项目并重命名
  • 将密钥和初始向量存储在Keychain
  • 使用与Mac OS X捆绑在一起的OpenSSL库
  • 加密NSKeyedArchiver输出并将密文写入光盘(解密是相反的)

我截获了支持商店读取&amp;写入readFile中的metadataForPersistentStoreWithURL:error:setMetadata:forPersistentStoreWithURL:error:save:CustomAtomicStoreSubclass方法。

iPhone的NSAtomicStore类参考的子类注释类似于Mac OS X的类。也许这种方法也适用于iPhone。

答案 3 :(得分:4)

我知道这是一个老问题,但它仍然非常重要,我最近不得不自己解决这个问题。

可转换属性是一种潜在的解决方案,但似乎不适用于NSPredicates,这是一个很大的缺点。我没有采用CustomAtomicStoreSubclass方法,但我很好奇其他人是否取得了成功。

我的担忧与原始海报类似,我最终做了以下事情:

  1. 将商店解密为临时文件
  2. 正常加载解密的商店
  3. 将商店迁移到内存商店
  4. 删除未加密的商店
  5. 就我而言,我的商店是只读的,但这可以扩展为将商店退回,加密并再次删除未加密的商店。如果您有一个大型商店和/或不关心在您的应用运行时有未加密的文件,您也可以跳过#3。

    我使用的核心数据文件大约是1MB,可以很快加密/解密。

答案 4 :(得分:4)

我目前正在使用https://github.com/project-imas/encrypted-core-data来加密我的coredata商店。它是NSIncrementalStore的自定义实现,基本上是苹果自己的持久存储的社区替代品,具有加密选项。这是一个有效的插入式解决方案。您也可以将sqlite文件取出并使用您在许多不同客户端中选择的密码对其进行解密。

实现没有100%的覆盖率,并且不允许某些功能,例如子查询谓词。我将把我的第一个PR提交给回购,希望很快改变;-)。我几乎完全使用非常复杂的 coredata应用程序。它还有一个额外的好处,即允许您直接访问SQLite,而不必担心苹果的实现会改变您,因为您可以完全访问源。

答案 5 :(得分:3)

&#34;加密的目的是在用户丢失电话时防止数据被访问。&#34;

从iOS 4开始iOS已经有Data Protection,而Core Data已经支持了很长时间。数据保护专为您感兴趣的各种场景而设计。默认情况下,Core Data NSSQLiteStoreType文件具有NSFileProtectionCompleteUntilFirstUserAuthentication,适用于使用iOS 5 API或更高版本构建的应用程序。 WWDC 2012会话Protecting the User's Data更详细地介绍了此主题,并建议使用NSFileProtectionComplete。您可以通过在用于打开Core Data NSSQLiteStoreType商店的选项字典中传递该值,将其与Core Data一起使用。

示例:

NSDictionary *storeOptions = @{ NSPersistentStoreFileProtectionKey : NSFileProtectionComplete };
if (![coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:[self storeURL] options:storeOptions error:&error]){

iOS Device Security

中涵盖了更广泛的设备安全主题

答案 6 :(得分:0)

How do I encrypt or decrypt data?

“证书,密钥和信任服务API提供生成对称和非对称加密密钥,创建和验证数字签名以及加密密钥和随机数的功能.CommonCrypto库用于对称加密,散列和HMAC操作。有关详细信息,请参阅Certificate, Key, and Trust Services ReferenceCC_crypto(3cc)手册页。“

答案 7 :(得分:0)

你可以使用Trasformables,我确认,你不能将它们与谓词一起使用,但是(而且更糟糕的是)你甚至无法使用

... = [self primitiveValueForKey:@“crypted_data”];

如果您使用谓词..

如果你使用以下方法来保存数据,它可以正常工作:

[self setPrimitiveValue:cryptedPsw forKey:@"crypted_data"];

加密数据。 (例如在模拟器上....稍后再移动项目包..)

答案 8 :(得分:-3)

加密是加密的,无论您的数据采用何种格式,您当然不必担心“与视图集成”的方式。在尝试阅读任何有意义的内容之前,您所要做的就是解密它。