用VS2015编译sqlcipher
简介#
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的更多相关文章
- Win10编译SqlCipher步骤
准备工作 Visual Studio 2015,其他版本未验证,估计问题不大 ActiveState ActivePerl,用于编译OpenSSL Mingw,在官网下载minimum install ...
- VS2015编译boost1.62
VS2015编译boost1.62 Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一. Boost库由C++标准委员会库工作组成员发起,其中有些内容有 ...
- VS2015编译Qt5.7.0生成支持XP的静态库(很不错)
一.编译工具 1.VS2015 编译Qt5.7.0的所需VS版本:Visual Studio 2013 (Update1)或Visual Studio 2015 (Update2).因为Update补 ...
- 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 ...
- 实践详细篇-Windows下使用VS2015编译的Caffe训练mnist数据集
上一篇记录的是学习caffe前的环境准备以及如何创建好自己需要的caffe版本.这一篇记录的是如何使用编译好的caffe做训练mnist数据集,步骤编号延用上一篇 <实践详细篇-Windows下 ...
- Ubuntu下编译SqlCipher以及解密微信数据库EnMicroMsg.db过程和坑
wget https://codeload.github.com/sqlcipher/sqlcipher/zip/v3.4.2 ./configure --enable-tempstore=yes C ...
- VS2015编译FFMPEG,修改FFmpeg缓冲区大小解决实时流解码丢包问题,FFmpeg错误rtsp流地址卡死的问题,设置超时
之前尝试过很多网上利用Windows编译FFmpeg的文章,都没有办法编译X64位的FFmpeg,有些教程中有专门提到编译64位的FFmpeg需要下载mingw-w64-install,但是编译的过程 ...
- vs2015编译caffe
有些时候,需要在python3的环境下import caffe,需要用vs2015在python3的环境下,编译pycaffe. microsoft的windows版本的caffe,依赖的库Nuget ...
- 使用VS2015编译xlslib库
环境: win7_x64,VS2015 开始: 一.下载xlslib库 xlslib-package-2.5.0.zip 解压到一个指定目录,如E:\library\xlslib-package-2. ...
随机推荐
- ThinkPHP 下载、导入、导出功能的设计与实现
下载: 1.引入命名空间: use Org\Net\Http; 2.在入口文件中设置根目录: //定义根目录的绝对地址 define('ROOT',str_replace("\\" ...
- 免费V P N获取方式。
给需要加速器链接国外网站的朋友, 打开网址:http://miaoaff.com/reg.php?id=204250: 用一个邮箱注册,就会得到一个免费的vpn软件账号(包含300M流量时间永久): ...
- Unity LayerMask
Unity用int32的每一位表示32个层,int32用二进制有32位,Layers通常被摄像机用来渲染部分场景,和灯光照射部分场景使用.但是它们也可以用来做射线检测时忽略一些collder或Coll ...
- MLlib--FPGrowth算法
转载请标明出处http://www.cnblogs.com/haozhengfei/p/c9f211ee76528cffc4b6d741a55ac243.html FPGrowth算法_挖掘商品之间的 ...
- console.log()的作用是什么
主要是方便你调式javascript用的.你可以看到你在页面中输出的内容. 相比alert他的优点是: 他能看到结构话的东西,如果是alert,淡出一个对象就是[object object],但是co ...
- java实现定时任务
Java中实现定时任务执行某一业务.具体操作如下: 1.定义初始化任务 2.任务业务操作 3.定义初始化方法 4.在web.xml中注册启动 5.定义具体执行时间
- 把一个DIV放到另一个div右下角
父对象相对定位,子对象以父对象为参考点绝对定位:外层的div设置为相对定位,内层的div设置为绝对定位: <div id="box1"> <div id=&quo ...
- Spring切面优先级
项目中有两个切面,这两个切面都作用于同一个方法,哪个先执行哪个后执行呢,所以要定义一个切面的优先级 import java.util.Arrays; import org.aspectj.lang.J ...
- Django_xamdin安装与使用
有比Django更加强大的admin? xadmin? pip install xadmin 如何让xadmin生效? 新增两个注册app,xadmin,crispy_forms,通过run mana ...
- JDOJ-P1260 VIJOS-P1083 小白逛公园
首先,在这里给大家推荐一个网站,https://neooj.com:8082,这是我母校的网站 言归正传,题目描述 VIJOS-P1083 小白逛公园 Time Limit: 1 Sec Memor ...