我如何encryptioniPhone上的CoreData内容

我有一些信息想在iPhone应用程序上进行静态encryption。 我是iPhone新手,我对CoreData并不熟悉,也不太熟悉它。 我有数据作为JSON,但我可以很容易地把它放到一个SQLITE3数据库或任何其他后盾数据格式。 我会采取任何最简单的(a)encryption和(b)与iPhone视图层整合。

每次启动应用程序时,用户都需要input密码才能解密数据。 encryption的目的是在用户丢失电话时保持数据不被访问。

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

注意:这与问题929744 一样,其目的是防止用户弄乱或看到数据。 数据在使用时应该是完全透明的。

另外请注意:我愿意使用SQLCipher来存储数据,但更愿意使用已经存在于iPhone / CoreData框架上的东西,而不是经历冗长的构build/整合过程。

您可以通过使它们可转换的属性encryption您的核心数据模型实体中的单个属性,然后创build一个NSValueTransformer子类,它将encryption和解密该属性的数据。 虽然这不是您要查找的整个数据库解密,但是与将整个数据库解密到内存中相比,它将占用更less的内存空间。 此外,它将允许解密是​​懒惰地完成,而不是所有的前期,所以你的应用程序将加载得更快。 根据所使用的encryption方式,我甚至会期望加载每个实体的磁盘数据访问速度比属性的解密过程要慢,所以在访问属性时你不会看到太多的性能损失。

像这样的可转换属性非常易于使用,因为您可以像往常一样读取和写入,而encryption/解密则在幕后进行。

你需要encryption吗? 较新的iPhone(3G,4,iPad …)encryption设备上的所有数据。 在您的应用程序中使用单一的哈希密码,任何人都无法在没有密码的情况下获取数据。 数据是从所有其他应用程序沙盒。

iOS上的数据保护

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

  • CustomAtomicStoreSubclassCustomAtomicStoreSubclassCacheNode类的源代码复制到我的项目中并重命名它们
  • 将密钥和初始向量存储在Keychain中
  • 使用Mac OS X捆绑的OpenSSL库
  • encryptionNSKeyedArchiver输出并将密文写入光盘(解密是相反的)

我拦截了readFilemetadataForPersistentStoreWithURL:error:setMetadata:forPersistentStoreWithURL:error:中的后备存储读写,并在CustomAtomicStoreSubclass save:方法。

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

我知道这是一个古老的问题,但它仍然是相关的,我最近不得不自己解决这个问题。

可转换的属性是一个潜在的解决scheme,但似乎并不适用于NSPredicates,这是一个很大的缺点。 我没有追求CustomAtomicStoreSubclass方法,但是好奇其他人是否已经成功了。

我的担心与原来的海报类似,最终我做了以下几件事:

  1. 将商店解密为临时文件
  2. 正常加载解密的存储
  3. 将商店迁移到内存中
  4. 删除未encryption的商店

就我而言,我的商店是只读的,但是可以扩展到将商店写回,encryption并再次删除未encryption的商店。 如果您有一个大型商店,并且/或者不关心在您的应用程序运行期间是否有未encryption的文件,您总是可以跳过#3。

我正在使用的核心数据文件是〜1MB,可以很快地encryption/解密。

我目前使用https://github.com/project-imas/encrypted-core-dataencryption我的coredata存储。; 这是一个NSIncrementalStore的自定义实现基本上是一个社区替代苹果自己的持久性存储,有一个encryption选项。 这是一个有效的解决scheme。 你也可以拿出sqlite文件,并用你在许多不同客户端select的密码解密。

该实现不具有100%的覆盖率,并且不允许某些function,如子查询谓词。 我要把我的第一个公关提交给回购,希望尽快改变;-)。 我几乎完成了一个非常复杂的 coredata应用程序的工作。 它还具有额外的好处,即允许您直接访问SQLite,而无需担心苹果的实施情况发生变化,因为您可以完全访问源代码。

“encryption的目的是在用户丢失手机时保持数据不被访问。”

iOS从iOS 4开始就拥有数据保护function ,并且Core Data已经支持了很长时间。 数据保护专为您感兴趣的场景而devise。默认情况下,对于使用iOS 5 API或更高版本构build的应用程序,Core Data NSSQLiteStoreType文件具有NSFileProtectionCompleteUntilFirstUserAuthentication 。 保护用户数据的WWDC 2012会话更详细地介绍了这个主题,并build议使用NSFileProtectionComplete 。 您可以通过在用于打开Core Data NSSQLiteStoreType存储的选项字典中传递该值来在Core Data中使用此选项。

例:

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

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

我如何encryption或解密数据?

“证书,密钥和信任服务API提供用于生成对称和非对称encryption密钥,创build和validation数字签名以及encryption密钥和随机数的function,CommonCrypto库用于对称encryption,哈希和HMAC操作。 ,密钥和信任服务参考和CC_crypto(3cc)手册页以获取更多信息。

你可以使用Trasformables,我确认,你不能使用谓词,但是(更糟的是)你甚至不能使用

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

如果你使用谓词

它工作正常,如果你encryption你的数据使用:

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

到隐藏数据。 (例如在模拟器上……稍后在项目包上移动..)

无论您的数据是什么格式,encryption都是encryption的,您当然不需要担心“与视图集成在一起”。 在你尝试读取任何有意义的东西之前,你所要做的就是解密它。