SQLite 資料庫加密的一種解決方案

2021-08-30 14:26:12 字數 2453 閱讀 8381

sqlite是乙個非常小巧的跨平台嵌入式資料庫,它的資料庫以檔案的形式存放在本地磁碟上,但是在其開源的免費版中它卻缺少了乙個資料庫中幾乎是 必備的功能,那就是對於資料庫的加密。sqlite的資料庫檔案可以被任何的文字編輯工具開啟,從而獲取到其中的資料,這一點令很多開發者感到不安。 

但是其實sqlite是支援資料庫加密的,前些天看到了網友arris的帖子,具體如下:

sqlite 的源**中原本就考慮了加密的實現,並且保留了介面sqlite3_key和sqlite3_rekey,只是這兩個函式在free版本中沒有實現,但幸 運的是,sqlite的源**的**是開放並允許修改,我們可以很方便的增加加密的實現。在 /poparticle/3/216.html鏈結的的**包中就包含有可加密sqlite的源**的實現,我根據這個包編譯了乙個可加密的 sqlite。這個包加密實現呼叫了windows api 的加密函式,所以只能在windows中使用。

這個可加密的版本是在一 個ado.net 2.0 sqlite data provider的基礎上改過來的(/poparticle/3/216.html),據原作者聲稱效 率損失在千分之一以下。原始工程是基於vs2005的,但是考慮到其普及性還不是很廣,所以重新建立了乙個居於vc2003的工程。

其實sqlite的兩個加密函式使用起來非常的簡單,下面分情況說明:

① 給乙個未加密的資料庫新增密碼:如果想要新增密碼,則可以在開啟資料庫檔案之後,關閉資料庫檔案之前的任何時刻呼叫sqlite3_key函式即可,該函 數有三個引數,其中第乙個引數為資料庫物件,第二個引數是要設定的密碼,第三個是密碼的長度。例 如:sqlite3_key(db,"1q2w3e4r",8); //給資料庫設定密碼1q2w3e4r

② 讀取乙個加密資料庫中的資料:完成這個任務依然十分簡單,你只需要在開啟資料庫之後,再次呼叫一下sqlite3_key函式即可,例如,但資料庫密碼是123456時,你只需要在**中加入sqlite3_key(db,"123456",6);

① 更改資料庫密碼:首先你需要使用當前的密碼正確的開啟資料庫,之後你可以呼叫sqlite3_rekey(db,"112233",6) 來更改資料庫密碼。

② 刪除密碼:也就是把資料庫恢復到明文狀態。這時你仍然只需要呼叫sqlite3_rekey函式,並且把該函式的第二個引數置為null或者"",或者把第三個引數設為0。

加密後資料庫檔案顯示為亂碼:

為此我建立了乙個簡單的示例:

sqlite3 *db;

sqlite3_stmt *stat;

char *zerrmsg = 0;

char temp[256], fileroot[256];

char buffer2[1024]="0";

sprintf(temp, _t("%s"), _t("utf.db"));

ccodingconv::gb2312_2_utf8(fileroot, 256, temp, 0);

sqlite3_open(fileroot, &db);

if(db == null)

sqlite3_key(db,"1q2w3e4r",8);

sqlite3_exec(db, "create table list (fliename varchar(128) unique, fzip text);", 0, 0, &zerrmsg);

sqlite3_prepare(db, "insert into list values ('中文gb2312編碼',?);", -1, &stat, 0);

strcpy(temp, "測試資料utf-8的支援情況");

int len = (int)strlen(temp);

sqlite3_bind_text(stat, 1, temp, len, null);

sqlite3_step(stat);

sqlite3_prepare(db, "select * from list;", -1, &stat, 0);

sqlite3_step(stat);

const unsigned char * test = sqlite3_column_text(stat, 1);

int size = sqlite3_column_bytes(stat, 1);

printf("%s", test);

sqlite3_finalize(stat);

//sqlite3_rekey(db,"",0);

sqlite3_close(db); 

具體的源**如下:

sqlite3.3.7 加密版源**(vc2003 )

sqlite3.3.7 加密版源**(vc2005 )

SQLite 資料庫加密的一種解決方案

sqlite3 db sqlite3 stmt stat char zerrmsg 0 char temp 256 fileroot 256 char buffer2 1024 0 sprintf temp,t s t utf.db ccodingconv gb2312 2 utf8 fileroo...

SQLite 資料庫加密的一種解決方案

sqlite 是乙個非常小巧的跨平台嵌入式資料庫,它的資料庫以檔案的形式存放在本地磁碟上,但是在其開源的免費版中它卻缺少了乙個資料庫中幾乎是必備的功能,那就是對於資料庫的加密。sqlite 的資料庫檔案可以被任何的文字編輯工具開啟,從而獲取到其中的資料,這一點令很多開發者感到不安。但是其實 sqli...

sqlite資料庫加密

sqlite3加密支援 sqlite3免費版並不支援加密,不過留有介面,有不少開源的加密實現,不過有的需要使用openssl配置略顯繁瑣,不過使用wxsqlite比較方便。wxsqlite3 wxsqlite3是wxwidgets的擴充套件元件,對sqlite3的c api進行了封裝,並且實現了加解...