我有一个基于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中的文档目录一样可见:
{type = 15, string = file://localhost/var/mobile/Applications/6ACD76F0-396D-4DB1-A46B-B2459A084063/MyiPhoneApp.app/MyDatabaseName.sqlite, base = (null)}
有人可以确认以上是否正确和/或是否有其他方法来解决这个问题(我不打算加密或类似的东西......希望快速保护解决方案)?欣赏坚定的黑客会得到他们想要的东西 - 如果可以的话,我想至少提出一些阻力.
谢谢
首先,是的,您可以在应用程序包中存储只读数据库,并直接从那里访问它.
其次,保护数据的唯一方法是将其加密到磁盘上并在内存中加密.使用当前形式的Core Data无法轻松完成此操作.您可以做的是加密数据库的某些列并仅在内存中解密它们.这是通过将列存储为二进制数据来实现的,但这也意味着您无法对这些列进行任何搜索.
甚至试图避免越狱手机(这不是100%保证这个人是罪犯.请记住,开发人员经常以诚实的理由越狱他们的手机).不会保护您的数据.数据位于桌面计算机上的zip文件内,无需运行或触摸CocoaTouch设备即可访问.
如果数据是私有的,那么您需要将其放在Web服务上,而不是将其存储在设备上. 任何设备(或用于该问题的任何设备)上是可访问的并且受到逆向工程.