其實就是個編譯過程,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);