免费,且开源:slcipher

非常感谢作者:developernotes

刚开始加密一直失败。

经过和作者沟通,sqlcipher不能直接操作一个已经有数据的db文件,建议通过sqlcpher mac exec 创建db文件。

相关链接SQLCipher 命令行使用 后台加密

update:
目前已成功加密数据库文件,以下介绍详细步骤

1.下载release版本源码 sqlcipher

2.编译源码,用于生成mac exec可执行文件。 这步骤很关键。折腾了很久才编译通过。
cd 到 sqlcipher-3.3.1 目录

1
2
3
4
5
./configure --enable-tempstore=yes --with-crypto-lib=commoncrypto \
CFLAGS="-DSQLITE_HAS_CODEC -DSQLITE_TEMP_STORE=2" \
LDFLAGS="-framework Security"

make

搞定。这个时候会看到目录多了一个sqlcipher 的可执行文件,其实他是个快捷方式。离开这个目录他啥也不是

  1. 创建加密数据库文件
    1
    2
    3
    4
    5
    ./sqlcipher test.db  #创建一个db文件  

    sqlite> PRAGMA key = 'test'; #设置密码

    sqlite> .e #退出

好了,在目录里可以找到test.db文件了。试试吧,用一般的数据库工具是打不开的。提示数据库被加密。至此,创建加密数据库工作已完成

4.下面介绍通过ios 工程操作 加密数据库,包括创建表等。
如何集成到自己工程,图文并茂,很详细
直接使用该工程,集成到新的project,没有效果。加密失败
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
sqlite3 *db;
if (sqlite3_open([path UTF8String], &db) == SQLITE_OK) {
const char* key = [@"123456" UTF8String];
sqlite3_key(db, key, (int)strlen(key));
if (sqlite3_exec(db, (const char*) "SELECT count(*) FROM sqlite_master;", NULL, NULL, NULL) == SQLITE_OK) {
NSLog(@"Password is correct, or a new database has been initialized");
} else {
NSLog(@"Incorrect password!");
}
//创建表
NSString *sql = @"CREATE TABLE IF NOT EXISTS testTable (id integer primary key AutoIncrement,col1 varchar(20),col2 varchar(20))";
if (sqlite3_exec(db, sql.UTF8String, NULL, NULL, NULL) == SQLITE_OK) {
NSLog(@"create table success");
} else {
NSLog(@"create table failure");
}

sqlite3_close(db);
}

log 结果是 Password is correct, or a new database has been initialized

说明操作成功。