一、下载代码
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
再把这个没有加密的test.db数据库文件通过sqlcipher转换为加密格式的。
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>
2、把数据导成sql格式文件:
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
4、导入成功后,我们在用vim -b打开test1.db数据库文件,可以认为你看到的基本上都是乱码:
00001b0: 913c 52e4 5809 83b9 153a 8d5d 4b84 9715 .<R.X....:.]K... 00001c0: a552 f8fb 9e3f 9637 4c9a 4b00 2259 a95b .R...?.7L.K."Y.[ 00001d0: 91d6 95da ce34 f9f2 5b05 2bea 439b 7cae .....4..[.+.C.|. 00001e0: 1e60 333f 5323 21a9 989b a08a ad4f ea78 .`3?S#!......O.x
五、C代码测试
/********************************************************************************* * Copyright: (C) 2014 EAST * All rights reserved. * * Filename: test.c * Description: This file * * Version: 1.0.0(07/25/2014) * Author: fulinux <fulinux@sina.com> * ChangeLog: 1,Release initial version on "07/25/2014 05:15:05 PM" * ********************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <sqlite3.h> 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,&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