如何测试 Core Data SQLite 文件是不是已加密?

Posted

技术标签:

【中文标题】如何测试 Core Data SQLite 文件是不是已加密?【英文标题】:How to test if Core Data SQLlite file is encrypted?如何测试 Core Data SQLite 文件是否已加密? 【发布时间】:2016-04-05 15:00:06 【问题描述】:

Core Data 似乎在设备锁定时默认加密,但仅在第一次解锁之前。

来自apple docs

对于为 ios 5.0 或更高版本构建的应用,持久性存储现在存储数据 默认情况下以加密格式存储在磁盘上。默认保护 级别阻止对数据的访问,直到用户解锁 第一次使用设备。

因此,我将其设置为在设备锁定时进行加密。 SQLite 文件的加密设置是在返回 _persistentStoreCoordinator 之前设置的,如下所示:

NSDictionary *fileAttributes = [NSDictionary dictionaryWithObject:NSFileProtectionComplete forKey:NSFileProtectionKey];

    if (![[NSFileManager defaultManager] setAttributes:fileAttributes ofItemAtPath:storeURL.path error:&error]) 
        //Handle error
    
return _persistentStoreCoordinator;

代码来自here。

我想测试一下文件是否真的被加密了。

我所做的是锁定设备并使用 Xcode->Window->Devices 下载应用程序容器。但是该文件未显示在容器中。如果我在设备解锁时做同样的事情,我可以在容器中找到它。这是为什么?更重要的是,我可以测试一下当手机被锁定或丢失时文件是否被加密就足够了。


编辑:根据answer 建议,为 Core Data 设置更好的加密是:

NSDictionary *storeOptions = @NSPersistentStoreFileProtectionKey: NSFileProtectionComplete;
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:storeOptions error:&error])
    //handle error

【问题讨论】:

【参考方案1】:

我所做的是锁定设备并使用 Xcode->窗口->设备。但是该文件未显示在 容器。如果我在设备解锁时做同样的事情,那么我可以 在容器中找到它。

据我了解,这就是 Apple 加密的工作原理。当您的设备被锁定时,您不会在设备容器中看到加密文件,而当它打开时您会看到它们。

【讨论】:

以上是关于如何测试 Core Data SQLite 文件是不是已加密?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SQLite 文件预加载 Core Data,该文件引用使用“外部存储”保存的图像?

如何 VACUUM 一个 Core Data SQLite 数据库?

使用 Core Data 和 SQLite 存储文件的联系人或地址簿应用程序

如何在不丢失数据的情况下更改 Core Data SQLite 数据库的结构

SQLCipher、encrypted-core-data 和 iOS - 两个 .sqlite 文件正常吗?

在应用程序运行时切换 Core Data sqlite 文件?数据不显示