wxsqlite3的加密模塊單獨編譯

轉自:http://www.javashuo.com/article/p-vzwmjcvk-bp.htmlhtml

wxSqlite3官網:http://wxcode.sourceforge.net/components/wxsqlite3 
github網址:https://github.com/utelle/wxsqlite3
git

 

 

其實就是個編譯過程,so easy,只是網上的方法各類,並且不是最新的,因此本身琢磨了。github

一、從sqlite網站下載sqlite-amalgamation-xxx和sqlite-dll-win32-x86-xxxsql

二、從github下載wxsqlite3-xxx數據庫

三、使用vs建立win32 dll空項目xcode

四、拷貝wxsqlite3-3.3.0\sqlite3\secure\src\下的全部h、c文件、def文件函數

五、添加sqlite3secure.c、sqlite3.h到工程網站

六、設置預處理定義: SQLITE_HAS_CODEC CODEC_TYPE=CODEC_TYPE_AES128 SQLITE_CORE SQLITE_SECURE_DELETE SQLITE_ENABLE_COLUMN_METADATA SQLITE_ENABLE_RTREE加密

編譯靜態庫須要多添加:USE_DYNAMIC_SQLITE3_LOAD=0spa

七、編譯動態庫:在配置屬性-->連接器-->輸入-->模塊定義文件 加入sqlite3.def

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

若是須要使用最新的sqlite3,請用sqlite-amalgamation-xxx中的h和c文件替換工程對應的文件。

九、 使用注意:

首先打開數據庫 sqlite3_open,而後在操做數據庫以前執行 sqlite3_key 後就可進行數據庫操做,不然會返回錯誤。
 sqlite3_key是輸入密鑰,若是數據庫已加密必須先執行此函數並輸入正確密鑰才能進行操做,
 若是數據庫沒有加密,執行此函數後進行數據庫操做反而會出現「此數據庫已加密或不是一個數據庫文件」的錯誤。
 sqlite3_rekey是變動密鑰或給沒有加密的數據庫添加密鑰或清空密鑰,
 變動密鑰或清空密鑰前必須先正確執行 sqlite3_key。
 在正確執行 sqlite3_rekey 後在 sqlite3_close 關閉數據庫以前可正常操做數據庫,不須要再執行 sqlite3_key。

ps:sqlite3的新版可能存在不兼容wxsqlite3的狀況,建議使用wxsqlite3自帶版本,並且它的更新也很快的。

示例代碼以下

1、對未加密的數據庫加密:
#include "include\sqlite3.h"
#include "include\sqlite3userauth.h"

    sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);
    sqlite3* db = nullptr;
    char *errorMsg;
    if(SQLITE_OK == sqlite3_open_v2("../test.db3", &db, SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_READWRITE, nullptr))
    {
        /* encrypt */
        if(SQLITE_OK != sqlite3_rekey(db, "qazwsx!123", 10))
        {
            std::string serr = "sqlite encrypt error:";
            serr += sqlite3_errmsg(db);
        }
    }
    else
    {
        std::string serr = "sqlite open error:";
        serr += sqlite3_errmsg(db);
    }
    sqlite3_close(db);
2、對加密後的數據庫清除密碼:
#include "include\sqlite3.h"
#include "include\sqlite3userauth.h"

    sqlite3_config(SQLITE_CONFIG_SINGLETHREAD);
    sqlite3* db = nullptr;
    char *errorMsg;
    if(SQLITE_OK == sqlite3_open_v2("../test.db3", &db, SQLITE_OPEN_EXCLUSIVE | SQLITE_OPEN_READWRITE, nullptr))
    {    
        /* decrypt */
        sqlite3_key(db, "qazwsx!123", 10);
        
        /* clear password */
        sqlite3_rekey(db, nullptr, 0);
    }
    else
    {
        std::string serr = "sqlite open error:";
        serr += sqlite3_errmsg(db);
    }
    sqlite3_close(db);
相關文章
相關標籤/搜索