天天看點

SQLite加密技術

http://www.cnblogs.com/sunsoft/archive/2011/04/07/2008816.html

SQLite 3 開源版不帶加密功能,對于一個儲存在本地的資料庫來說沒有加密功能讓人難以接受,隻要用記事本打開資料庫就可以看到資料庫内儲存的資料,對安全多多少少有一點影響。有一個辦法是把内容加密後儲存到資料庫中,但遇到類似 like,或字段内容與字段内容比較這就不行了。治本的辦法是讓 SQLite 原生的支援加密。好在 SQLite 的作者預留了加密解密的相關接口,許多愛好者也自己修改源版添加加密功能。如果你也在關注,那你可能已經閱讀了大量關于如何添加加密的文章,同時我也不是很通相關的技術,我就不再講解如何修改源碼了。雖然網上有大量的文章教你如何修改源碼,但都沒有提供編譯後的 DLL 檔案,或者提供的 DLL 版本過低。這裡介紹一個開源項目:wxSQLite3,該項目是一個 SQLite 的 C++ warpper,它順帶将 SQLite 的加密函數實作了,并且它使用 AES 算法進行加密。你可以在http://sourceforge.net/projects/wxcode/files/Components/下載下傳到最新的包,在目錄 \sqlite3\secure 下你可以找到一個 sqlite3.dll 檔案,這個就是已編譯的帶加密的 SQLite 3 DLL 檔案,而且 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)。

http://www.cppblog.com/niewenlong/archive/2007/06/01/25263.html

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

SQLite加密技術

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

sqlite的源代碼中原本就考慮了加密的實作,并且保留了接口sqlite3_key和sqlite3_rekey,隻是這兩個函數在free版本中沒有實作,但幸運的是,sqlite的源代碼的代碼是開放并允許修改,我們可以很友善的增加加密的實作。在http://www.sqlite.com.cn/POParticle/3/216.Html連結的的代碼包中就包含有可加密sqlite的源代碼的實作,我根據這個包編譯了一個可加密的sqlite。這個包加密實作調用了windows API 的加密函數,是以隻能在windows中使用。

這個可加密的版本是在一個ADO.NET 2.0 SQLite Data Provider的基礎上改過來的(http://www.sqlite.com.cn/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。

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

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(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, "測試資料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)

System.Data.SQLite 是一個原始SQLite的加強版.  它将是一個原版的sqlite3.dll完全替代品 (你甚至就可以把它重命名為sqlite3.dll).  它不需要連結.NET 運作時,是以可以脫離.NET獨立釋出, 然而它内嵌了一個完整的 ADO.NET 2.0 引擎,為開發提供了完整的支援.

以下是它的特性簡介:

完整的 ADO.NET 2.0 實作

整個工程完全基于VS2005 和 ADO.NET 2.0全新建構, 使用了全部的ADO.NET framework新特性.  包括完整的 DbProviderFactory 支援, 自動的分布式事務調用, 廣泛的模式支援,此外所有的類都是從 ADO.NET 2.0 的基類繼承下來的.

支援完整和精簡的 .NET Framework 以及 C/C++

這個庫不需要連結依賴.NET運作時,100%相容原始的sqlite3.dll,可以使用非托管的C/C++進行開發.

可移植的資料庫檔案

未加密的 SQLite 資料庫檔案可以自由的跨平台和處理器使用,包括非Windows平台. 加密之後的資料庫可以在全部Windows平台上使用.

可以信賴的速度,比包括Sql Server Mobile 在内的其它大多數嵌入式資料庫都要快速

SQLite'安裝所占用的空間相對于Sql Mobile可謂忽略不計了. 它在運作的時候占用更少的記憶體,同時生成的資料庫也更小.

資料庫加密

可以對整個資料庫檔案進行加密.  支援二進制和明文的密碼.

支援使用Visual Studio 2005 設計

你可以向Server Explorer添加一個SQLite 連接配接, 使用查詢設計器建立處查詢語句, 向一個資料集中拖拽一個表格等等! SQLite的開發者可以在包括體驗版在内的各種Visual Studio 2005下工作.

單檔案再釋出包容量在400kb以下

将SQLite本身和ADO.NET 封裝捆綁編譯在一起.  預編譯的二進制檔案提供了 x86, IA64, x64 和ARM 的版本.

廣泛的SQL語言支援

SQLite 支援大部分的SQL92 标準(see below).  支援命名和未命名的參數以 UTF-8和UTF-16 編碼通過優化的管道傳入SQLite 核心.

使用者自定義的函數 和 排序

全面支援使用者自定義函數和排序方式,意味着你可以用自己喜歡的.NET語言來實作SQLite沒有提供的特性.  這一切将非常的簡單.

提供了全部的源代碼.  100% 免費.

全部的封裝庫源代碼都是公有的.  無論是個人還是商業應用都沒有任何的協定限制.

下載下傳源代碼和二進制包

http://www.sqlite.com.cn/Upfiles/source/SQLite-1.0.31.0.rar