【问题标题】:Securing Coredata objects保护 Coredata 对象
【发布时间】:2011-02-07 03:49:52
【问题描述】:

我正在开发一个包含一些敏感信息的应用程序。我知道外行很难侵入 iphone 来获取信息。如果我直接使用 SQLite,我有一个叫做 SQLite Cipher 的东西来加密/编码数据库。

无论如何,我是否可以使用相同的方式来加密核心数据,这样黑客就很难进入数据。

有人能解释一下吗?

提前致谢

【问题讨论】:

    标签: iphone security encryption cryptography


    【解决方案1】:

    现在,iPhone 3GS 和更新设备(包括 iPad)上的核心数据默认加密(硬件加密)。这意味着数据会使用硬件密钥自动加密。在 iOS 4 或更高版本中,following the steps at Nick Harris' more detailed blog entry 可以启用第二层加密(称为“数据保护”),它也使用用户的密码来加密硬件密钥。

    所有这些都取决于users setting a secure passcode and enabling data protection in iOS 4。如果您是注册的苹果开发者,您还可以在输入您的开发者ID和密码后watch the WWDC 2010 video on "Securing Application Data" in iTunes at this linklook at the PDF of the slides here,了解有关文件加密的更多详细信息。

    要启用数据保护,在您的 - (NSPersistentStoreCoordinator *)persistentStoreCoordinator 调用中,只需使用以下键和值更改 .sqlite 文件的文件属性。有关更详细的代码,请参阅 Nick Harris 的博客,包括如何检查 iOS 4 或更高版本是否处于活动状态。

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"MyAppName.sqlite"];
    NSString *storePath = [storeURL path];
    NSDictionary *fileAttributes = [NSDictionary dictionaryWithObject:NSFileProtectionComplete forKey:NSFileProtectionKey];
    [[NSFileManager defaultManager] setAttributes:fileAttributes ofItemAtPath:storePath error:&error]
    

    【讨论】:

      【解决方案2】:

      Core Data Programming Guide 明确指出 SQL 存储类型比 XML 或二进制安全一点,但本质上并不安全 - 它建议使用加密的磁盘映像。不幸的是,这在 iPhone 上有点难以管理。

      如果这是您真正关心的问题,您可能会考虑构建您自己的持久存储类型 - 该指南有一个 section 关于创建您自己的原子存储,并建议您参考 Atomic Store Programming Topics 文档。构建一个在启动时从用户提示中获取一些密钥的存储,然后使用该密钥进行初始化以进行加密和解密。 (请注意,如果您采用这条路线,NSPersistentStore 类参考表明 Core Data 不支持直接对 NSPersistentStore 进行子类化 - 您应该改为对 NSAtomicStore 进行子类化。)

      【讨论】:

        【解决方案3】:

        如果有人在使用越狱的 iPhone,那么您绝对无能为力。您用于加密和解密的函数可以挂钩以获取使用的密钥/iv。您还可以做一些令人讨厌的事情,例如完全转储闪存、键盘缓冲区和其他“调试”信息。

        为了让事情变得更加困难,您可以限制秘密在设备上的存储时间。将机密存储在远程系统上并通过 ssl 传输,在不需要时将其删除。这可以防止有人窃取 iphone,越狱,然后转储数据库。我不确定这是否是威胁您的特定应用程序的攻击。

        就“外行”(不识字的人?:) 而言,您不必担心太多。 Apple 有适当的保护措施,以防止已安装的应用程序读取/写入彼此的资源。

        【讨论】:

          【解决方案4】:

          您可以为实体添加一个类别,该类别会覆盖对持久存储的读取和写入值。然后,您可以连接到CommonCrypto 例程,以便在应用程序存储和检索这些值时对它们进行私钥和公钥加密和解密。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-07-08
            • 1970-01-01
            • 1970-01-01
            • 2011-05-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多