简介#

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。 至2015年已经有15个年头,SQLite也迎来了一个版本 SQLite 3已经发布。

但是sqlite本身不对数据库文件进行加密,存储的文件可以明文查看,存做这一定的安全隐患。还好作者提供了几个接口可以让sqlite支持数据加密。比较有名的就是SQLCipher。

SQLCipher是一个开源库,提供透明,安全的256位AES加密的SQLite数据库文件。

SQLCipher的社区版的源代码是一个BSD-风格的开源许可下发布,但是官方提供的二进制库需要购买。

引用官方的一张图,加密前和加密后的对比效果:

摘自百度百科

下载信息#

sqlite官方网站

SQLite3.13.0源码

SQLite3.def文件

SQLCipher-3.1.0源码

OpenSSL-1.0.1g

ActivePerl

步骤#

安装Perl##

从官网上下载ActivePerl并进行安装,我这里安装的是x64版本

编译openssl##

  • 解压Openssl的源码,例如解压缩到openssl-1.0.1g目录下
  • 在openssl目录下新建build.bat批处理文件,内容如下
@echo off
@set OPTS=no-asm
@perl Configure VC-WIN32
@perl util\mkfiles.pl >MINFO
@perl util\mk1mf.pl %OPTS% debug VC-WIN32 >d32.mak
@perl util\mk1mf.pl %OPTS% VC-WIN32 >32.mak
@perl util\mkdef.pl 32 libeay > ms\libeay32.def
@perl util\mkdef.pl 32 ssleay > ms\ssleay32.def
@nmake -f d32.mak
@nmake -f 32.mak
  • 打开需要编译的VC命令行工具进入openssl目录并运行build.bat开始编译,编译成功以后生成libeay32.lib、ssleay32.lib文件。我这里使用的是VS2015的命令行工具Developer Command Prompt for VS2015

编译sqlite3##

  • 用VS2015新建一个空的win32 dll项目,例如我这里取名为sqlite3
  • 将下载到的sqlite压缩包文件解压缩到sqlite3项目文件夹内
  • 修改sqlite3.def文件,在文件的最后添加以下代码
sqlite3_key
sqlite3_rekey
  • 修改sqlite3.c文件,在文件的最开始部分添加以下代码
/*** START REQUIRED BY SQLCIPHER ***/
#define SQLITE_HAS_CODEC 1
#define SQLITE_ENABLE_RTREE 1
#define SQLITE_ENABLE_COLUMN_METADATA 1
#define SQLITE_TEMP_STORE 2
/*** END REQUIRED BY SQLCIPHER ***/
  • 继续修改sqlite3.c文件,在文件的最后添加以下代码
#include <sqlcipher/crypto.c>      /*** SQLCIPHER ADDITION ***/
#include <sqlcipher/crypto_cc.c> /*** SQLCIPHER ADDITION ***/
#include <sqlcipher/crypto_impl.c> /*** SQLCIPHER ADDITION ***/
#include <sqlcipher/crypto_openssl.c> /*** SQLCIPHER ADDITION ***/
#include <sqlcipher/pager.c> /*** SQLCIPHER ADDITION ***/
  • 还是修改sqlite3.c文件,注释掉不必要的头文件,新版本好像是注释掉的
/* #include "sqliteInt.h" */
/* #include "btreeInt.h" */

存放openssl的库##

将编译成功的openssl库文件x86lib,内含libeay32.lib、ssleay32.lib,全部放到sqlite3目录下,设置工程目录链接这两个静态库

编译sqlite3##

编译成功,即可生成对应的sqlite3.dll

使用示例代码#

不多说了,直接上代码

#define SQLITE_HAS_CODEC
#include "sqlite3.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h> #ifdef _DEBUG
#pragma comment(lib, "../Debug/sqlite3.lib")
#else
#pragma comment(lib, "../Release/sqlite3.lib")
#endif #define ERROR(X) /*{printf("[ERROR] iteration %d: ", i); printf X;fflush(stdout);}*/ 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;
} int main(int argc, char **argv) {
sqlite3 *db;
const char *file= "sqlcipher.db"; const char *key1 = "test123";
char* key = (char *) key1; if (sqlite3_open(file, &db) == SQLITE_OK) {
int rc; if(db == NULL) {
ERROR(("sqlite3_open reported OK, but db is null, retrying open %s\n", sqlite3_errmsg(db)))
} if(sqlite3_key(db, key, strlen(key)) != SQLITE_OK) {
ERROR(("error setting key %s\n", sqlite3_errmsg(db)))
exit(1);
}
//SQLlite 操作代码...
char* sqlstatement0 = "create table if not exists test(int id,varchar name);";
char* sqlstatement1 = "insert into test values(1,'hello');";
char* sqlstatement2 = "select * from test;";
char* zErrMsg = NULL;
rc = sqlite3_exec(db, sqlstatement0, callback, 0, &zErrMsg);
if( rc!=SQLITE_OK ){
// printf("%s\n",argv[2]);
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
zErrMsg = NULL;
}
rc = sqlite3_exec(db, sqlstatement1, callback, 0, &zErrMsg);
if( rc!=SQLITE_OK ){
// printf("%s\n",argv[2]);
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
zErrMsg = NULL;
} rc = sqlite3_exec(db, sqlstatement2, callback, 0, &zErrMsg);
if( rc!=SQLITE_OK ){
// printf("%s\n",argv[2]);
fprintf(stderr, "SQL error: %s\n", zErrMsg);
sqlite3_free(zErrMsg);
zErrMsg = NULL;
}
sqlite3_close(db);
system("pause");
}
}

