EncryptedCoreData 3.1

EncryptedCoreData 3.1

测试已测试
语言语言 Obj-CObjective C
许可证 自定义
发布上次发布2016年5月

Fernando ArellanoDaniel Broad 维护。



  • MITRE

Encrypted Core Data SQLite Store analytics

提供了一种加密所有持久化数据的 Core Data 存储库。除了初始设置外,使用方式与 Core Data 完全相同,并且可以用于现有使用 Core Data 的项目。

解决漏洞

  1. SQLite 数据库未加密,内容为纯文本
    • CWE-311:敏感数据缺失加密
  2. 通过 4 位系统密码保护 SQLite 数据库文件
    • CWE-326:加密强度不足
    • SRG-APP-000129-MAPP-000029 严重性-CAT II:移动应用程序必须实现自动化机制,强制执行操作系统未提供的访问控制限制

项目设置

  • 创建项目时,请确保选中 使用 Core Data
  • 切换到项目的根目录,并检出 encrypted-core-data 项目的代码
    cd ~/Documents/code/YourApp

    git clone https://github.com/project-imas/encrypted-core-data.git
  • 单击顶级项目项,并添加文件("option-command-a")
  • 导航到 encrypted-core-data,突出显示 增量存储,然后单击 添加

  • SQLCipher 被添加为 ECD 内部的 git 子模块。应使用 git submodule initgit submodule update 来填充 sqlcipher 子模块目录,其中可以找到 sqlcipher.xcodeproj 并将其添加到项目中。

  • 在 Xcode 中使用 SQLCipher 中的 CommonCrypto
    • 在 sqlcipher 项目设置 > 构建设置 > 自定义编译器标志 > 其他 C 标志下添加编译器标志 -DSQLCIPHER_CRYPTO_CC-DSQLITE_HAS_CODEC
    • 在您应用程序的构建设置 > 构建阶段下,将 sqlcipher 添加到目标依赖项,并将 libsqlcipher.aSecurity.framework 添加到连接库。
  • 注意: 与向 CommonCrypto 的迁移一起,我们将作为子模块包含的 SQLCipher 版本从 v2.0.6 更新到 v3.1.0。使用 v2.0.6 创建的数据库无法直接由 v3.1.0 读取,并且 ECD 还不支持旧数据库迁移。

通过CocoaPod安装

  • 如果您还没有安装CocoaPods,请在终端中执行$ sudo gem install cocoapods。(有关详细信息,请参阅CocoaPods网站。)
  • 在您的项目目录中,执行pod init来创建Podfile。
  • pod 'EncryptedCoreData', :git => 'https://github.com/project-imas/encrypted-core-data.git'添加到Podfile中
  • 运行pod install
  • 在您的应用程序委托源文件(AppDelegate.m)中,添加#import "EncryptedStore.h"

使用EncryptedStore

已知EncryptedStore在iOS 6.0到9.2版本上运行成功。

如果您希望设置自定义缓存大小和/或自定义数据库URL:创建一个NSDictionary来设置您的EncryptedStore的选项,替换customPasscode、customCacheSize和/或customDatabaseURL

NSDictionary *options = @{ EncryptedStorePassphraseKey: (NSString *) customPasscode,
                           EncryptedStoreCacheSize: (NSNumber *) customCacheSize,
                           EncryptedStoreDatabaseLocation: (NSURL *) customDatabaseURL
                           };

在您的应用程序委托源文件(即AppDelegate.m)中,您应该看到

NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];

如果您创建了一个具有自定义选项的NSDictionary,则用以下行替换该行

NSPersistentStoreCoordinator *coordinator = [EncryptedStore makeStoreWithOptions:options managedObjectModel:[self managedObjectModel]];

否则,用以下行替换该行

NSPersistentStoreCoordinator *coordinator = [EncryptedStore makeStore:[self managedObjectModel]:@"SOME_PASSCODE"];

确保将"SOME_PASSCODE"替换为您自己的密码。

在同一个文件中添加对EncryptedStore.h的导入

   #import "EncryptedStore.h"

如果出现问题,可以添加-com.apple.CoreData.SQLDebug 1以查看的所有由encryted-cored-data生成的加密日志。

功能

  • 一对一关系
  • 一对多关系
  • 多对多关系(新功能)
  • 谓词
  • 继承实体

缺失功能和已知错误在问题跟踪器上维护

示意图

以下是显示NSSQLiteStore和EncryptedStore之间差异的示意图。请注意,SQLite调用与封装它的层耦合相当紧密:

字符串比较

以下是执行在样本应用程序.sqlite文件上的Unix strings命令的输出。正如您所看到的,默认持久化存储将所有信息以明文形式保留:

许可证

版权所有 2012 - 2014 The MITRE Corporation,保留所有权利。

根据 Apache License,版本 2.0(“许可证”)授权;除非遵守许可证,否则您不得使用此作品。您可以在以下位置获取许可证的副本:

https://apache.ac.cn/licenses/LICENSE-2.0

除非适用法律规定或以书面形式明确同意,否则在许可证下分发的软件按“原样”分发,不提供任何明示或暗示的保证或条件。有关许可具体语言关于授权和限制的内容,请参阅许可证。