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.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     else
18     {
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     else
17     {
18         std::string serr = "sqlite open error:";
19         serr += sqlite3_errmsg(db);
20     }
21     sqlite3_close(db);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM