用VS2015编译sqlcipher

本文介绍如何为SQLite数据库添加数据加密功能,通过SQLCipher实现256位AES加密,并提供了一个简单的示例程序说明如何使用加密后的SQLite数据库。

简介

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-风格的开源许可下发布,但是官方提供的二进制库需要购买。
引用官方的一张图,加密前和加密后的对比效果:
137454-20160527085247084-1742371595.png

摘自百度百科

下载信息

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");
    }
}

转载于:https://www.cnblogs.com/sanghg/p/5533397.html

<think>好的,我现在需要帮助用户在Windows环境下使用Visual Studio 2019编译SQLCipher。首先,我得回忆一下之前接触过的相关信息和用户提供的引用内容。用户提到了引用[1]和[2],其中引用[2]是一个博客,讲述了在Windows7下用VS2019编译64位SQLCipher的经历,修改了Makefile.msc后成功。这可能是一个关键点。 首先,我需要确定SQLCipher编译流程。SQLCipher是基于SQLite的加密扩展,通常编译过程可能涉及到获取源码、配置编译环境、修改必要的构建文件,然后进行编译。用户想用VS2019,所以可能需要使用nmake或者VS的项目文件。 根据引用[1]提到的SQLCipher for Visual Studio项目,可能已经有现成的VS解决方案文件,但用户可能想自己编译最新版本或者特定版本。而引用[2]提到修改Makefile.msc,这个文件是SQLite的Microsoft编译器的Makefile,所以可能需要使用nmake来编译,同时应用SQLCipher的补丁。 接下来,我应该分步骤考虑: 1. 下载SQLCipher源码,可能需要从官方仓库克隆或下载。 2. 确保系统安装了必要的工具,比如Visual Studio 2019,可能还需要安装Windows SDK和可能的ActiveState Perl(因为SQLite的编译脚本有时需要Perl)。 3. 修改Makefile.msc以适配SQLCipher的配置,比如添加加密相关的编译选项,比如定义SQLITE_HAS_CODEC,并链接加密库如OpenSSL。 4. 设置环境变量,启动VS的开发人员命令提示符,运行nmake命令进行编译。 另外,用户可能需要先编译OpenSSL,因为SQLCipher依赖它来提供加密功能。或者,如果使用其他加密库,也需要相应配置。这里可能需要指导用户如何编译或获取预编译的OpenSSL库。 可能的难点在于正确配置Makefile.msc,包括包含路径、库路径、预处理器定义等。例如,在Makefile.msc中,添加SQLITE_TEMP_STORE=2,SQLITE_HAS_CODEC,以及指定加密库的头文件和库文件的位置。 此外,用户可能在编译过程中遇到错误,比如链接错误,找不到符号,这可能是因为没有正确链接加密库或者某些编译选项不正确。需要确保所有依赖项都正确配置,并且在Makefile.msc中正确指定。 还需要注意目标平台是x86还是x64,因为VS2019需要选择对应的命令提示符环境。用户提到编译64位,所以需要使用x64 Native Tools Command Prompt for VS2019。 总结步骤可能如下: 1. 安装必要工具(VS2019,Perl,OpenSSL)。 2. 获取SQLCipher源码。 3. 修改Makefile.msc,设置必要的编译选项和库路径。 4. 打开VS2019的x64命令提示符,运行nmake命令。 5. 测试生成的sqlite3.dll或exe是否正常工作。 需要参考引用[2]中的修改方法,可能包括在Makefile.msc中添加DEFINES和LIBS参数,指定加密库的位置。例如,添加-DSQLITE_HAS_CODEC,-DSQLITE_TEMP_STORE=2,以及链接libcrypto.lib等。 另外,可能需要注意SQLCipher的版本与SQLite版本的对应关系,确保兼容性。例如,用户提到的SQLite 3.8.0.2和SQLCipher 3.0.1,但可能需要使用更新的版本,因此需要确认最新的兼容版本或官方推荐的组合。 最后,生成的问题需要围绕编译过程中可能遇到的常见问题、依赖库的配置、不同版本的兼容性以及如何验证编译后的库是否正确加密数据库等。</think>### 逐步解答:使用VS2019编译SQLCipher #### 步骤1:准备编译环境 1. **安装Visual Studio 2019** 确保已安装“使用C++的桌面开发”组件,并勾选“MSVC v142”和“Windows 10 SDK”[^2]。 2. **安装ActivePerl** SQLite的编译脚本依赖Perl环境,需安装[ActivePerl](https://www.activestate.com/products/perl/)。 3. **获取OpenSSL预编译库** SQLCipher依赖OpenSSL的加密功能。可从[OpenSSL官方仓库](https://slproweb.com/products/Win32OpenSSL.html)下载预编译的**64位**版本(如`Win64 OpenSSL v1.1.1x`),并记录安装路径(如`C:\OpenSSL-Win64`)。 --- #### 步骤2:获取SQLCipher源码 1. **克隆源码仓库** 从官方仓库克隆SQLCipher源码(以最新版为例): ```bash git clone https://github.com/sqlcipher/sqlcipher.git cd sqlcipher ``` --- #### 步骤3:修改编译配置 1. **编辑`Makefile.msc`** 使用文本编辑器打开`Makefile.msc`,进行以下修改: - **添加预处理器定义**: 在`DEFINES`部分追加: ```makefile DEFINES = $(DEFINES) -DSQLITE_HAS_CODEC -DSQLITE_TEMP_STORE=2 ``` - **指定OpenSSL路径**: 在文件开头添加路径定义: ```makefile OPENSSL_PATH = C:\OpenSSL-Win64 INCL = $(INCL) -I"$(OPENSSL_PATH)\include" LIBS = $(LIBS) "$(OPENSSL_PATH)\lib\libcrypto.lib" ``` --- #### 步骤4:执行编译 1. **启动VS2019命令提示符** 打开**x64 Native Tools Command Prompt for VS 2019**。 2. **生成预处理文件** 执行以下命令生成`sqlite3.c`: ```bash nmake /f Makefile.msc sqlite3.c ``` 3. **编译完整库** 运行编译命令: ```bash nmake /f Makefile.msc ``` 成功后会生成`sqlite3.dll`、`sqlite3.lib`和`sqlite3.exe`。 --- #### 步骤5:验证加密功能 1. **测试数据库加密** 使用生成的`sqlite3.exe`创建加密数据库: ```bash .\sqlite3 encrypted.db # 在SQLite命令行中执行: PRAGMA key='your-secret-key'; CREATE TABLE test(id INTEGER); .quit ``` 若未报错且文件无法用普通工具打开,则说明编译成功[^1]。 --- ### 常见问题解决 - **错误:未找到`libcrypto.lib`** 检查`OPENSSL_PATH`是否指向正确的64位库路径,并确认安装的是**开发版**(包含`lib`和`include`目录)。 - **链接错误:符号未定义** 确保`DEFINES`中添加了`-DSQLITE_HAS_CODEC`,并正确链接了OpenSSL库。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值