VS2008 编译SQLite 3.8.4.3 + sqlcipher-3.1.0 + openssl-1.0.1g

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 文件内容如下:


01@echo off
02@set OPTS=no-asm
03@perl Configure VC-WIN32
04@perl util\mkfiles.pl >MINFO
05@perl util\mk1mf.pl %OPTS% debug VC-WIN32 >d32.mak
06@perl util\mk1mf.pl %OPTS% VC-WIN32 >32.mak
07@perl util\mkdef.pl 32 libeay > ms\libeay32.def
08@perl util\mkdef.pl 32 ssleay > ms\ssleay32.def
09@nmake -f d32.mak
10@nmake -f 32.mak

 

然后使用VC命令行进入openssl-1.0.1g目录运行 build.bat 就开始编译并生成 libeay32.lib ssleay32.lib;

3、编译SQLite 创建一个空的win32 dll项目,将解压缩的文件添加进来,进行编译,项目属性–配置属性–连接器–输入–模块定义文件,添加sqlite3.def,和附加依赖项添加 libeay32.lib ssleay32.lib。

在sqlite3.def 文件最后添加以下代码


1sqlite3_key
2sqlite3_rekey

 

在sqlite3.cpp 文件最前添加以下代码


1/*** START REQUIRED BY SQLCIPHER ***/
2#define SQLITE_HAS_CODEC
3#define SQLITE_ENABLE_RTREE
4#define SQLITE_ENABLE_COLUMN_METADATA
5#define SQLITE_TEMP_STORE 2
6/*** END REQUIRED BY SQLCIPHER ***/

 

然后拉到最后添加以下代码


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文件的内容为


01/* BEGIN CRYPTO */
02#ifdef SQLITE_HAS_CODEC
03void sqlite3pager_get_codec(Pager *pPager, void **ctx) {
04    *ctx = pPager->pCodec;
05}
06 
07int sqlite3pager_is_mj_pgno(Pager *pPager, Pgno pgno) {
08    return (PAGER_MJ_PGNO(pPager) == pgno) ? 1 : 0;
09}
10 
11sqlite3_file *sqlite3Pager_get_fd(Pager *pPager) {
12    return (isOpen(pPager->fd)) ? pPager->fd : NULL;
13}
14 
15void sqlite3pager_sqlite3PagerSetCodec(
16                                       Pager *pPager,
17                                       void *(*xCodec)(void*,void*,Pgno,int),
18                                       void (*xCodecSizeChng)(void*,int,int),
19                                       void (*xCodecFree)(void*),
20                                       void *pCodec
21                                       ){
22                                           sqlite3PagerSetCodec(pPager, xCodec, xCodecSizeChng, xCodecFree, pCodec);
23}
24 
25void sqlite3pager_sqlite3PagerSetError( Pager *pPager, int error) {
26    pPager->errCode = error;
27}
28 
29#endif
30/* END CRYPTO */

 

然后再编译可以成功生成sqlite3.dll

4、
使用方法


01#include "sqlite3.h"
02#include <stdio.h>
03 
04#define ERROR(X)  {printf("[ERROR] iteration %d: ", i); printf X;fflush(stdout);}
05 
06int main(int argc, char **argv) {
07  sqlite3 *db;
08  const char *file= "sqlcipher.db";
09 
10  const char *key1 = "test123";
11  char* key = (char *) key1;
12 
13    if (sqlite3_open(file, &db) == SQLITE_OK) {
14      int row, rc, master_rows;
15      sqlite3_stmt *stmt;
16       
17      if(db == NULL) {
18        ERROR(("sqlite3_open reported OK, but db is null, retrying open %s\n", sqlite3_errmsg(db)))
19      }
20  
21      if(sqlite3_key(db, key, strlen(key)) != SQLITE_OK) {
22    ERROR(("error setting key %s\n", sqlite3_errmsg(db)))
23        exit(1);
24      }
25//SQLlite 操作代码...
26 
27}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值