SQLite 3 開源版不帶加密功能,對於一個儲存在本地的資料庫來說沒有加密功能讓人難以接受,只要用記事本開啟資料庫就可以看到資料庫內儲存的資料,對安全多多少少有一點影響。有一個辦法是把內容加密後儲存到資料庫中,但遇到類似 like,或欄位內容與欄位內容比較這就不行了。治本的辦法是讓 SQLite 原生的支援加密。好在 SQLite 的作者預留了加密解密的相關介面,許多愛好者也自己修改源版添加加密功能。如果你也在關注,那你可能已經閱讀了大量關於如何添加加密的文章,同時我也不是很通相關的技術,我就不再講解如何修改源碼了。雖然網上有大量的文章教你如何修改源碼,但都沒有提供編譯後的 DLL 檔案,或者提供的 DLL 版本過低。這裡介紹一個開源項目:wxSQLite3,該項目是一個 SQLite 的 C++ warpper,它順帶將 SQLite 的加密函數實現了,並且它使用 AES 演算法進行加密。你可以在這裡下載到最新的包,在目錄 \sqlite3\secure 下有這幾個目錄,aes128 目錄下的 sqlite3.DLL 檔案,是已編譯的用128位 AES 演算法加密的 SQLite 3 DLL 檔案,而 aes 256 目錄下的是用256位 AES 演算法加密的,而 src 目錄下是實現加密的 SQLite 3 原始碼。同時 wxSQLite3 項目更新很快,你總是可以下載到較新的包。從1.9.8版本開始將對256位 AES 密碼編譯演算法進行實驗,估計不久的版本就可以穩定使用。
使用起來也很簡單,首先開啟資料庫 sqlite3_open,然後在操作資料庫之前執行 sqlite3_key 後就可進行資料庫操作,否則會返回錯誤。
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)。