sqlcipher的移植

2014-11-24 14:27:52 · 作者: · 浏览: 0

一、下载代码

sqlcipher依赖openssl库,首先下载openssl:

[fulinux@ubuntu ~]$ git clone https://github.com/openssl/openssl.git

下载sqlcipher:

站点:http://git.oschina.net/fulinux/sqlcipher.git或者https://github.com/sqlcipher/sqlcipher.git

[fulinux@ubuntu ~]$ git clone http://git.oschina.net/fulinux/sqlcipher.git
或者
[fulinux@ubuntu ~]$ git clone https://github.com/sqlcipher/sqlcipher.git

二、编译

编译openssl:

[fulinux@ubuntu openssl]$ ./config
[fulinux@ubuntu openssl]$ sudo make install
编译sqlcipher: 
[fulinux@ubuntu sqlcipher]$mkdir install
[fulinux@ubuntu sqlcipher]$./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="-lcrypto" --prefix=$PWD/install && make install

如果遇到编译问题,请checkout到发行版本

[fulinux@ubuntu sqlcipher]$git checkout v3.1.0 

编译成功后,工程根目录的下install/bin/中有一个sqlcipher执行文件,为了方便拷贝到工程根目录下:

[fulinux@ubuntu sqlcipher]$ ls install/bin/
sqlcipher
[fulinux@ubuntu sqlcipher]$ cp install/bin/sqlcipher . 

新建一个数据库

[fulinux@ubuntu sqlcipher]$ ./sqlcipher test.db
SQLCipher version 3.8.4.3 2014-04-03 16:53:12
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> PRAGMA KEY = '12345';
sqlite> create table film (number,name);
sqlite> insert into film values (1,'aaa');
sqlite> insert into film values (2,'bbb');
sqlite> select * from film;
1|aaa
2|bbb
sqlite> .quit
打开上面创建的数据库
[fulinux@ubuntu sqlcipher]$ ./sqlcipher test.db
SQLCipher version 3.8.4.3 2014-04-03 16:53:12
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> PRAGMA KEY = '12345';
sqlite> .schema
CREATE TABLE film (number,name);
sqlite> select * from film;
1|aaa
2|bbb
sqlite> 
[fulinux@ubuntu sqlcipher]$ ./sqlcipher test.db
SQLCipher version 3.8.4.3 2014-04-03 16:53:12
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from film;
Error: file is encrypted or is not a database
sqlite> 

四、加密前后测试

用sqlite3查看数据:

[fulinux@ubuntu sqlite]$ sqlite3 test.db 
SQLite version 3.8.5 2014-06-04 14:06:34
Enter ".help" for usage hints.
sqlite> select * from test;
1|hxl
2|sqlite
3|test
4|for
5|linux
sqlite> 

用vim -b test.db,然后用xxd把文件转换成十六进制格式

:%!xxd

可以看到数据是没有加密的,显而易见:

00007d0: 0000 0805 0300 176c 696e 7578 0604 0300  .......linux....
00007e0: 1366 6f72 0703 0300 1574 6573 7409 0203  .for.....test...
00007f0: 0019 7371 6c69 7465 0601 0300 1368 786c  ..sqlite.....hxl

1、用sqlcipher或者sqlite打开未加密的test.db文件:

[fulinux@ubuntu sqlcipher]$ ./sqlcipher test.db
SQLCipher version 3.8.4.3 2014-04-03 16:53:12
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from test;
1|hxl
2|sqlite
3|test
4|for
5|linux
sqlite> 
sqlite> .output test.sql
sqlite> .dump
sqlite> .exit

3、结合test.sql文件生成一个加密的数据库文件test1.db:

[fulinux@ubuntu sqlcipher]$ ./sqlcipher test1.db
SQLCipher version 3.8.4.3 2014-04-03 16:53:12
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>  PRAGMA key = 'test';
sqlite> .read test.sql
sqlite> 
sqlite> select * from test;
1|hxl
2|sqlite
3|test
4|for
5|linux
sqlite> .exit
00001b0: 913c 52e4 5809 83b9 153a 8d5d 4b84 9715  . 
 

五、C代码测试

编辑一个C代码文件test.c,代码可以:

/*********************************************************************************
 *      Copyright:  (C) 2014 EAST
 *                  All rights reserved.
 *
 *       Filename:  test.c
 *    Description:  This file 
 *                 
 *        Version:  1.0.0(07/25/2014)
 *         Author:  fulinux 
 *      ChangeLog:  1, Release initial version on "07/25/2014 05:15:05 PM"
 *                 
 ********************************************************************************/

#include 
#include 
#include 

static int callback(void *notused, int argc, char **argv, char **azcolname)
{
    int i;
    for(i = 0; i < argc; i++){
        printf ("%s = %s\n", azcolname[i], argv[i] argv[i]:"NULL");
    }

    printf ("\n");
    return 0;
}


/********************************************************************************
 *  Description:
 *   Input Args:
 *  Output Args:
 * Return Value:
 ********************************************************************************/
int main (int argc, char **argv)
{
    sqlite3 *db;
    char *zerrmsg = 0;
    int rc;

    if(argc != 3){
        fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
        exit(0);
    }

    rc = sqlite3_open(argv[1], &db);
    if(rc){
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        return 1;
    }

    sqlite3_key(db, "test", 4);
    rc = sqlite3_exec(db, argv[2], callback, 0, &zerrmsg);
    if(rc != SQLITE_OK){
        fprintf(stderr, "SQL error: %s\n", zerrmsg);
        sqlite3_free(zerrmsg);
    }

    sqlite3_close(db);
    return 0;
} /* ----- End of main() ----- */
[fulinux@ubuntu ~]$ git clone http://git.oschina.net/fulinux/jupiter.git
[fulinux@ubuntu jupiter]$ git checkout sqlcipher 

编译test.c文件,因为库和头文件都在/home/fulinux/sqlcipher/install目录下,所以下面参数如下:

[fulinux@ubuntu jupiter]$ gcc -g test.c -o test -lsqlcipher -L /home/fulinux/sqlcipher/install/lib/ -I /home/fulinux/sqlcipher/install/include/sqlcipher/

执行测试程序:

[fulinux@ubuntu jupiter]$./test test1.db "select * from test;"
id = 1
value = hxl
id = 2
value = sqlite
id = 3
value = test
id = 4
value = for
id = 5
value = linux

相关网址:http://sqlcipher.net/sqlcipher-api/

author: fulinux

e-mail:fulinux@sina.com

blog: blog.csdn.net/fulinus