SqlCipher的编译
编译前,先安装openssl和tcl.
(1)方法一
- sqlcipher的源代码在https://github.com/sqlcipher/sqlcipher。
- sqlcipher需要openssl库,根据windows平台下载32/64的openssl开发包。官方:https://wiki.openssl.org/index.php/Binaries,推荐到https://slproweb.com/products/Win32OpenSSL.html下载。
openssl以win32版本为例,安装Win32OpenSSL-1_1_1u.exe。 - sqlcipher编译需要先安装tcl。
- 使用VC的命令行,生成sqlite3.c文件:nmake /f Makefile.msc sqlite3.c
- 将libcrypto.lib libssl.lib拷贝到程序目睹d:\chane\sqlcipher1,进入VC的命令行,使用cl编译成dll库: cl
-ID:\Program\OpenSSL-Win32\include sqlite3.c -DSQLITE_API=__declspec(dllexport) -DSQLITE_TEMP_STORE=2 -DSQLITE_HAS_CODEC /MT -link -dll -out:sqlcipher.dll -LIBPATH:D:\Program\OpenSSL-Win32\lib libcrypto.lib libssl.lib
生成sqlcipher.dll和sqlcipher.lib,再拷贝sqlite3.h,即可使用。 - 除此之外可以参考https://github.com/sqlitebrowser/sqlitebrowser/wiki/Win64-setup-%E2%80%94-Compiling-SQLCipher的文档进行编译。
- 注意事项:
sqlcipher依赖于openssl,对于动态链接(依赖于openssl的dll文件)方式,编译sqlcipher的visual
studio版本不要求和编译openssl时使用的版本一样,但是对于静态链接openssl的方式,要求使用相同版本的编译器。
(2)方法二
- A)进入工程目录,打开 Makefile.msc 文件。
- B)将 -DSQLITE_TEMP_STORE 从 1 改为 2。 如下: TCC = $(TCC)
-DSQLITE_TEMP_STORE=2 RCC = $(RCC) -DSQLITE_TEMP_STORE=2 - C)然后在上面的下面添加:
TCC = $(TCC) -DSQLITE_HAS_CODEC
RCC = $(RCC) -DSQLITE_HAS_CODEC
TCC = $(TCC) -DSQLITE_ENABLE_FTS4
RCC = $(RCC) -DSQLITE_ENABLE_FTS4
TCC = $(TCC) -DSQLITE_ENABLE_JSON1
RCC = $(RCC) -DSQLITE_ENABLE_JSON1
TCC = $(TCC) -DSQLITE_ENABLE_FTS3
RCC = $(RCC) -DSQLITE_ENABLE_FTS3
TCC = $(TCC) -DSQLITE_ENABLE_FTS3_PARENTHESIS
RCC = $(RCC) -DSQLITE_ENABLE_FTS3_PARENTHESIS
TCC = $(TCC) -DSQLITE_ENABLE_FTS5
RCC = $(RCC) -DSQLITE_ENABLE_FTS5
TCC = $(TCC) -DNOCRYPT
RCC = $(RCC) -DNOCRYPT
TCC = $(TCC) -DSQLCIPHER_CRYPTO_OPENSSL
RCC = $(RCC) -DSQLCIPHER_CRYPTO_OPENSSL
- D)添加 h 文件搜索路径:
TCC = $(TCC) -IC:\Users\lma\Desktop\Sqlcipher\opemssl_install_1.1.1\include
RCC = $(RCC) -IC:\Users\lma\Desktop\Sqlcipher\opemssl_install_1.1.1\include - E)添加 link 文件路径:
LTLIBPATHS = $(LTLIBPATHS) /LIBPATH:C:\Users\lma\Desktop\Sqlcipher\opemssl_install_1.1.1\lib
LTLIBS = $(LTLIBS) libcrypto.lib libssl.lib - F)打开 VS 自带的本机编译工具,执行:
nmake /f Makefile.msc sqlite3.c 主要生成sqlite3.c、sqlite3.h、shell.c、sqlite3ext.h等
nmake /f Makefile.msc 生成sqlite3.exe、sqlite3.dll、sqlite3.lib、libsqlite3.lib等
sqlcipher的使用
- (1)注意事项
这三条必须添加:
#define SQLITE_HAS_CODEC 1 //这条不添加,sqlite3_key等函数找不到
#include “sqlite3.h” //自定义h文件必须用双引号,不能用<>
#pragma comment(lib, “sqlite3.lib”) //加载静态链接库 - (2)sqlcipher不能清空密码
网上说可以通过sqlite3_rekey(db,NULL,0)可以清空密码,这是错误的。通过查看源代码,当输入NULL或者0时,源代码不做任何操作而返回SQLITE_ERROR(就是1)。同时,不能对已存在的sqlite数据库进行加密。只能采取建立新的表,导入数据的方式来解决。方法有两种:
方法1:
A)先把数据导出:
$ sqlite3 ifood.sqlite
>.output ifood.sql
>.dump
B)创建一个新的加密的数据库:
$ sqlcipher ifood_lock.sqlite
sqlite> PRAGMA key = ‘112233’; # 设置密码
C)导入数据
>.read ifood.sql
方法2:
A)创建数据库:
sqlcipher-shell64.exe encrypted .db
PRAGMA key = 'password';
create table encrypted (id integer, name text);
.schema
CREATE TABLE encrypted (id integer, name text);
B)对已有数据库进行加密:
sqlcipher-shell64.exe universal.db
ATTACH DATABASE 'encrypted.db' AS encrypted KEY 'password';
SELECT sqlcipher_export('encrypted');
DETACH DATABASE encrypted;
C)修改密码:
sqlite> PRAGMA rekey = 'newPassword’;
D)打开加密的数据库:
sqlcipher-shell64.exe encrypted .db
PRAGMA key = 'password’;
.schema
- (3)编译版本要统一
编译sqlcipher.dll和sqlcipher.lib时用的openssl的x86或x64版本,要与在你编写的程序编译时采取的MSVC的x86或x64版本一致。而且,如果openssl用mingw编译,则你的c程序也用mingw编译;如果openssl用msvc编译,则你的c程序也用msvc编译。