博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
wxsqlite3的加密模块单独编译
阅读量:4603 次
发布时间:2019-06-09

本文共 2293 字,大约阅读时间需要 7 分钟。

其实就是个编译过程,so easy,只是网上的方法各种,而且不是最新的,所以自己琢磨了。

1、从sqlite网站下载sqlite-amalgamation-xxx和sqlite-dll-win32-x86-xxx

2、从github下载wxsqlite3-xxx

3、使用vs创建win32 dll空项目

4、拷贝wxsqlite3-3.3.0\sqlite3\secure\src\下的所有h、c文件、def文件

5、添加sqlite3secure.c、sqlite3.h到工程

6、设置预处理定义: SQLITE_HAS_CODEC CODEC_TYPE=CODEC_TYPE_AES128 SQLITE_CORE SQLITE_SECURE_DELETE SQLITE_ENABLE_COLUMN_METADATA SQLITE_ENABLE_RTREE

编译静态库需要多添加:USE_DYNAMIC_SQLITE3_LOAD=0

7、编译动态库:在配置属性-->链接器-->输入-->模块定义文件 加入sqlite3.def

8、使用引入sqlite3.h和sqlite3userauth.h

如果需要使用最新的sqlite3,请用sqlite-amalgamation-xxx中的h和c文件替换工程对应的文件。

9、 使用注意:

首先打开数据库 sqlite3_open,然后在操作数据库之前执行 sqlite3_key 后就可进行数据库操作,否则会返回错误。

 sqlite3_key是输入密钥,如果数据库已加密必须先执行此函数并输入正确密钥才能进行操作,
 如果数据库没有加密,执行此函数后进行数据库操作反而会出现“此数据库已加密或不是一个数据库文件”的错误。
 sqlite3_rekey是变更密钥或给没有加密的数据库添加密钥或清空密钥,
 变更密钥或清空密钥前必须先正确执行 sqlite3_key。
 在正确执行 sqlite3_rekey 后在 sqlite3_close 关闭数据库之前可正常操作数据库,不需要再执行 sqlite3_key。

ps:sqlite3的新版可能存在不兼容wxsqlite3的情况,建议使用wxsqlite3自带版本,而且它的更新也很快的。

示例代码如下

1  1、对未加密的数据库加密: 2 #include "include\sqlite3.h" 3 #include "include\sqlite3userauth.h" 4  5     sqlite3_config(SQLITE_CONFIG_SINGLETHREAD); 6     sqlite3* db = nullptr; 7     char *errorMsg; 8     if(SQLITE_OK == sqlite3_open_v2("../test.db3", &db, SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_READWRITE, nullptr)) 9     {10         /* encrypt */11         if(SQLITE_OK != sqlite3_rekey(db, "qazwsx!123", 10))12         {13             std::string serr = "sqlite encrypt error:";14             serr += sqlite3_errmsg(db);15         }16     }17     else18     {19         std::string serr = "sqlite open error:";20         serr += sqlite3_errmsg(db);21     }22     sqlite3_close(db);

 

1 2、对加密后的数据库清除密码: 2 #include "include\sqlite3.h" 3 #include "include\sqlite3userauth.h" 4  5     sqlite3_config(SQLITE_CONFIG_SINGLETHREAD); 6     sqlite3* db = nullptr; 7     char *errorMsg; 8     if(SQLITE_OK == sqlite3_open_v2("../test.db3", &db, SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_READWRITE, nullptr)) 9     {    10         /* decrypt */11         sqlite3_key(db, "qazwsx!123", 10);12         13         /* clear password */14         sqlite3_rekey(db, nullptr, 0);15     }16     else17     {18         std::string serr = "sqlite open error:";19         serr += sqlite3_errmsg(db);20     }21     sqlite3_close(db);

 

转载于:https://www.cnblogs.com/superbi/p/5235442.html

你可能感兴趣的文章
webbug3.0菜鸟笔记1
查看>>
数组相关函数
查看>>
Python 和其他编程语言数据类型的比较
查看>>
T2695 桶哥的问题——送桶 题解
查看>>
HTML5 表单
查看>>
Android群英传》读书笔记 (3) 第六章 Android绘图机制与处理技巧 + 第七章 Android动画机制与使用技巧...
查看>>
关于微信公众平台测试号配置失败的问题
查看>>
【NOIP2001】统计单词个数
查看>>
linux常用端口
查看>>
异常处理
查看>>
/proc/uptime详解
查看>>
如何建立合适的索引?
查看>>
acwing 651. 逛画展
查看>>
(待完成)qbxt2019.05 总结12 - 趣味题目 鹰蛋
查看>>
[2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
查看>>
关于WPF程序只运行一个实例的方法
查看>>
图论:点分治
查看>>
mysql
查看>>
C/C++ 知识点---sizeof使用规则及陷阱分析(网摘)
查看>>
java小程序 示例
查看>>