zoukankan      html  css  js  c++  java
  • wxsqlite3的加密模块单独编译

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

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

    2、从github下载wxsqlite3-xxx

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

    4、拷贝wxsqlite3-3.3.0sqlite3securesrc下的所有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 "includesqlite3.h"
     3 #include "includesqlite3userauth.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     else
    18     {
    19         std::string serr = "sqlite open error:";
    20         serr += sqlite3_errmsg(db);
    21     }
    22     sqlite3_close(db);
     1 2、对加密后的数据库清除密码:
     2 #include "includesqlite3.h"
     3 #include "includesqlite3userauth.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     else
    17     {
    18         std::string serr = "sqlite open error:";
    19         serr += sqlite3_errmsg(db);
    20     }
    21     sqlite3_close(db);
  • 相关阅读:
    BZOJ3509: [CodeChef] COUNTARI
    BZOJ3790: 神奇项链
    BZOJ3527: [Zjoi2014]力
    BZOJ2194: 快速傅立叶之二
    解题:BJOI 2006 狼抓兔子
    解题:SDOI 2017 数字表格
    解题:TJOI 2015 弦论
    解题:NOI 2016 优秀的拆分
    解题:AHOI2017/HNOI2017 礼物
    解题:洛谷2093 JZPFAR
  • 原文地址:https://www.cnblogs.com/superbi/p/5235442.html
Copyright © 2011-2022 走看看