• 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 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
    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 文件最后添加以下代码


    1 sqlite3_key
    2 sqlite3_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
    03 void sqlite3pager_get_codec(Pager *pPager, void **ctx) {
    04     *ctx = pPager->pCodec;
    05 }
    06  
    07 int sqlite3pager_is_mj_pgno(Pager *pPager, Pgno pgno) {
    08     return (PAGER_MJ_PGNO(pPager) == pgno) ? 1 : 0;
    09 }
    10  
    11 sqlite3_file *sqlite3Pager_get_fd(Pager *pPager) {
    12     return (isOpen(pPager->fd)) ? pPager->fd : NULL;
    13 }
    14  
    15 void 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  
    25 void 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  
    06 int 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 ", sqlite3_errmsg(db)))
    19       }
    20   
    21       if(sqlite3_key(db, key, strlen(key)) != SQLITE_OK) {
    22     ERROR(("error setting key %s ", sqlite3_errmsg(db)))
    23         exit(1);
    24       }
    25 //SQLlite 操作代码...
    26  
    27 }
  • 相关阅读:
    插槽分发内容
    Java学习-sgg-day07-20200422-复习
    Java学习-sgg-day06-20200421-今天晚上在下载资料
    Java学习-sgg-day05-20200420
    Java学习之面向对象之总结-sgg-day04-20200419
    Java学习之Eclipse的使用-sgg-day04-20200419
    Java学习之面向对象-sgg-day04-20200419
    Java学习之面向对象-sgg-day03-20200418
    Java学习总结-前三天
    Java学习之-sgg-day03-20200418
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13318263.html
Copyright © 2020-2023  润新知