编译和使用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);
}

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

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

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

设置完后,选择“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);
}

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

3、方法3

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

#include "sqlite3.h"
#include "sqlite3mc.h"
#include "sqlite3mc_version.h"
#include "sqlite3mc_vfs.h"

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”编译。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值