-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Objc 加密与配置
本文主要介绍如何对 WCDB 特定的数据库进行基本的配置,而加密也是配置的其中较常用的一项。
配置主要用控制数据库操作的行为。WCDB 对 SQLite 的数据库做了基本的配置,如 journal_mode
、fullfsync
等,以满足 WCDB 的需求。同时,开发者也可以根据自己的需求,自定义配置项。
WCDB 提供的默认配置为:
PRAGMA locking_mode="NORMAL"
PRAGMA synchronous="NORMAL"
PRAGMA journal_mode="WAL"
PRAGMA checkpoint_fullfsync=1
PRAGMA temp_store=1
SQLITE_DEFAULT_PAGE_SIZE=4096
SQLITE_DEFAULT_WAL_SYNCHRONOUS=1
SQLITE_DEFAULT_WAL_AUTOCHECKPOINT=0
SQLITE_DEFAULT_SYNCHRONOUS=1
SQLITE_DEFAULT_JOURNAL_SIZE_LIMIT=4194304
加密功能可通过 setCipherKey
方法开启,它有多个版本,其中参数最多的版本为:
// 该接口等同于配置 PRAGMA cipher="xxx",PRAGMA cipher_page_size=xxx, PRAGMA cipher_compatibility=xxx
-[WCTDatabase setCipherKey:andCipherPageSize:andCipherViersion:]
其中,pageSize
是加密的页大小参数,SQLCipher 在 iOS 上默认使用 4096,macOS 上默认使用 1024。而 WCDB 则在所有平台上都s使用 4096,以获得更好的性能。开发者一般不需要做特别的修改。对于在 macOS 上通过其他方式创建的加密数据库,在 WCDB 使用时,可手动设置为 1024 以确保解密成功。更多关于 cipher_page_size 的信息,可以参考其官方文档。
cipherVersion
是创建数据库的 SQLCipher 的主版本,现在 SQLCipher 的主版本到 4 了,也是WCDB现在使用的默认版本。之前WCDB 1.x 版本使用的 SQLCipher 主版本是 3。不同的主版本使用的加密配置也是不一样的,要根据数据库创建时所用的 SQLCipher 版本来配置,才能打开数据库。更多关于 cipher_compatibility 的信息,可以参考其[官方文档][SQLCipher-Pragma-Cipher-Compatibility]。
如果开发者也不清楚实际的配置,可以通过
canOpen
接口来尝试多种配置。
WCTDatabase* database = [[WCTDatabase alloc] initWithPath:filePath];
NSData* password = [@"password" dataUsingEncoding:NSUTF8StringEncoding];
// 设置加密接口应在其他所有调用之前进行,否则会因无法解密而出错
[database setCipherKey:password];
NSAssert([database canOpen], @"Failed to decrypt database");
BOOL ret = [database insertObject:object intoTable:@"sampleTable"];
开启加密会有部分性能损耗,详情请参考 Benchmark 与性能一章。
值得注意的是,设置密码是一件很慎重的事情。对于已经创建且存在数据的数据库,无论是原本未加密想要改为加密,还是已经加密想要修改密码,都是成本非常高的操作,因此不要轻易使用。更多相关信息可以参考官方文档。
除了上述配置,开发者还可以根据自己的需求,通过 -[WCTDatabase setConfig:withUninvocation:forName:withPriority:]
接口设置其他配置。详细的配置列表可以参考 SQLite 的官方文档 和 SQLCipher 的官方文档。
设置配置的接口函数原型如下:
- (void)setConfig:(WCTConfigBlock)nsInvocation // 数据库连接打开时的配置回调
withUninvocation:(WCTConfigBlock)nsUninvocation //数据库连接关闭时的配置函数
forName:(NSString*)name // 配置名称,同名的配置会互相覆盖
withPriority:(WCTConfigPriority)priority // 配置执行的顺序,顺序较小的配置优先执行。WCDB 自带的配置从 0 开始。
以下是设置配置的一个例子:
[database setConfig:^BOOL(WCTHandle *handle) {
return [handle execute:WCDB::StatementPragma().pragma(WCDB::Pragma::secureDelete()).to(1)];
} withUninvocation:nil forName:@"secure_delete" withPriority:WCTConfigPriorityLow];
- 欢迎使用 WCDB
- 基础教程
- 进阶教程
- 欢迎使用 WCDB
- 基础教程
- 进阶教程
- 欢迎使用 WCDB
- 基础教程
- 进阶教程
- 欢迎使用 WCDB
- 基础教程
- 进阶教程