windows、linux下sqlite3加密,lua访问数据库,交叉编译至mips

加密函数sqlite3_key,sqlite3_rekey用法:

1.sqlite3_key,sqlite3_rekey均在sqlite3_open和sqlite3_close之间使用。
2.给新建数据库加密
sqlite3_key(db,“XXXXXX”,num);db为数据库指针,XXXXXX为密码,num为密码位数
3.给已有数据库加密
sqlite3_rekey(db,“XXXXXX”,num);
4.给加密数据库改密码
sqlite3_key(db,“XXXXXX”,num);
sqlite3_rekey(db,“XXXXXX”,num);
5.取消密码
sqlite3_key(db,“XXXXXX”,num);
sqlite3_rekey(db,"",0);

windows下:

1.到http://wxcode.sourceforge.net/components/wxsqlite3下载wxsqlite3,其目录中\sqlite3\secure\src下是实现加密所需的源代码。
2.使用VS2013新建一个“WIN32控制台应用程序”工程。项目名称为sqlite3,不勾选“预编译头”选项。点击“完成”。此时,项目中,应该是没有任何文件的。
3.将加密文件及数据库源文件(.\sqlite3\secure\src)拷到sqlite3工程目录下,codec.c, codec.h,codecext.c,extensionfunctions.c,rijndael.c,rijndael.h,sha2.c,sha2.h ,sqlite3.c,sqlite3.def,sqlite3.h,sqlite3ext.h,sqlite3secure.c。
4.在sqlite3工程中加入已经存在的文件,将文件sqlite3.def 和sqlite3secure.c加入到源文件中,不要将其他文件加入到列表中,否则编译不过。
5.在sqlite3工程属性中,加入模块定义文件,sqlite3.def。
6.在工程属性中,加入预定义宏
SQLITE_ENABLE_RTREE,
SQLITE_ENABLE_COLUMN_METADATA,
SQLITE_HAS_CODEC=1,
SQLITE3ENCRYPT_EXPORTS,
SQLITE_ENABLE_FTS3,
SQLITE_ENABLE_FTS3_PARENTHESIS,
SQLITE_SECURE_DELETE,
SQLITE_SOUNDEX,
CODEC_TYPE=CODEC_TYPE_AES128。
7.改变项目属性,其配置类型为动态库(.dll)。
8.直接编译,就可以在目标目录生成sqlite3.dll,sqlite3.lib文件。
9.将其sqlite3.h, sqlite3.dll,sqlite3.lib引入到要使用的项目上即可。若编译不通过,再添加一遍预定义宏。

linux下:

1.sqlcipher依赖openssl库,首先安装openssl库:

1.@ubuntu:~$ sudo apt-get install openssl  
2.@ubuntu:~$ sudo apt-get install libssl-dev 

2.下载sqlcipher:

1.@ubuntu:~$ git clone https://github.com/sqlcipher/sqlcipher.git  
2.@ubuntu:~$ cd sqlcipher-master/
3.@ubuntu:~/sqlcipher-master$ mkdir install1 

3.编译sqlcipher

1.@ubuntu:~/sqlcipher$ ./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="-lcrypto"  --prefix=$PWD/install1 && make install  

4.验证,手写个c文件测试,编译test.c文件

1.@ubuntu:~$ gcc -g -L /home/zhengzheng/sqlcipher-master/install1/lib/ -I /home/zhengzheng/sqlcipher-master/install1/include/ -lsqlcipher test.c -o test

交叉编译至mips平台:

1.由于交叉编译器不包含crypto加密库,所以从openwrt的staging_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/usr/lib下拷贝libcrypto.so.1.0.0共享库到openwrt的staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/mipsel-openwrt-linux/lib下,之后建立libcrypto.so.1.0.0的软连接:

