【问题标题】:How to encrypt core data sqlite database?如何加密核心数据 sqlite 数据库?
【发布时间】:2014-03-31 01:05:36
【问题描述】:

我正在创建一个可可基础核心数据应用程序。我想保护 sqlite 数据库,防止从应用程序中读取它。怎么样?

【问题讨论】:

  • AFAIK,您所能做的就是安装您自己的 SqlCipher 副本并跳过使用 Core Data。
  • iPhone 可以自动加密任何文件。缺点是您不能再在后台使用这些文件。
  • 我说的是 Cocoa 开发,所以是为 Mac 实现的,而不是为 iOS 或 iPhone 实现的。
  • @János - 没关系 - 可能是 Android 或 Windows,答案基本相同。
  • 我说的是:“iPhone 可以自动加密任何文件。”,这不是 iPhone,所以它不会自动加密

标签: objective-c cocoa sqlite core-data encryption


【解决方案1】:

您可以使用密码算法来加密数据库并在您的应用程序中使用它时进行解密。 CommonCrypto 或 SecurityTransform 可能是您的选择。看看Cryptographic Services Guide Apple Dev-Docs。 所需的凭据可以安全地存储在 OS X 钥匙串中。 因此,用户可以在每个应用程序启动/登录时解密数据库,并在休假或其他情况下对其进行加密。

另一种方法可能是硬编码凭据(可能不是一个好主意,取决于您的应用程序要使用的安全标准)并在每次读/写数据库时动态进行加密/解密,以便数据库本身没有加密,但其中的记录是加密的。如果您的应用崩溃,这可能会更容错。

因此,没有“正确”的方式来完成这项任务,这取决于您要归档的内容以及数据的安全性。 但是无论您做什么,都不要在 NSUserDefaults 中保存任何凭据,这是绝对不安全的。
这就像有一个安全的箱子,它的钥匙就在箱子上。

【讨论】:

  • 在打开应用程序时解密整个文件是非常不安全的,加密/解密单个行也是如此。只有类似于 SqlCipher 的块加密方案是安全的,而不仅仅是装点门面。
  • 是的,我完全同意 SqlCipher,但这也取决于任务。
  • 是的,我完全同意 SqlCipher,但是... SqlCiper 使用 OpenSSL,它是安全的,但在不同版本之间并不总是具有稳定的 API。 (来源:Apple,自己的经验)这也是为什么还应根据任务考虑其他解决方案的原因。
  • 您可以制作自己的 SqlCipher 版本,利用平台的内置加密设施。这通常是最安全的(并且符合美国出口指南)。
  • 请注意,修复您自己的 SqlCypher 版本虽然总体上不是一项特别困难的任务,但需要良好的编程技能和大量测试。这不是“插入”一个密码 API 来代替另一个的简单问题。 (如果有人为 Apple 平台做这件事并将其作为开源发布,那就太好了。)
【解决方案2】:

对于 iOS 端,github 上有 Project iMas-encrypted-core-data。它也可能对您在 Cocoa 上有所帮助。

该项目的目标是:

提供一个核心数据存储来加密所有持久化的数据。除了初始设置外,用法与 Core Data 完全相同,可以在使用 Core Data 的现有项目中使用。

在后台,他们使用 SQLCipher 并将 coreData 方法包装到 sql 中。因此,您获得了加密存储,但可以使用 coreData 语法进行访问。无需了解 SQL 语法。

这个项目看起来很有希望。绝对值得一看。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 2013-02-01
    • 2011-10-07
    • 2011-05-14
    • 2019-11-17
    • 1970-01-01
    相关资源
    最近更新 更多