Win7 下用 VS2015 编译 SqlCipher

准备工作

  • 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。

Win7 下用 VS2015 编译 SqlCipher_第1张图片

Win7 下用 VS2015 编译 SqlCipher_第2张图片

编译 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 的输出。

 

转载于:https://my.oschina.net/zhangboxyz/blog/1581533

你可能感兴趣的:(数据库,shell)