当前位置:   article > 正文

编译和使用SQLite3MultipleCiphers

sqlite3multipleciphers

编译和使用SQLite3MultipleCiphers

1、方法1

  • 从https://github.com/utelle/SQLite3MultipleCiphers下载SQLite3MultipleCiphers1.6.3,然后解压缩。
    用VS 2022打开\build\sqlite3mc_vc17.sln编译生成sqlite3mc_x64.lib,位置\bin\vc17\lib\debug或者release目录下。
  • 用VS2022新建一个空的c++控制台应用,把sqlite3mc_x64.lib、sqlite3.h、sqlite3mc.h、sqlie3mc_version.h、sqlite3mc_vfs.h复制与源代码同一目录,main.cpp内容如下:
#include <cstdio>
#include "sqlite3.h"
#include "sqlite3mc.h"
#include "sqlite3mc_version.h"
#include "sqlite3mc_vfs.h"
#pragma comment(lib,"sqlite3mc_x64.lib")
int main() {
	sqlite3* db;	
	sqlite3_open("test.db", &db);
	sqlite3_key(db, "111111", 6);
	sqlite3_exec(db, "create table person (id int, name vchar(50))", NULL, NULL, NULL);
	int i = sqlite3_exec(db, "insert into person (id,name) values (234,'quit')", NULL, NULL, NULL);
	printf("i=%d", i);
	sqlite3_close(db);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

运行该exe,就会生成一个加密的sqlite3数据库文件。
如果需要删除db文件的密码,先用sqlite3_key验证密码,再用函数sqlite3_rekey。

sqlite3_open("test.db", &db);
sqlite3_key(db, "111111", 6);
sqlite3_rekey(db, NULL, 0);
  • 1
  • 2
  • 3

2、方法2

  • 用VS2022新建一个空的c++静态库,名称为sqlite163lib,把sqlite3mc_amalgamation.c和sqlite3mc_amalgamation.h复制到源码目录sqlite163lib。
  • 选择“配置”为“debug”,“平台”为“x64”,做如下设置:
    • 项目属性 ->配置属性->C/C++ ->预编译头 ->预编译头,设置为:不适用预编译头
    • 项目属性 ->配置属性->C/C++ ->与编译器 ->预编译器定义,按照如下设置:
_WINDOWS
WIN32
_CRT_SECURE_NO_WARNINGS
_CRT_SECURE_NO_DEPRECATE
_CRT_NONSTDC_NO_WARNINGS
_CRT_NONSTDC_NO_DEPRECATE
CODEC_TYPE=CODEC_TYPE_CHACHA20
SQLITE_ENABLE_DEBUG=0
SQLITE_THREADSAFE=1
SQLITE_DQS=0
SQLITE_MAX_ATTACHED=10
SQLITE_ENABLE_EXPLAIN_COMMENTS=1
SQLITE_SOUNDEX=1
SQLITE_ENABLE_COLUMN_METADATA=1
SQLITE_SECURE_DELETE=1
SQLITE_ENABLE_DESERIALIZE=1
SQLITE_ENABLE_FTS3=1
SQLITE_ENABLE_FTS3_PARENTHESIS=1
SQLITE_ENABLE_FTS4=1
SQLITE_ENABLE_FTS5=1
SQLITE_ENABLE_RTREE=1
SQLITE_ENABLE_GEOPOLY=1
SQLITE_ENABLE_PREUPDATE_HOOK=1
SQLITE_ENABLE_SESSION=1
SQLITE_CORE=1
SQLITE_ENABLE_EXTFUNC=1
SQLITE_ENABLE_MATH_FUNCTIONS=1
SQLITE_ENABLE_CSV=1
SQLITE_ENABLE_VSV=1
SQLITE_ENABLE_CARRAY=1
SQLITE_ENABLE_UUID=1
SQLITE_TEMP_STORE=2
SQLITE_USE_URI=1
SQLITE_USER_AUTHENTICATION=1
SQLITE_ENABLE_DBPAGE_VTAB=1
SQLITE_ENABLE_DBSTAT_VTAB=1
SQLITE_ENABLE_STMTVTAB=1
SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION=1
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38

设置完后,选择“debug”和“x64”即可成功。

  • 用VS2022新建一个空的c++控制台应用,名称为sqlite163libtest,把x64/debug目录下的sqlite163lib.lib以及sqlite3mc_amalgamation.h复制到源码目录sqlite163libtest。将sqlite163libtest.cpp替换为:
#include <cstdio>
#include "sqlite3mc_amalgamation.h"
#pragma comment(lib,"sqlite163lib.lib")
int main() {
	sqlite3* db;
	sqlite3_open("test.db", &db);
	sqlite3_key(db, "111111", 6);
	sqlite3_exec(db, "create table person (id int, name vchar(50))", NULL, NULL, NULL);
	int i = sqlite3_exec(db, "insert into person (id,name) values (22,'quit')", NULL, NULL, NULL);
	printf("i=%d", i);
	sqlite3_close(db);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

选择“debug”和“x64”生成即可成功。

3、方法3

与方法2类似,只是采用SQLite3MultipleCiphers-1.6.3\src目录下的源代码,设置和编译过程一样。
调用的时候,采用如下:

#include "sqlite3.h"
#include "sqlite3mc.h"
#include "sqlite3mc_version.h"
#include "sqlite3mc_vfs.h"
  • 1
  • 2
  • 3
  • 4

4、特别说明

1)如何加密

  • 如果是新创建的数据库,则使用sqlite3_key(db, “112233”, 6)和sqlite3_rekey(db, “112233”, 6)均可以成功为数据库加密。
  • 如果是已存在且未曾加密过的数据库,则使用sqlite3_rekey(db, “112233”, 6)可以成功加密,而sqlite3_key(db, “112233”, 6)的返回值为0,但不能加密成功。
  • 如果数据库成功加密,需要取消加密,则使用sqlite3_rekey(db, NULL, 0)。使用sqlite3_rekey(db, NULL, 0)取消密码后,如果想再次加密,需要使用sqlite3_rekey(db, “112233”, 6),而sqlite3_key(db, “112233”, 6)不能加密成功,虽然它的返回值为0。
  • 对于已加密成功的数据库,先使用sqlite3_key(db, “112233”, 6),才可以访问数据。

2)出现链接错误信息时,可以尝试调整设置

  • 项目属性 ->配置属性->C/C++ ->优化 ->全程序优化,设置为“否”
  • 项目属性 ->配置属性->C/C++ ->代码生成 ->运行库,设置为“多线程调试(/MTd)”
  • 静态库的编译配置要和调用程序的配置一致,也就是如果静态库采用“debug”和“x64”编译,则调用程序也采用“debug”和“x64”编译。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/492439
推荐阅读
相关标签
  

闽ICP备14008679号