1.@ubuntu:~$ cp openwrt/staging_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/usr/lib/libcrypto.so.1.0.0 openwrt/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/mipsel-openwrt-linux/lib  
2.@ubuntu:~$ cd openwrt/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/mipsel-openwrt-linux/lib  
3.@ubuntu:~/openwrt/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/mipsel-openwrt-linux/lib$ ln -s libcrypto.so.1.0.0 libcrypto.so

2.由于交叉编译器不包含openssl的头文件,所以从openwrt的staging_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/usr/include下拷贝openssl到openwrt的staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/mipsel-openwrt-linux/include下:

1.@ubuntu:~$ cp openwrt/staging_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/usr/include/openssl openwrt/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/mipsel-openwrt-linux/include

3.由于交叉编译后加密算法中的迭代次数页大小等会改变,所以修改sqlcipher-master/src下的crypto.so crypto.h crypto_impl.c
① 修改crypto.so中大约530行处:

1.default:  
2.  sqlcipher_set_default_pagesize(4096);  
3.  sqlcipher_set_default_hmac_algorithm(SQLCIPHER_HMAC_SHA512);  
4.  sqlcipher_set_default_kdf_algorithm(SQLCIPHER_PBKDF2_HMAC_SHA512);  
5.  sqlcipher_set_default_kdf_iter(256000);  
6.  sqlcipher_set_default_use_hmac(1);  
7.  break;  

修改为

1.default:  
2.  sqlcipher_set_default_pagesize(1024);  
3.  sqlcipher_set_default_hmac_algorithm(SQLCIPHER_HMAC_SHA1);  
4.  sqlcipher_set_default_kdf_algorithm(SQLCIPHER_PBKDF2_HMAC_SHA1);  
5.  sqlcipher_set_default_kdf_iter(4000);  
6.  sqlcipher_set_default_use_hmac(1);  
7.  break;  

② 修改crypto.h中大约80行:

1.#define PBKDF2_ITER 256000

修改为

1.#define PBKDF2_ITER 4000

③ 修改crypto_impl.c中大约50行处

1.static volatile int default_page_size = 4096;  
2.static volatile int default_plaintext_header_sz = 0;  
3.static volatile int default_hmac_algorithm = SQLCIPHER_HMAC_SHA512;  
4.static volatile int default_kdf_algorithm = SQLCIPHER_PBKDF2_HMAC_SHA512;  

修改为

1.static volatile int default_page_size = 1024;  
2.static volatile int default_plaintext_header_sz = 0;  
3.static volatile int default_hmac_algorithm = SQLCIPHER_HMAC_SHA1;  
4.static volatile int default_kdf_algorithm = SQLCIPHER_PBKDF2_HMAC_SHA1; 

4.交叉编译出适合mips的sqlcipher头文件动态库:

1.@ubuntu:~$ mkdir /home/zhengzheng/sqlcipher-master/install2  
2.@ubuntu:~$ cd sqlcipher-master/  
3.@ubuntu:~/sqlcipher-master$ ./configure --enable-tempstore=yes CFLAGS="-DSQLITE_HAS_CODEC" LDFLAGS="-lcrypto" --prefix=/home/zhengzheng/sqlcipher-master/install2 --target=mipsel-openwrt-linux --host=mipsel-openwrt-linux LD=mipsel-openwrt-linux-ld  
4.@ubuntu:~/sqlcipher-master$ make
5.@ubuntu:~/sqlcipher-master$ make install

5.验证结果,手写个c文件测试,交叉编译test.c:

1.@ubuntu:~$ mipsel-openwrt-linux-gcc -g -L /home/zhengzheng/sqlcipher-master/install2/lib/ -I /home/zhengzheng/sqlcipher-master/install2/include/sqlcipher/ -lsqlcipher test.c -o test

6.将linux下的libsqlcipher.so.0.8.6拷到mips上的usr/lib下,再建立软连接,即可运行编译好的可执行文件生成加密数据库:

1.root@LoRa_GW:~# cd /usr/lib
2.root@LoRa_GW:~# ln -s libsqlcipher.so.0.8.6 libsqlcipher.so.0

Linux下lua语言访问加密数据库:

