ios sqlite 文件加密
免费,且开源:slcipher
非常感谢作者:developernotes
刚开始加密一直失败。
经过和作者沟通,sqlcipher不能直接操作一个已经有数据的db文件,建议通过sqlcpher mac exec 创建db文件。
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
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
19sqlite3 *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
说明操作成功。