用VS2015编译sqlcipher的更多相关文章

  1. Win10编译SqlCipher步骤

    准备工作 Visual Studio 2015,其他版本未验证,估计问题不大 ActiveState ActivePerl,用于编译OpenSSL Mingw,在官网下载minimum install ...

  2. VS2015编译boost1.62

    VS2015编译boost1.62 Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一. Boost库由C++标准委员会库工作组成员发起,其中有些内容有 ...

  3. VS2015编译Qt5.7.0生成支持XP的静态库(很不错)

    一.编译工具 1.VS2015 编译Qt5.7.0的所需VS版本:Visual Studio 2013 (Update1)或Visual Studio 2015 (Update2).因为Update补 ...

  4. Win7 下用 VS2015 编译最新 openssl(1.0.2j)包含32、64位debug和release版本的dll、lib(8个版本)

    Win7 64位系统下通过VS2015编译好的最新的OpenSSL(1.0.2j)所有八个版本的链接库, 包含以下八个版本: 1.32位.debug版LIB: 2.32位.release版LIB: 3 ...

  5. 实践详细篇-Windows下使用VS2015编译的Caffe训练mnist数据集

    上一篇记录的是学习caffe前的环境准备以及如何创建好自己需要的caffe版本.这一篇记录的是如何使用编译好的caffe做训练mnist数据集,步骤编号延用上一篇 <实践详细篇-Windows下 ...

  6. Ubuntu下编译SqlCipher以及解密微信数据库EnMicroMsg.db过程和坑

    wget https://codeload.github.com/sqlcipher/sqlcipher/zip/v3.4.2 ./configure --enable-tempstore=yes C ...

  7. VS2015编译FFMPEG,修改FFmpeg缓冲区大小解决实时流解码丢包问题,FFmpeg错误rtsp流地址卡死的问题,设置超时

    之前尝试过很多网上利用Windows编译FFmpeg的文章,都没有办法编译X64位的FFmpeg,有些教程中有专门提到编译64位的FFmpeg需要下载mingw-w64-install,但是编译的过程 ...

  8. vs2015编译caffe

    有些时候,需要在python3的环境下import caffe,需要用vs2015在python3的环境下,编译pycaffe. microsoft的windows版本的caffe,依赖的库Nuget ...

  9. 使用VS2015编译xlslib库

    环境: win7_x64,VS2015 开始: 一.下载xlslib库 xlslib-package-2.5.0.zip 解压到一个指定目录,如E:\library\xlslib-package-2. ...

随机推荐

  1. [国嵌攻略][119][Linux中断处理程序设计]

    裸机中断: 1.中断统一入口. 2.注册中断处理程序. 3.根据中断源编号,调用中断处理程序. Linux中断 1.在entry-armv.S中的_irq_svc是中断统一入口. 2.获取产生中断源的 ...

  2. Linq 实例

    1.分页 ).Take(); 2.分组 1)一般分组 //根据顾客的国家分组,查询顾客数大于5的国家名和顾客数var 一般分组 = from c in ctx.Customers group c by ...

  3. curl说明

    https://baike.baidu.com/item/curl/10098606?fr=aladdin curl是利用URL语法在命令行方式下工作的开源文件传输工具.它被广泛应用在Unix.多种L ...

  4. oc 快排算法

    直接复制粘贴就可以用了 - (void)viewDidLoad { [super viewDidLoad]; NSMutableArray *M_arr = [[NSMutableArray allo ...

  5. Android-第一天

    1.google 2.application->application framework->libraries(调用关系) 3.strings.xml 是全局字符串的配置文件 4.ADT ...

  6. Java通配符解惑

    T  有类型 ?  未知类型 一.通配符的上界 既然知道List<Cat>并不是List<Anilmal>的子类型,那就需要去寻找替他解决的办法, 是AnimalTrianer ...

  7. UML图学习之三 状态图

    状态图(Statechart Diagram)主要用于描述一个对象在其生存期间的动态行为,表现为一个对象所经历的状态序列,引起状态转移的事件(Event),以及因状态转移而伴随的动作(Action). ...

  8. get最简单直接粗爆git与github教程

    Git是分布式版本控制系统(可以理解为文件管理拓展工具) github一个在线文件托管系统(可以理解为一个在线云盘) 准备工作,在git官网下载git软件件,安装git软件,以windows.为例,下 ...

  9. CentOS 7安装

    使用U盘安装 1.CentOS 7系统镜像制作U盘启动盘 1).下载CentOS 7系统镜像 下载地址:http://mirrors.aliyun.com/centos/7/isos/x86_64/ ...

  10. c#套料程序设计

    上的套料基本上都没有源码,开放的sdk都没有,这让很多想做套料,但是又成本太高了. 另外,大部分套料都是c++实现的,效率高,本人尝试用c#做一个套料程序,发现效率也不低,当然会比c++差点. 以下是 ...