Win7 下用 VS2015 编译 SqlCipher


声明:本文转载自https://my.oschina.net/zhangboxyz/blog/1581533,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

准备工作

  • Visual Studio 2015
  • ActiveState ActivePerl,编译 OpenSSL 使用
  • MinGW,编译 SqlCipher 使用
  • OpenSSL-1.0.2m,从官网下载
  • SqlCipher,从 github 获取

安装 VS2015

    过程略。

安装 ActivePerl

    过程略。

安装 MinGW

网址: http://sourceforge.net/projects/mingw/files/

下载 Download mingw-get-setup.exe

安装 MinGW 是一个多步骤的过程。首先下载并安装包管理器/安装程序,然后使用它来安装编译器和 msys 。

安装完安装程序后,运行它并在基本窗格下安装msys base,developer-tools,mingw32-base , gcc-g ++ 和 mingw32-tcl。

编译 OpenSSL(32位)

cd C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin vcvars32.bat perl Configure VC-WIN32 no-asm --prefix="C:\openssl-1.0.2m\win32-release" ms\do_nasm nmake -f ms\nt.mak nmake -f ms\nt.mak test nmake -f ms\nt.mak install nmake -f ms\ntdll.mak nmake -f ms\ntdll.mak test nmake -f ms\ntdll.mak install nmake -f ms\ntdll.mak clean

目录 C:\openssl-1.0.2m\win32-release 下生成了两个库文件:

  • 动态库文件 libeay32.dll(位于./bin目录下)
  • 静态库文件 libeay32.lib (位于./lib目录下)

编译 SqlCipher

  1. 将上一步生成的两个库文件 libeay32.dll 、 libeay32.lib 复制到 C:\SqlCipher 目录下
  2. 管理员权限运行 C:\mingw\msys\1.0\msys.bat 批处理文件,进入msys shell命令环境
  3. 利用命令切换到 SqlCipher 目录
  4. cd /c/sqlcipher 

    运行以下命令进行配置(注意这是一行),不能复制粘贴,只能手输入:

  5. ./configure --with-crypto-lib=none --disable-tcl CFLAGS="-DSQLITE_HAS_CODEC -DSQLCIPHER_CRYPTO_OPENSSL -I/C/openssl-1.0.2m/win32-release/include /C/sqlcipher/libeay32.dll -L/C/sqlcipher/ -static-libgcc" LDFLAGS="-leay32"

    执行命令

  6. make clean make sqlite3.cpp ## 生成可执行文件sqlcipher.exe make ## 生成库文件sqlite3.dll make dll

    生成 sqlite3.dll 和 sqlite3.def

    • 打开 32 位 Visual Studio 命令提示符
    • cd c:\sqlcipher
    • lib /def:sqlite3.def

测试 SqlCipher

现在应该有一个功能齐全的 sqlcipher.exe 可执行文件和 dll 文件。

打开一个正常的命令(cmd.exe)提示符,导航到sqlcipher构建目录:

sqlcipher.exe test.db sqlite>PRAGMA key = 'password'; sqlite>create table testtable (id int, name varchar(20)); sqlite>insert into testtable (id,name) values (0,'alice'), (1,'bob'), (2,'charlie'); sqlite>select * from testtable 0:alice 1:bob 2:charlie sqlite>.exit

现在我们有一个数据库,其中有一些值,让我们退出并尝试访问它没有密码。

sqlcipher.exe test.db sqlite>select * from testtable Error: file is encrypted or not a database sqlite>.exit

再次输入密码。

sqlcipher.exe test.db sqlite>PRAGMA key = 'password'; sqlite>select * from testtable 0:alice 1:bob 2:charlie sqlite>.exit

如果看起来工作正常,现在可以在十六进制编辑器中打开文件test.db,并验证它没有可辨别的结构。

如果您想要进行一些对比验证,请在没有PRAGMA密钥语句的情况下对新的数据库文件重复上述实验。它将使未加密的数据库,您将能够轻松地看到清晰的结构和原始数据。

 

VS2015 下测试 SqlCipher

创建一个名为 SQLCipherTest 的 win32 控制台应用程序(关闭预编译头文件)

复制五个文件:sqlite3.exp,sqlite3.lib,sqlite3.def,sqlite3.dll和sqlite3.h到您的visual studio项目的源目录。

回到Visual Studio并在解决方案资源管理器中添加一个现有的头文件并选择sqlite3.h

打开项目属性 - >配置属性 - >连接器 - >输入 - >其他依赖项,并添加sqlite3.lib

在你的主源文件中输入如下的c程序:

#include "stdafx.h" #include "sqlite3.h"  static int callback(void *NotUsed, int argc, char **argv, char **azColName) {    int i;    for (i = 0; i < argc; i++) { //loop over results        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");    }    printf("\n");    return 0; }  int main() {    sqlite3 *db;    if (sqlite3_open("name_and_path_for_db", &db) == SQLITE_OK) {       printf("DB file is open\n");       if (sqlite3_exec(db, (const char*)"PRAGMA key ='password'", NULL, NULL, NULL) == SQLITE_OK){          printf("Accepted Key\n");       };       if (sqlite3_exec(db, (const char*)"CREATE TABLE testtable (id int, name varchar(20));", NULL, NULL, NULL) == SQLITE_OK) {          printf("Created Table\n");       };       if (sqlite3_exec(db, (const char*)"INSERT INTO testtable (id,name) values (0,'alice'), (1,'bob'), (2,'charlie');", NULL, NULL, NULL) == SQLITE_OK) {          printf("Gave it some data\n");       };       if (sqlite3_exec(db, (const char*)"SELECT * FROM testtable;", callback, NULL, NULL) == SQLITE_OK) {          printf("Sent Select\n");       };    }    sqlite3_close(db);    return 0; }

在调试器中运行它,你会看到select state的输出。

  • 注释掉 CREATE TABLE 和 INSERT INTO 两个 if 语句块并再次运行它,您应该再次看到 select 语句的输出。
  • 将 password 改为不同的东西,你不应该看到 SELECT 的输出。

 

本文发表于2017年11月29日 16:33
(c)注:本文转载自https://my.oschina.net/zhangboxyz/blog/1581533,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2671 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1