【问题标题】:How to protect sqlite db in your core-data iPhone app?如何在您的核心数据 iPhone 应用程序中保护 sqlite db?
【发布时间】:2011-02-20 23:16:13
【问题描述】:

我有一个基于 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 ...>

当我在商店 url 上设置断点时,它只返回另一个文件位置,我猜它与越狱 iPhone 中的文档目录一样可见:

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

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

谢谢

【问题讨论】:

    标签: iphone sqlite core-data iphone-security


    【解决方案1】:

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

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

    更新

    即使试图避免越狱手机(这并不能 100% 保证此人是罪犯。请记住,开发人员经常出于诚实的原因越狱他们的手机)。不会保护您的数据。数据位于台式计算机上的 zip 文件中,无需运行或触摸 CocoaTouch 设备即可访问。

    如果数据是私有的,那么您需要将其放在网络服务上,并且永远不要将其存储在设备上。设备(或与此相关的任何设备)上的任何东西都可以访问并受到逆向工程的影响。

    【讨论】:

    • 谢谢马库斯。不幸的是,要保护的列已应用搜索,因此以二进制形式存储并不是最可行的解决方案。我刚刚想到的一个想法是我是否可以在启动时检测到越狱手机。如果检测到,我可以从 /var/mobile/... (或文档目录,如果 db 存在)中删除数据库,然后退出/根本不运行应用程序。一种变体是在每次应用程序运行结束时从其文件位置删除数据库(在 applicationWillTerminate 中添加代码),这样数据库就不会留在文件系统上。这听起来可行吗?
    • 经过更多思考和研究,我同意您的更新。可以采取一些初步措施来防止最基本的黑客攻击 - 但最终,坚定的黑客会得到他们想要的。
    • 喜欢这个答案。但不幸的是,您可以从 iphone 包中的 .plist 或 .sqlite 检索任何数据。实际上没有办法保护数据。加密/解密很好,但有经验的人可以做逆向工程来获取密钥。
    【解决方案2】:

    你可以试试这个: https://github.com/calebmdavenport/encrypted-core-data 它看起来处于开发的早期阶段,但如果你有一个简单的数据模型,你也许可以让它工作。使用 sqlcipher。

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

    停止/检测越狱不会阻止任何事情。您可以在 finder 中打开 Mac 上的应用程序包文件,而无需越狱或任何特殊操作。同步到 iTunes 会拉取您的应用程序 .ipa 文件,因此您需要做的就是转到该文件并打开它以获取应用程序的包数据。

    【讨论】:

      猜你喜欢
      • 2017-11-05
      • 1970-01-01
      • 2016-07-11
      • 1970-01-01
      • 2012-08-08
      • 2011-10-06
      • 1970-01-01
      • 2011-08-31
      • 2011-01-31
      相关资源
      最近更新 更多