当前位置:   article > 正文

SQLITE3添加加密功能SqlCipher的编译和使用_sqlite.exe打开加密的sqlite3

sqlite.exe打开加密的sqlite3

SQLITE3添加加密功能SqlCipher的编译和使用

作为懒人的我尽力写的详细了,如有错误之处还望大家指正。

懒人专用链接:(包含了所有环境和源码,以及编译好的源码)

https://download.csdn.net/download/qq_36626674/88357196

本文环境介绍:

Win32 OpenSSL v1.1.1、VS2013、ActiveTcl-8.6

一、环境搭建,安装openssl和tcl;

  1. openssl下载安装;

Openssl下载网站地址(这里是安装包):

https://slproweb.com/products/Win32OpenSSL.html

需要注意:请下载1.x的版本(原因:试了一下Win32 OpenSSL v3.0.10,编译完了发现sqlite3使用的是老版本接口,在3.0版本中已经废弃了),本文测试时使用版本为Win32 OpenSSL v1.1.1安装步骤就不说了吧,下一步,下一步就行了。

我当时的下载地址(使用迅雷下载吧,浏览器下载不动!)

https://slproweb.com/download/Win32OpenSSL-1_1_1v.exe

当然你也可以去官网下载源码自己编译,我没编译,所以只有自行百度了。

官网地址:https://www.openssl.org/source/

  1. Tcl下载;

官网地址:https://platform.activestate.com/

进入官网后,点击左上角“sign up”注册并登录,登录后点击到“project”界面,然后点击安装ActiveTcl-8.6(本文使用版本),如下图所示。

我当时的下载地址(使用迅雷下载吧,浏览器下载不动!):

https://camel-builds.s3.amazonaws.com/ActiveTcl/MSWin32-x64/20230607T174924Z/ActiveTcl-8.6.13.0000-MSWin32-x64-559160e0.msi?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAQ5FYQM547I2EFPRW%2F20230918%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20230918T085152Z&X-Amz-Expires=21600&X-Amz-SignedHeaders=host&X-Amz-Signature=8d3dbee28c33c0e380851005dd89ce4112048582f5fea3f64d3f30e8602195bb

  • SqlCipher源码下载、编译
  1. 下载源码

官网地址(当然了,我反正是进不去哈哈):

https://github.com/sqlcipher/sqlcipher

我是去这个地址下载的(本文使用版本为3.4.2):

sqlcipher: Mirror of https://github.com/sqlcipher/sqlcipher.git - Gitee.com

  1. 编译源码

下载好的源码解压后,进入源码目录,右键编辑“ Makefile.msc文件搜索“DSQLITE_TEMP_STORE”,

修改:

  1. TCC = $(TCC) -DSQLITE_TEMP_STORE=1
  2. RCC = $(RCC) -DSQLITE_TEMP_STORE=1

为:

  1. TCC = $(TCC) -DSQLITE_TEMP_STORE=2
  2. RCC = $(RCC) -DSQLITE_TEMP_STORE=2

然后在这个下面添加:

  1. TCC = $(TCC) -DSQLITE_HAS_CODEC
  2. RCC = $(RCC) -DSQLITE_HAS_CODEC
  3. TCC = $(TCC) -DSQLITE_ENABLE_FTS4
  4. RCC = $(RCC) -DSQLITE_ENABLE_FTS4
  5. TCC = $(TCC) -DSQLITE_ENABLE_JSON1
  6. RCC = $(RCC) -DSQLITE_ENABLE_JSON1
  7. TCC = $(TCC) -DSQLITE_ENABLE_FTS3
  8. RCC = $(RCC) -DSQLITE_ENABLE_FTS3
  9. TCC = $(TCC) -DSQLITE_ENABLE_FTS3_PARENTHESIS
  10. RCC = $(RCC) -DSQLITE_ENABLE_FTS3_PARENTHESIS
  11. TCC = $(TCC) -DSQLITE_ENABLE_FTS5
  12. RCC = $(RCC) -DSQLITE_ENABLE_FTS5
  13. TCC = $(TCC) -DNOCRYPT
  14. RCC = $(RCC) -DNOCRYPT
  15. TCC = $(TCC) -DSQLCIPHER_CRYPTO_OPENSSL
  16. RCC = $(RCC) -DSQLCIPHER_CRYPTO_OPENSSL

然后把openssl头文件和库文件路径包含进来,因为我的openssl安装在“C:\Program Files (x86)\OpenSSL-Win32”,所以我填写的是:

  1. TCC = $(TCC) -IC:\Program Files (x86)\OpenSSL-Win32\include
  2. RCC = $(RCC) -IC:\Program Files (x86)\OpenSSL-Win32\include
  3. LTLIBPATHS=$(LTLIBPATHS)/LIBPATH:C:\Program Files (x86)\OpenSSL-Win32\lib
  4. LTLIBS = $(LTLIBS) libcrypto.lib libssl.lib

打开vs的命令行工具“VS2013 开发人员命令提示”,因为我用的VS2013所以是这个,注意不要使用“VS2013 x86 本机工具命令提示”,后面这个可能编译不过。

切换到“ Makefile.msc文件所在目录,执行(使用源码的话就执行第一个生成sqlite3.c、sqlite3.h、sqlite3ext.h就行了):

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

到此生成完成了。

  • 测试是否可用

新建控制台程序,将sqlite3.c、sqlite3.h、sqlite3ext.h三个文件拷贝到控制台项目目录,然后添加这三个到项目中,

1、“项目属性->VC++目录->包含目录”添加openssl头文件路径:

C:\Program Files (x86)\OpenSSL-Win32\include

2、“项目属性->VC++目录->库目录”添加openssl库文件路径:

