sqlite3加密編譯

廢話不多說,直接貼出方法,目的在於請路過老鳥幫助測試一下功能是否全面,是否真正實現了加密(反正我用記事本打開生成的DB文件看不到寫入記錄的明文了)。


一、用開源的wxsqlite3(我用的版本是3.2.1.3)
1、到SQLite官網http://www.sqlite.org/下載sqlite-amalgamation-XXXXXX.zip(我下的版本是3.78)

,它已經包含了所有的源文件,也不需要另外的輔助工具了,解壓到某一目錄,如Sqlite3。
2、在VS2010裏新建一個空工程,把所有文件放入工程內;
3、到http://wxcode.sourceforge.net/components/wxsqlite3下載wxsqlite3,然後把sqlite3secure.c

請注意如下設置:
只把sqlite3secure.c文件加入到工程即可(其它文件是拷貝到工程目錄下,但不用加入項目中),我的工程目錄下的文件是這幾個:
codec.c;codec.h;rijndael.c;rijndael.h;codecext.c;shell.c;sqlite3.c;sqlite3.h;sqlite3secure.c
4、在配置屬性中設置配置類型爲靜態庫(.Lib),添加預處理:
SQLITE_HAS_CODEC=1
CODEC_TYPE=CODEC_TYPE_AES128
SQLITE_CORE
THREADSAFE
SQLITE_SECURE_DELETE
SQLITE_SOUNDEX
SQLITE_ENABLE_COLUMN_METADATA
5、編譯生成Lib文件。編譯時如提示未找到某某文件,則從wxsqlite3的sqlite3\secure\src\codec-c目錄內拷貝相關文件至你的工程目錄下再編譯即可,具體要拷貝的文件有:

codec.c;codec.h;rijndael.c;rijndael.h;codecext.c

 

二、SQLite3的加密函數說明
sqlite3_key是輸入密鑰,如果數據庫已加密必須先執行此函數並輸入正確密鑰才能進行操作,如果數據

庫沒有加密,執行此函數後進行數據庫操作反而會出現“此數據庫已加密或不是一個數據庫文件”的錯

誤。
int sqlite3_key( sqlite3 *db, const void *pKey, int nKey),db 是指定數據庫,pKey 是密鑰,

nKey 是密鑰長度。例:sqlite3_key( db, "abc", 3);
sqlite3_rekey是變更密鑰或給沒有加密的數據庫添加密鑰或清空密鑰,變更密鑰或清空密鑰前必須先正

確執行 sqlite3_key。在正確執行 sqlite3_rekey 之後在 sqlite3_close 關閉數據庫之前可以正常操

作數據庫,不需要再執行 sqlite3_key。
int sqlite3_rekey( sqlite3 *db, const void *pKey, int nKey),參數同上。
清空密鑰爲 sqlite3_rekey( db, NULL, 0)。
其實SQLite的兩個加密函數使用起來非常的簡單,下面分情況說明:
1、 給一個未加密的數據庫添加密碼:如果想要添加密碼,則可以在打開數據庫文件之後,關閉數據庫

文件之前的任何時刻調用sqlite3_key函數即可,該函數有三個參數,其中第一個參數爲數據庫對象,第

二個參數是要設定的密碼,第三個是密碼的長度。例如:sqlite3_key(db,"1q2w3e4r",8);        //給

數據庫設定密碼1q2w3e4r

注:如果數據庫沒有加密,執行此函數後進行數據庫操作反而會出現“此數據庫已加密或不是一個數據

庫文件”的錯誤?經測試,只能在新建數據庫時設置密碼!
2、 讀取一個加密數據庫中的數據:完成這個任務依然十分簡單,你只需要在打開數據庫之後,再次調

用一下sqlite3_key函數即可,例如,但數據庫密碼是123456時,你只需要在代碼中加入sqlite3_key

(db,"123456",6);
3、 更改數據庫密碼:首先你需要使用當前的密碼正確的打開數據庫,之後你可以調用sqlite3_rekey

(db,"112233",6) 來更改數據庫密碼。

4、刪除密碼:也就是把數據庫恢復到明文狀態。這時你仍然只需要調用sqlite3_rekey函數,並且把該

函數的第二個參數置爲NULL或者"",或者把第三個參數設爲0。

三、使用SQLITE3數據庫在stdafx.h文件中加入的代碼
#define SQLITE_HAS_CODEC 1
extern "C"
{
#include "sqlite3/sqlite3.h"
};
#ifdef _DEBUG
#pragma comment(lib, "sqlite3/Sqlite3EncryptionD.lib")
#else
#pragma comment(lib, "sqlite3/Sqlite3Encryption.lib")
#endif

/////////

 

原帖出處http://bbs.csdn.net/topics/380018685

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章