SQLCipher是一个开源库,提供透明,安全的256位AES加密的SQLite数据库文件。
SQLCipher的社区版的源代码是一个BSD-风格的开源许可下发布,但是官方提供的二进制库需要购买。
引用官方的一张图,加密前和加密后的对比效果:
1、先下载以下源码文件
SQLite 3.8.4.3 源码
http://www.sqlite.org/2014/sqlite-amalgamation-3080403.zip
sqlite3.def 文件
http://www.sqlite.org/2014/sqlite-dll-win32-x86-3080403.zip
sqlcipher-3.1.0 源码
https://github.com/sqlcipher/sqlcipher/archive/v3.1.0.zip
openssl-1.0.1g源码 已修复 CVE-2014-0160 漏洞
http://www.openssl.org/source/openssl-1.0.1g.tar.gz
2、编译openssl-1.0.1g
系统先要 activeperl 配置openssl 的时候需要调用 http://www.activestate.com/activeperl。
解压源码包进入openssl-1.0.1g目录新键一个build.bat 文件内容如下:
03 |
@perl Configure VC-WIN32 |
04 |
@perl utilmkfiles.pl >MINFO |
05 |
@perl utilmk1mf.pl %OPTS% debug VC-WIN32 >d32.mak |
06 |
@perl utilmk1mf.pl %OPTS% VC-WIN32 >32.mak |
07 |
@perl utilmkdef.pl 32 libeay > mslibeay32.def |
08 |
@perl utilmkdef.pl 32 ssleay > msssleay32.def |
然后使用VC命令行进入openssl-1.0.1g目录运行 build.bat 就开始编译并生成 libeay32.lib ssleay32.lib;
3、编译SQLite 创建一个空的win32 dll项目,将解压缩的文件添加进来,进行编译,项目属性–配置属性–连接器–输入–模块定义文件,添加sqlite3.def,和附加依赖项添加 libeay32.lib ssleay32.lib。
在sqlite3.def 文件最后添加以下代码
在sqlite3.cpp 文件最前添加以下代码
2 |
#define SQLITE_HAS_CODEC |
3 |
#define SQLITE_ENABLE_RTREE |
4 |
#define SQLITE_ENABLE_COLUMN_METADATA |
5 |
#define SQLITE_TEMP_STORE 2 |
然后拉到最后添加以下代码
1 |
#include <sqlcipher/crypto.c> /*** SQLCIPHER ADDITION ***/ |
2 |
#include <sqlcipher/crypto_cc.c> /*** SQLCIPHER ADDITION ***/ |
3 |
#include <sqlcipher/crypto_impl.c> /*** SQLCIPHER ADDITION ***/ |
4 |
#include <sqlcipher/crypto_openssl.c> /*** SQLCIPHER ADDITION ***/ |
5 |
#include <sqlcipher/pager.c> /*** SQLCIPHER ADDITION ***/ |
以上文件 里的这些头文件注示掉
/*#include “sqliteInt.h”*/
/*#include “btreeInt.h”*/
pager.c文件的内容为
02 |
#ifdef SQLITE_HAS_CODEC |
03 |
void
sqlite3pager_get_codec(Pager *pPager, void
**ctx) { |
04 |
*ctx = pPager->pCodec; |
07 |
int
sqlite3pager_is_mj_pgno(Pager *pPager, Pgno pgno) { |
08 |
return
(PAGER_MJ_PGNO(pPager) == pgno) ? 1 : 0; |
11 |
sqlite3_file *sqlite3Pager_get_fd(Pager *pPager) { |
12 |
return
(isOpen(pPager->fd)) ? pPager->fd : NULL; |
15 |
void
sqlite3pager_sqlite3PagerSetCodec( |
17 |
void
*(*xCodec)( void *, void *,Pgno, int ), |
18 |
void
(*xCodecSizeChng)( void *, int , int ), |
19 |
void
(*xCodecFree)( void *), |
22 |
sqlite3PagerSetCodec(pPager, xCodec, xCodecSizeChng, xCodecFree, pCodec);
|
25 |
void
sqlite3pager_sqlite3PagerSetError( Pager *pPager, int
error) { |
26 |
pPager->errCode = error; |
然后再编译可以成功生成sqlite3.dll
4、
使用方法
04 |
#define ERROR(X) {printf("[ERROR] iteration %d: ", i); printf X;fflush(stdout);} |
06 |
int
main( int argc,
char **argv) { |
08 |
const
char *file= "sqlcipher.db" ; |
10 |
const
char *key1 =
"test123" ; |
11 |
char * key = ( char
*) key1; |
13 |
if
(sqlite3_open(file, &db) == SQLITE_OK) { |
14 |
int
row, rc, master_rows; |
18 |
ERROR(( "sqlite3_open reported OK, but db is null, retrying open %s
" , sqlite3_errmsg(db))) |
21 |
if (sqlite3_key(db, key,
strlen (key)) != SQLITE_OK) { |
22 |
ERROR(( "error setting key %s
" , sqlite3_errmsg(db))) |