ARX專案中新增開源資料庫SQLite3 的加密開源庫wxsqlite3
RX新增wxsqlite3加密資料庫,
下載 https://sourceforge.net/projects/wxcode/files/Components/wxSQLite3/
複製這11個檔案到你出cpp目錄
新增 sqlite3secure.c 這一個到當前專案列表,如果加了其他的可能會有錯誤
右鍵這個.c檔案,選屬性,選擇所有配置,所有平臺,取消使用預編譯頭
選擇專案屬性,新增預處理
SQLITE_HAS_CODEC=1
CODEC_TYPE=CODEC_TYPE_AES128
SQLITE_CORE
THREADSAFE
SQLITE_SECURE_DELETE
SQLITE_SOUNDEX
SQLITE_ENABLE_COLUMN_METADATA
新增需要呼叫資料庫的cpp中新增包含標頭檔案,用extren "C" 方式
下面是測試函式
// 回撥函式 static int sql_callBack(void *notused, int argc, char **argv, char **szColName) { int i = 0; for (i = 0; i < argc; i++) { CStringA str; //str.Format( "%s = %s\n",Utf8ToAnsi(szColName[i]) ,Utf8ToAnsi(argv[i])); str.Format( "%s = %s\n",szColName[i] ,argv[i]); CString str2; str2=str; AfxMessageBox(str2); } return 0; } // - sk_ArxTestCode20181228.MySql command (do not rename) static void sk_ArxTestCode20181228MySql(void) { // Add your code for command sk_ArxTestCode20181228.MySql here const char *sSQL1 = "create table users(name PRIMARY KEY, age int, score int);"; //const char *sSQL2 = GBKToUTF8("insert into users values('中xxxxx文', 26, 100);"); const char *sSQL2 = "insert into users values('中xxxx文', 26, 100);"; const char *sSQL3 = "insert into users values('cainiao', 5, 1);"; const char *sSQL4 = "select * from users;"; sqlite3 *pDb = NULL; char *pErrMsg = NULL; const char* szPassword="33554"; sqlite3_open("taoge.db", &pDb); // 開啟資料庫 sqlite3_key( pDb,szPassword,strlen(szPassword)); // 設定密碼 sqlite3_rekey(pDb,NULL,NULL);//清除密碼 //const char* szNewPassword = "33554"; //sqlite3_rekey(pDb,szNewPassword,strlen(szNewPassword));//重設密碼,必須先執行sqlite3_key正確開啟資料庫 sqlite3_exec( pDb, sSQL1, NULL, NULL, &pErrMsg); // 建立基本資訊格式 sqlite3_exec( pDb, sSQL2, NULL, NULL, &pErrMsg); // 增加資訊 sqlite3_exec( pDb, sSQL3, NULL, NULL, &pErrMsg); // 增加資訊 sqlite3_exec( pDb, sSQL4, sql_callBack, 0, &pErrMsg); // 查詢資料庫 sqlite3_close(pDb); }
演示的是設定和清除密碼。
如果不設定密碼,通過記事本,都可以看到資料庫的內容。
當設定密碼後,儲存的資料庫看到的是亂碼。
附:https://github.com/utelle/wxsqlite3/tree/master/sqlite3secure/src 這裡的原始碼寫的是更高版本(4.4.1),相同的方式可以實現載入,只不過檔案的數量要多了些,至少是這些檔案才能完成編譯。
相關連結
https://www.sqlite.org/download.html
http://wxcode.sourceforge.net/components/wxsqlite3/
https://github.com/utelle/wxsqlite3/tree/master/sqlite3secure/src
參考資料
https://bbs.csdn.net/topics/380018685
一、用開源的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
檔案加入到工程即可;
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
/////////