1.安装readline依赖库:

1.@ubuntu:~$ wget -c ftp://ftp.gnu.org/gnu/readline/readline-7.0.tar.gz   
2.@ubuntu:~$ tar -zxvf readline-7.0.tar.gz   
3.@ubuntu:~$ cd readline-7.0  
4.@ubuntu:~readline-7.0$ ./configure  
5.@ubuntu:~readline-7.0$ make && make installl 

2.安装lua5.1.5:

1.@ubuntu:~$ curl -R -O http://www.lua.org/ftp/lua-5.1.5.tar.gz  
2.@ubuntu:~$ tar zxf lua5.1.5.tar.gz  
3.@ubuntu:~$ cd lua-5.1.5  
4.@ubuntu:~lua-5.1.5$ make linux  
5.@ubuntu:~lua-5.1.5$ make install 

3.下载luasql,改源码
① 下载解压

1.@ubuntu:~$ git clone https://github.com/keplerproject/luasql.git  
2.@ubuntu:~$ unzip luasql-master

② 打开/luasql-master/src/ls_sqlite3.c,在env_connect函数中
添加:

1.const char *keynumber;  
2.keynumber= luaL_checkstring(L,3);

在if(res!=SQLITE_OK){…return 2;}后添加:

1.else  
2.  {  
3.   if(sqlite3_key(conn,keynumber,加密位数)!=SQLITE_OK)  
4.     {  
5.       return 0;  
6.     }  
7.  } 

4.修改/luasql-master/config中路径:

1.PREFIX ?= /usr  
2.LUA_SYS_VER ?= 5.2  
3.LUA_INC ?= $(PREFIX)/include/lua/$(LUA_SYS_VER)

修改为

1.PREFIX ?= /usr/local  
2.LUA_SYS_VER ?= 5.1  
3.LUA_INC ?= $(PREFIX)/include 

1.# - SQLite3   
2.DRIVER_LIBS_sqlite3 ?= -L/opt/local/lib -lsqlite3  
3.DRIVER_INCS_sqlite3 ?= -I/opt/local/include

修改为

1.# - SQLite3   
2.DRIVER_LIBS_sqlite3 ?= -L/home/zhengzheng/sqlcipher-master/installt1/lib -lsqlcipher  
3.DRIVER_INCS_sqlite3 ?= -I/home/zhengzheng/sqlcipher-master/install1/include

5.编译安装:

1.@ubuntu:~/luasql-master$ make sqlite3  
2.@ubuntu:~/luasql-master$ make install 

即可在luasql-master/src下生成支持lua访问的sqlite3.so

Mips下lua语言访问加密数据库:

1.修改luasql-master/config:

1.# - SQLite3   
2.DRIVER_LIBS_sqlite3 ?= -L/opt/local/lib -lsqlite3  
3.DRIVER_INCS_sqlite3 ?= -I/opt/local/include

修改为

1.# - SQLite3     
2.DRIVER_LIBS_sqlite3 ?= -L/home/zhengzheng/sqlcipher-master/install2/lib -lsqlcipher    
3.DRIVER_INCS_sqlite3 ?= -I/home/zhengzheng/sqlcipher-master/install2/include

1.CC=gcc 

修改为

1.CC=mipsel-openwrt-linux-gcc  

2.重新编译

1.@ubuntu:~$ cd luasql-master/src  
2.@ubuntu:~/luasql-master/src$ rm sqlite3.so  
3.@ubuntu:~/luasql-master/src$ rm luasql.o  
4.@ubuntu:~/luasql-master/src$ cd ../  
5.@ubuntu:~/luasql-master$ make sqlite3  
6.@ubuntu:~/luasql-master$ make install

3.将sqlite3.so拷贝进mips下的usr/lib/lua/5.1/luasql中

参考链接

1.sqlite3对数据库加密用c语言开源项目wxSQLite3实现
2.sqlcipher的移植

你可能感兴趣的:(sqlite3)