当前位置:   article > 正文

SqlCipher的编译和使用

sqlcipher

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
  • 1
  • 2
  • 3

B)创建一个新的加密的数据库:

$ sqlcipher ifood_lock.sqlite
sqlite> PRAGMA key =112233; # 设置密码
  • 1
  • 2

C)导入数据

>.read ifood.sql
  • 1

方法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);
  • 1
  • 2
  • 3
  • 4
  • 5

B)对已有数据库进行加密:

 sqlcipher-shell64.exe  universal.db
 ATTACH DATABASE 'encrypted.db' AS encrypted KEY 'password';
 SELECT sqlcipher_export('encrypted');
 DETACH DATABASE encrypted;
  • 1
  • 2
  • 3
  • 4

C)修改密码:

sqlite> PRAGMA rekey = 'newPassword’;
  • 1

D)打开加密的数据库:

sqlcipher-shell64.exe encrypted .db
PRAGMA key = 'password’;
.schema
  • 1
  • 2
  • 3
  • (3)编译版本要统一
    编译sqlcipher.dll和sqlcipher.lib时用的openssl的x86或x64版本,要与在你编写的程序编译时采取的MSVC的x86或x64版本一致。而且,如果openssl用mingw编译,则你的c程序也用mingw编译;如果openssl用msvc编译,则你的c程序也用msvc编译。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/492343
推荐阅读
相关标签
  

闽ICP备14008679号