准备工作
- 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
- 将上一步生成的两个库文件 libeay32.dll 、 libeay32.lib 复制到 C:\SqlCipher 目录下
- 管理员权限运行 C:\mingw\msys\1.0\msys.bat 批处理文件,进入msys shell命令环境
- 利用命令切换到 SqlCipher 目录
-
cd /c/sqlcipher
运行以下命令进行配置(注意这是一行),不能复制粘贴,只能手输入:
-
./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"
执行命令
-
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 的输出。