SQLite是一個非常小巧的跨平臺嵌入式數(shù)據(jù)庫,它的數(shù)據(jù)庫以文件的形式存放在本地磁盤上,但是在其開源的免費(fèi)版中它卻缺少了一個數(shù)據(jù)庫中幾乎是必備的功能,那就是對于數(shù)據(jù)庫的加密。SQLite的數(shù)據(jù)庫文件可以被任何的文本編輯工具打開,從而獲取到其中的數(shù)據(jù),這一點(diǎn)令很多開發(fā)者感到不安。

但是其實(shí)SQLite是支持?jǐn)?shù)據(jù)庫加密的,前些天看到了網(wǎng)友a(bǔ)rris的帖子,具體如下:
sqlite的源代碼中原本就考慮了加密的實(shí)現(xiàn),并且保留了接口sqlite3_key和sqlite3_rekey,只是這兩個函數(shù)在free版本中沒有實(shí)現(xiàn),但幸運(yùn)的是,sqlite的源代碼的代碼是開放并允許修改,我們可以很方便的增加加密的實(shí)現(xiàn)。在http://www.sqlite.com.cn/POParticle/3/216.Html鏈接的的代碼包中就包含有可加密sqlite的源代碼的實(shí)現(xiàn),我根據(jù)這個包編譯了一個可加密的sqlite。這個包加密實(shí)現(xiàn)調(diào)用了windows API 的加密函數(shù),所以只能在windows中使用。
這個可加密的版本是在一個ADO.NET 2.0 SQLite Data Provider的基礎(chǔ)上改過來的(http://www.sqlite.com.cn/POParticle/3/216.Html),據(jù)原作者聲稱效率損失在千分之一以下。原始工程是基于VS2005的,但是考慮到其普及性還不是很廣,所以重新建立了一個居于VC2003的工程。
其實(shí)SQLite的兩個加密函數(shù)使用起來非常的簡單,下面分情況說明:
① 給一個未加密的數(shù)據(jù)庫添加密碼:如果想要添加密碼,則可以在打開數(shù)據(jù)庫文件之后,關(guān)閉數(shù)據(jù)庫文件之前的任何時刻調(diào)用sqlite3_key函數(shù)即可,該函數(shù)有三個參數(shù),其中第一個參數(shù)為數(shù)據(jù)庫對象,第二個參數(shù)是要設(shè)定的密碼,第三個是密碼的長度。例如:sqlite3_key(db,"1q2w3e4r",8); //給數(shù)據(jù)庫設(shè)定密碼1q2w3e4r
② 讀取一個加密數(shù)據(jù)庫中的數(shù)據(jù):完成這個任務(wù)依然十分簡單,你只需要在打開數(shù)據(jù)庫之后,再次調(diào)用一下sqlite3_key函數(shù)即可,例如,但數(shù)據(jù)庫密碼是123456時,你只需要在代碼中加入sqlite3_key(db,"123456",6);
① 更改數(shù)據(jù)庫密碼:首先你需要使用當(dāng)前的密碼正確的打開數(shù)據(jù)庫,之后你可以調(diào)用sqlite3_rekey(db,"112233",6) 來更改數(shù)據(jù)庫密碼。
② 刪除密碼:也就是把數(shù)據(jù)庫恢復(fù)到明文狀態(tài)。這時你仍然只需要調(diào)用sqlite3_rekey函數(shù),并且把該函數(shù)的第二個參數(shù)置為NULL或者"",或者把第三個參數(shù)設(shè)為0。
加密后數(shù)據(jù)庫文件顯示為亂碼:
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)
{
return -1;
}
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, "測試數(shù)據(jù)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);
具體的源代碼如下:
SQLite
SQLite
例子1,例子2
新聞熱點(diǎn)
疑難解答
圖片精選