如何保护核心数据iPhone应用程序中的sqlite数据库?

时间:2010-05-18 15:29:32

标签: iphone sqlite core-data iphone-security

我有一个基于Core Data的iPhone应用程序,带有预先填充的只读数据库。我可以对我的数据库应用什么保护(如果有的话)以减少盗版/数据库从被囚禁的iPhone中读取的可能性?

使用预先填充的sqlite数据库的大多数代码示例都显示数据库正在从应用程序包中复制到iPhone上的应用程序文档目录中,这在被囚禁的iPhone上完全可见。相反,我考虑直接从应用程序包中使用数据库,如下所示:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (persistentStoreCoordinator != nil) {
        return persistentStoreCoordinator;
    }

    NSURL *storeUrl = [NSURL fileURLWithPath: 
        [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:
             @"MyDatabaseName.sqlite"]];

    <... followed by standard persistentStoreCoordinator code ...>

当我在商店网址上放置一个断点时,这会返回另一个文件位置,我猜这个文件位置就像一个被囚禁的iPhone中的文档目录一样可见:

<CFURL 0x139610 [0x38388ff4]>{type = 15, string = file://localhost/var/mobile/Applications/6ACD76F0-396D-4DB1-A46B-B2459A084063/MyiPhoneApp.app/MyDatabaseName.sqlite, base = (null)}

有人可以确认以上是否正确和/或是否有其他方法可以解决此问题(我不打算加密或类似的东西......希望快速保护解决方案)?欣赏坚定的黑客会得到他们想要的东西 - 如果可以的话,我想至少提出一些阻力。

由于

2 个答案:

答案 0 :(得分:9)

首先,是的,您可以在应用包中存储只读数据库,并直接从那里访问它。

其次,保护数据的唯一方法是将其加密到磁盘上并在内存中加密。使用当前形式的Core Data无法轻松完成此操作。您可以做的是加密数据库的某些列并仅在内存中解密它们。这是通过将列存储为二进制数据来实现的,但这也意味着您无法对这些列进行任何搜索。

更新

甚至试图避开越狱手机(这并非100%保证此人是犯罪分子。请记住,开发人员经常以诚实的理由越狱手机)。不会保护您的数据。数据位于台式计算机上的zip文件内,无需运行或触摸CocoaTouch设备即可访问。

如果数据是私有的,那么您需要将其放在Web服务上,而不是将其存储在设备上。设备(或任何设备)上的任何都是可访问的,并且可以进行逆向工程。

答案 1 :(得分:2)

你可以试试这个: https://github.com/calebmdavenport/encrypted-core-data 它看起来很早,但如果你有一个简单的数据模型,你可能会让它工作。使用sqlcipher。

您也可以尝试使用Encryption Transformer类。可以打破谓词。如果您使用nspredicates并且根据您的安全需要,您可以选择保留相对字母顺序的加密算法(如果必须,请自行滚动)。这将允许您使用谓词。这个页面的底部用代码示例解释了如何做到这一点(尽管你需要找到一个合适的加密算法作为它们的断点谓词):http://blog.artlogic.com/tag/encryption/ 加密字段而不是整个数据库。

停止/检测越狱不会阻止任何事情。您可以在Finder中打开应用程序包文件,而无需进行越狱或任何特殊操作。同步到itunes将你的应用程序.ipa文件拉下来,所以你需要做的就是转到该文件并打开它以获取应用程序的包数据。