C:\Program Files (x86)\OpenSSL-Win32\lib

3、“项目属性->C/C++->预处理器”添加

_CRT_SECURE_NO_WARNINGS

4、“项目属性->C/C++->预编译头”选择不使用预编译头,因为sqlite.c是c语言的,没法使用预编译。

5、在sqlite3.h添加:

  1. #ifndef SQLITE_HAS_CODEC
  2. #define SQLITE_HAS_CODEC 1 //这条不添加,sqlite3_key等函数找不到
  3. #endif
  4. //包含openssl库
  5. #pragma comment(lib,"libcrypto.lib")
  6. #pragma comment(lib,"libssl.lib")

如下所示是项目文件构成

然后编译项目,好的大坑来了!!!几千个错误,什么未定义呀,什么的,然后根据内容添加了头文件,好了没有未定义了,提示什么winbase.h啥的文件内部有莫名错误,我人都蒙了,最后把sqlite3.c也加上了

  1. #ifndef SQLITE_HAS_CODEC
  2. #define SQLITE_HAS_CODEC 1 //这条不添加,sqlite3_key等函数找不到
  3. #endif

一下就好了,咱就说包含了sqlite3.h的不应该宏定义也会包含嘛!有懂得讲讲嘛,啥原理啊?

  1. 测试代码

ConsoleApplication2.cpp添加

  1. #include "sqlite3.h"
  2. #include <Windows.h>

然后main函数添加下面的测试代码:

  1. sqlite3 * sqlite3_db_ = nullptr;
  2. int re;
  3. char dbPath[] = "G:\\VS_Project_Temp\\ConsoleApplication2\\ConsoleApplication2\\test.db";//这个路径自己改一下
  4. DeleteFileA(dbPath);//删除已存在文件
  5. //新数据库无密码测试
  6. #if 1
  7. re = sqlite3_open(dbPath, &sqlite3_db_);
  8. re = sqlite3_exec(sqlite3_db_, "CREATE TABLE IF NOT EXISTS AAA (ID INTEGER,Data INTEGER);", 0, 0, 0);//返回SQLITE_NOTADB 26 表示密码不对,返回SQLITE_OK 0表示操作成功;
  9. re = sqlite3_close(sqlite3_db_);
  10. #endif
  11. //测试数据库是否有密码
  12. #if 1
  13. re = sqlite3_open(dbPath, &sqlite3_db_);
  14. re = sqlite3_key(sqlite3_db_, "1234", 4);//本来没有密码,但是这里输入了密码,所以也算密码错误;
  15. re = sqlite3_exec(sqlite3_db_, "INSERT INTO AAA (ID,Data)VALUES(3,3);", 0, 0, 0);//(应该返回26)返回SQLITE_NOTADB 26 表示密码不对,返回SQLITE_OK 0表示操作成功;
  16. re = sqlite3_close(sqlite3_db_);
  17. #endif
  18. DeleteFileA(dbPath);//删除已存在文件
  19. //新数据库添加密码测试
  20. #if 1
  21. re = sqlite3_open(dbPath, &sqlite3_db_);
  22. re = sqlite3_key(sqlite3_db_,"123",3);//设置密码
  23. re = sqlite3_exec(sqlite3_db_, "CREATE TABLE IF NOT EXISTS AAA (ID INTEGER,Data INTEGER);",0,0,0);//(应该返回0)
  24. re = sqlite3_close(sqlite3_db_);
  25. #endif
  26. //测试数据库是否有密码
  27. #if 1
  28. re = sqlite3_open(dbPath, &sqlite3_db_);
  29. re = sqlite3_key(sqlite3_db_, "123", 3);//正确的密码
  30. re = sqlite3_exec(sqlite3_db_, "INSERT INTO AAA (ID,Data)VALUES(3,3);", 0, 0, 0);//(应该返回0)返回SQLITE_NOTADB 26 表示密码不对,返回SQLITE_OK 0表示操作成功;
  31. re = sqlite3_close(sqlite3_db_);
  32. #endif
  33. //修改密码测试
  34. #if 1
  35. re = sqlite3_open(dbPath, &sqlite3_db_);
  36. re = sqlite3_key(sqlite3_db_, "123", 3);
  37. re = sqlite3_rekey(sqlite3_db_, "1234", 4);
  38. re = sqlite3_close(sqlite3_db_);
  39. #endif
  40. //测试数据库是否修改正确密码
  41. #if 1
  42. re = sqlite3_open(dbPath, &sqlite3_db_);
  43. re = sqlite3_key(sqlite3_db_,"123",3);//错误的密码
  44. re = sqlite3_exec(sqlite3_db_, "INSERT INTO AAA (ID,Data)VALUES(3,3);", 0, 0, 0);//(应该返回26)返回SQLITE_NOTADB 26 表示密码不对,返回SQLITE_OK 0表示操作成功;
  45. re = sqlite3_close(sqlite3_db_);
  46. #endif
  47. //测试数据库是否修改正确密码
  48. #if 1
  49. re = sqlite3_open(dbPath, &sqlite3_db_);
  50. re = sqlite3_key(sqlite3_db_, "1234", 4);//正确的密码
  51. re = sqlite3_exec(sqlite3_db_, "INSERT INTO AAA (ID,Data)VALUES(3,3);", 0, 0, 0);//(应该返回0)返回SQLITE_NOTADB 26 表示密码不对,返回SQLITE_OK 0表示操作成功;
  52. re = sqlite3_close(sqlite3_db_);
  53. #endif
  54. DeleteFileA(dbPath);//删除已存在文件

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/492341
推荐阅读
相关标签
  

闽ICP备14008679号