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

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”,

修改:

TCC = $(TCC) -DSQLITE_TEMP_STORE=1

RCC = $(RCC) -DSQLITE_TEMP_STORE=1

为:

TCC = $(TCC) -DSQLITE_TEMP_STORE=2

RCC = $(RCC) -DSQLITE_TEMP_STORE=2

然后在这个下面添加:

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

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

TCC = $(TCC) -IC:\Program Files (x86)\OpenSSL-Win32\include

RCC = $(RCC) -IC:\Program Files (x86)\OpenSSL-Win32\include

LTLIBPATHS=$(LTLIBPATHS)/LIBPATH:C:\Program Files (x86)\OpenSSL-Win32\lib

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添加:

#ifndef SQLITE_HAS_CODEC

#define SQLITE_HAS_CODEC 1 //这条不添加,sqlite3_key等函数找不到

#endif

//包含openssl库

#pragma comment(lib,"libcrypto.lib")

#pragma comment(lib,"libssl.lib")

如下所示是项目文件构成

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

#ifndef SQLITE_HAS_CODEC

#define SQLITE_HAS_CODEC 1 //这条不添加,sqlite3_key等函数找不到

#endif

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

  1. 测试代码

ConsoleApplication2.cpp添加

#include "sqlite3.h"

#include <Windows.h>

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

sqlite3 * sqlite3_db_ = nullptr;

int re;

char dbPath[] = "G:\\VS_Project_Temp\\ConsoleApplication2\\ConsoleApplication2\\test.db";//这个路径自己改一下
DeleteFileA(dbPath);//删除已存在文件
//新数据库无密码测试
#if 1
re = sqlite3_open(dbPath, &sqlite3_db_);
re = sqlite3_exec(sqlite3_db_, "CREATE TABLE IF NOT EXISTS AAA (ID INTEGER,Data INTEGER);", 0, 0, 0);//返回SQLITE_NOTADB 26 表示密码不对,返回SQLITE_OK 0表示操作成功;
re = sqlite3_close(sqlite3_db_);
#endif



//测试数据库是否有密码
#if 1
re = sqlite3_open(dbPath, &sqlite3_db_);
re = sqlite3_key(sqlite3_db_, "1234", 4);//本来没有密码,但是这里输入了密码,所以也算密码错误;
re = sqlite3_exec(sqlite3_db_, "INSERT INTO AAA (ID,Data)VALUES(3,3);", 0, 0, 0);//(应该返回26)返回SQLITE_NOTADB 26 表示密码不对,返回SQLITE_OK 0表示操作成功;
re = sqlite3_close(sqlite3_db_);
#endif
DeleteFileA(dbPath);//删除已存在文件



//新数据库添加密码测试
#if 1
re = sqlite3_open(dbPath, &sqlite3_db_);
re = sqlite3_key(sqlite3_db_,"123",3);//设置密码
re = sqlite3_exec(sqlite3_db_, "CREATE TABLE IF NOT EXISTS AAA (ID INTEGER,Data INTEGER);",0,0,0);//(应该返回0)
re = sqlite3_close(sqlite3_db_);
#endif



//测试数据库是否有密码
#if 1
re = sqlite3_open(dbPath, &sqlite3_db_);
re = sqlite3_key(sqlite3_db_, "123", 3);//正确的密码
re = sqlite3_exec(sqlite3_db_, "INSERT INTO AAA (ID,Data)VALUES(3,3);", 0, 0, 0);//(应该返回0)返回SQLITE_NOTADB 26 表示密码不对,返回SQLITE_OK 0表示操作成功;
re = sqlite3_close(sqlite3_db_);
#endif



//修改密码测试
#if 1
re = sqlite3_open(dbPath, &sqlite3_db_);
re = sqlite3_key(sqlite3_db_, "123", 3);
re = sqlite3_rekey(sqlite3_db_, "1234", 4);
re = sqlite3_close(sqlite3_db_);
#endif





//测试数据库是否修改正确密码
#if 1
re = sqlite3_open(dbPath, &sqlite3_db_);
re = sqlite3_key(sqlite3_db_,"123",3);//错误的密码
re = sqlite3_exec(sqlite3_db_, "INSERT INTO AAA (ID,Data)VALUES(3,3);", 0, 0, 0);//(应该返回26)返回SQLITE_NOTADB 26 表示密码不对,返回SQLITE_OK 0表示操作成功;
re = sqlite3_close(sqlite3_db_);
#endif



//测试数据库是否修改正确密码
#if 1
re = sqlite3_open(dbPath, &sqlite3_db_);
re = sqlite3_key(sqlite3_db_, "1234", 4);//正确的密码
re = sqlite3_exec(sqlite3_db_, "INSERT INTO AAA (ID,Data)VALUES(3,3);", 0, 0, 0);//(应该返回0)返回SQLITE_NOTADB 26 表示密码不对,返回SQLITE_OK 0表示操作成功;
re = sqlite3_close(sqlite3_db_);
#endif
DeleteFileA(dbPath);//删除已存在文件

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Uniapp中使用SQLite3加密方式,需要进行以下步骤: 1. 准备工作:首先,确保你已经安装了SQLite3插件,可以使用uniCloud或者其他相关插件来进行安装。 2. 创建或打开数据库:在Uniapp中,你可以使用以下代码来创建或打开数据库: ```javascript const db = uniCloud.database(); const collection = db.collection('yourCollection'); let res = await uniCloud.database().createDatabase({ env: 'yourEnv', // 替换为你的环境ID query: `CREATE TABLE IF NOT EXISTS yourTable (id INT PRIMARY KEY NOT NULL, name TEXT NOT NULL, age INT NOT NULL);` }); ``` 3. 设置加密方式:为了使用SQLite3加密方式,你需要修改SQLite3配置。在代码中,你可以使用以下代码来设置加密方式: ```javascript const sqlite = require('sqlite3').verbose(); const db = new sqlite.Database(':memory:'); db.run("PRAGMA key = 'yourPassword'"); ``` 将“yourPassword”替换为你的加密密码。 4. 执行SQL操作:现在你可以使用SQLite3的加密方式来执行SQL操作。例如,你可以使用以下代码来插入数据: ```javascript db.serialize(function () { db.run("INSERT INTO yourTable (id, name, age) VALUES (?, ?, ?)", [1, 'John', 25]); }); ``` 这样就可以在加密数据库中插入一条数据。 通过上述步骤,你就可以在Uniapp中使用SQLite3和加密方式来操作数据库了。请注意,这只是一个简单的例子,实际应用中可能还需进行更多的配置和操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值