1. 程式人生 > >ARX專案中新增開源資料庫SQLite3 的加密開源庫wxsqlite3

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
/////////