简介#

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. UEP-confirm和alert弹窗

    function stuDel(){ var ds = ajaxgrid.getCheckedRecords(); if(ds.length==0){ $.alert("提示信息" ...

  2. for语句,你真正搞懂了吗?

    今天看书时,无意间看到了这个知识点,啥知识点?也许在各位大神看来,那是再简单不过的东西了. 说来惭愧.原来直到今天我才真正搞懂for语句. for语句的结构如下所示: for(语句A;语句B;语句C) ...

  3. C#面试常见题目

    1.CTS.CLS.CLR分别作何解释 CTS:Common Type System 通用系统类型.Int32.Int16→int.String→string.Boolean→bool CLS:Com ...

  4. debian 9 双显卡安装NVIDIA显卡驱动

    最近用debian,给debian装n卡驱动折腾了好几天了,主要还是网络不好,官方wiki的方法下载经常卡死..摸索了几天感觉已经摸到了头绪,决定写下来供大家参考参考 先提供单显卡NVIDIA驱动的安 ...

  5. spring定时任务执行两次 项目重复初始化 项目启动两次

    tomcat/config/server.xml中Host标签Context节点的问题 项目里quartz定时器总是被执行2次,通过打印发现原来项目被加载了两次,所以项目下的Listener被重复加载 ...

  6. DESTOON B2B标签(tag)调用手册

    路径:include/tag.func.php 1.标签格式的大致说明 {tag("moduleid=9&table=article_9&length=40&cond ...

  7. 第一章 用HTML5中的结构元素构建网站

    1.当一个容器需要直接定义样式或通过脚本定义行为时,推荐使用div元素而非section元素. 2.section是需要标题的,而nav或aside没有标题也是可以的. 3.html5轮廓工具 htt ...

  8. 解析MYsql explain执行计划extra列输出

    EXPLAIN Extra 列信息: explain Extra列输出包含了关于mysql如何解决query的额外信息,特别是出现Using filesort 和 using temporary时,应 ...

  9. PreparedStatement和Statement区别

    在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement 一.代码的可读性和可维护性. 虽 ...

  10. LED服务总结

    简单的程序总结 一个简单的用于控制LED屏幕的小程序,用到的一个常识 LED服务开发总结 系统运行截图   系统功能说明: 1.ServerStrack服务,提供前台访问. 2.动态库调用,用于信息转 ...