SQLite嵌入式數(shù)據(jù)庫如何加密

SQLite作為一個(gè)開源的嵌入武數(shù)據(jù)庫,具有系統(tǒng)開銷小、檢索效率高等特性。但由于受到空間限制和性能要求,需要更為簡(jiǎn)潔的加密方法來實(shí)現(xiàn)對(duì)數(shù)據(jù)的安全保障。

一、SQLite嵌入式數(shù)據(jù)庫的簡(jiǎn)介

1、SQLite的產(chǎn)生和發(fā)展

SQLite是2000年開發(fā)出來的用一個(gè)小型C庫實(shí)現(xiàn)的一種強(qiáng)有力的嵌入式關(guān)系數(shù)據(jù)庫管理體制。它提供了對(duì)SQL92的大多數(shù)支持:支持多表和索引、事務(wù)、視圖、觸發(fā)和一系列的用戶接口及驅(qū)動(dòng),適用于任何操作系統(tǒng)d在2006年10月9日SQLite已經(jīng)發(fā)行了版本3.3.8,增加了全文搜索的功能。

2、SQLite的特點(diǎn)

SQLite實(shí)現(xiàn)了完備的、可嵌入的、零配置的SQL數(shù)據(jù)庫引擎。它的特點(diǎn)包括:

(1)事務(wù)處理是原子的、一致的、獨(dú)立的和持久的(ACID),即使在系統(tǒng)崩潰和掉電以后。

(2)零配置,即不需要設(shè)置和管理。

(3)實(shí)現(xiàn)了絕大部分的SQL92標(biāo)準(zhǔn)。

(4)一個(gè)單獨(dú)的磁盤文件存儲(chǔ)一個(gè)完整的數(shù)據(jù)庫。

(5)數(shù)據(jù)庫文件在機(jī)器之間可自由共享q

(6)支持?jǐn)?shù)據(jù)庫文件大小至2TB。

(7)字符串和BLOG的大小只受限于可用存儲(chǔ)器容量。

(8)代碼量小i即小于30K的C代碼行和小于250K的代碼空間(gcc在1486上)。

(9)對(duì)于絕大多數(shù)普通操作來說,比流行的C/S模式的數(shù)據(jù)庫引擎運(yùn)行速度快。

(10) API簡(jiǎn)單、易用。

可以看出,基于以上特點(diǎn),SQLite非常適合應(yīng)用于嵌入式開發(fā)。,SQLite的版權(quán)允許無任何限制的應(yīng)用,包括商業(yè)性的產(chǎn)品。

3、SQLite的體系結(jié)構(gòu)

SQLite體系結(jié)構(gòu)如圖1所示。主要由以下幾個(gè)主要的子系統(tǒng)組成:接口(Interface)是一個(gè)G語言庫,從接口接收到命令后傳到編譯器,編譯器是由三個(gè)獨(dú)立的步驟組成:標(biāo)志處理器(To-kenizer)、分析器(Parser)、代碼生成器(Code Generator)。

SQLite嵌入式數(shù)據(jù)庫如何加密

虛擬機(jī)( Virtual Machine)是為操作數(shù)據(jù)庫文件而執(zhí)行的一個(gè)抽象的計(jì)算機(jī)引擎。在虛擬機(jī)和低層存儲(chǔ)、恢復(fù)程序之間,SQLite使用了一個(gè)抽象層執(zhí)行B-樹,頁面緩沖(Pager),和操作 系統(tǒng)接口(OS Interface),最后是一個(gè)存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)庫。

二、SQLite的加密方法分析

SQLite是一款輕型的數(shù)據(jù)庫,它的設(shè)計(jì)目標(biāo)是嵌入式的,而且目前已經(jīng)在很多嵌入式產(chǎn)品中使用了它學(xué)由于SQLite具有其他的優(yōu)勢(shì),還廣泛應(yīng)用在非嵌入式領(lǐng)域。例如PHP5開始不再默認(rèn)支持Mysql,而是默認(rèn)支持SQLite。

SQLite在廣泛應(yīng)用的同時(shí);對(duì)于數(shù)據(jù)庫的安全也要提供足夠的保障。SQLite在Windows中使用了巧妙而且有效的加密方法來保障數(shù)據(jù)的安全性。

1、加密原理

在對(duì)Windows API進(jìn)行熟悉以后可以知道使用Microsoft提供的加密應(yīng)用程序接口(即Cryptography API),或稱CryptoAPI,可以方便地在應(yīng)用程序中加入強(qiáng)大的加密功能,而不必考慮基本的算法。SQLite就是使用這個(gè)技巧,在Windows下為數(shù)據(jù)庫提供了安全保障。

CryptoAPI本質(zhì)上是一組函數(shù),這些函數(shù)為程序員提供一個(gè)訪問加密算法的接口鼠這個(gè)接口經(jīng)過操作系統(tǒng),最終由底層的CSP實(shí)現(xiàn)。CSP( CryptographicServiceProviders),即加密服務(wù)提供者(模塊),是實(shí)現(xiàn)真正的加密服務(wù)的獨(dú)立的模塊。

Microsoft通過捆綁RSABaseProvider在操作系統(tǒng)級(jí)提供一個(gè)CSP,即RSA公司的公鑰加密算法:根據(jù)需要,更多的CSP可以增加到應(yīng)用中?,F(xiàn)在國(guó)內(nèi)已有一些公司提供兼容Cryp-toAPI的硬件設(shè)備,如全典網(wǎng)絡(luò)(iSecureX. com)的UKey300型USB接口的電子鑰匙,iSecureX CSP工具箱,都得到了微軟的數(shù)字簽名。

應(yīng)用CryptoAPI,可以通過簡(jiǎn)單的函數(shù)調(diào)用來加密數(shù)據(jù),交換公鑰,計(jì)算一個(gè)消息的摘要以及生成數(shù)字簽名等等。它還提供高級(jí)的管理操作,如從一組可能的CSP中選用一個(gè)CSPp;此外,CryptoAPI還為許多高級(jí)安全性服務(wù)提供了基礎(chǔ),包括用于電子商務(wù)的SET、用于加密客戶機(jī)服務(wù)器消息的PCT、用于在各個(gè)平臺(tái)之間來回傳遞機(jī)密數(shù)據(jù)和密鑰的PFX、數(shù)字簽名等等。

CryptoAPI的體系結(jié)構(gòu)如圖2所示。

SQLite嵌入式數(shù)據(jù)庫如何加密

目前支持CryptoAPI的Windows系統(tǒng)有:Windows 95 0SR2、Windows NT SP3及后續(xù)版本、Windows 98、Windows 2000等。

2、加密實(shí)現(xiàn)

在分析SQLite的源碼和接口以后,我們發(fā)現(xiàn)SQLite有sqlite3_key和sqlite3_rekey的接口。由于SQLite開放源碼,所以可以對(duì)其進(jìn)行修改,這樣利用CryptoAPI可以很方便地實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的加密。

下面分別對(duì)數(shù)據(jù)庫的加密過程實(shí)現(xiàn)進(jìn)行描述:

(1)首先打開數(shù)據(jù)庫Q使用函數(shù)sqlite3 _open( FileRoot,&db)打開數(shù)據(jù)庫,將信息返回到db中,db是sqlite3的類。

(2)對(duì)數(shù)據(jù)庫進(jìn)行加密q使用函數(shù)intsqlite3_key(sqlite3*db,const void*pKey,int nKey)實(shí)現(xiàn)。*db指向要加密的數(shù)據(jù)庫,*pKey指向加密的密碼,是個(gè)字符串,nKey是密碼的長(zhǎng)度。

(3)在完成加密后關(guān)閉數(shù)據(jù)庫。使用sqlite3_close(db)函數(shù)來實(shí)現(xiàn)。

以上是對(duì)一個(gè)全新的SQLite數(shù)據(jù)庫進(jìn)行加密的過程。在使用數(shù)據(jù)庫時(shí)牽涉到其他方面的操作,參照表1可以知道操作的相應(yīng)步驟。

SQLite嵌入式數(shù)據(jù)庫如何加密

為了說明,從實(shí)現(xiàn)的加密工程中取了一段代碼說明問題:

sqlite3*db; ∥定義數(shù)據(jù)庫db

char*zErrMsg=0;

char FileRoot[256];

sqlite3_open( FileRoot, &ab);//打開數(shù)據(jù)庫

if( db==NULL)//判斷是不是打開成功

{

retum -1;

}

sqlite3_key( db ,"la2b3c4d",8);//執(zhí)行加密

sqlite3_exec( db, "CREATE TABLE person( ID varchar( 18) UNIQUE,name varchar(20));",0.0,&zErrMsg);秒執(zhí)行建表操作

sqlite3_prepare( db, tlinsert into list values( '310101 198401250000';'leo');”,-1.&stat ,0);//執(zhí)行插入操作

//sqlite3_rekey( db,””,0);//更改密碼操作

sqlite3_close( db);//刪除密碼操作

雖然只是一個(gè)sqlite3_key函數(shù)完成了加密的操作,但對(duì)于加密的過程,值得進(jìn)行深入的研究。如圖3所示,利用逐步挖掘的圖來演示,加密算法的實(shí)現(xiàn)嵌套了多層函數(shù)。

SQLite嵌入式數(shù)據(jù)庫如何加密

3、安全性分析

由于CryptoAPI已經(jīng)廣泛地應(yīng)用于Windows平臺(tái)上的各種加密服務(wù),例如利用CryptoAPI實(shí)現(xiàn)的電子簽名業(yè)務(wù)、網(wǎng)絡(luò)信息加密等。在使用嵌入式數(shù)據(jù)庫SQLite的場(chǎng)合,Cry ptoAPI提供的加密程度已經(jīng)滿足使用需要a、這是由CryptoAPI提供的完善的加密機(jī)制實(shí)現(xiàn)的。

CryptoAPI提供的加密體制是RSA公司的公鑰加密算法爭(zhēng)RSA公鑰加密算法是由Ron Rivest,Adi Shamir和LeonardAdle-man于1977年發(fā)明的一種運(yùn)算法則,它是一個(gè)網(wǎng)絡(luò)加密和提供認(rèn)證的系統(tǒng)。從提出到現(xiàn)在已近二十年,經(jīng)歷了各種攻擊的考驗(yàn),逐漸為人們接受,被普遍認(rèn)為是目前最優(yōu)秀的公鑰方案之。RSA的安全性依賴于大數(shù)的因子分解,但并沒有從理論上證明破譯RSA的難度與大數(shù)分解難度等價(jià)。即RSA的重大缺陷是無法從理論上把握它的保密性能如何,而且密碼學(xué)界多數(shù)人士?jī)A向于因子分解不是NPC問題。

三、SQLite和Access的安全性比較

由于嵌入式數(shù)據(jù)庫SQLite在WEB中的應(yīng)用與Access數(shù)據(jù)庫功能相似,所以在這里將Web開發(fā)中使用SQLite的安全性同Access相比較來證明SQLite在使用中的安全性。

實(shí)驗(yàn)環(huán)境:Windows XP,IE6.0,網(wǎng)速lOmbps。

實(shí)驗(yàn)內(nèi)容:比較網(wǎng)站中SQIAte數(shù)據(jù)庫與Access數(shù)據(jù)庫的安全性。

實(shí)驗(yàn)結(jié)果參見表2(時(shí)間單位為秒)。

SQLite嵌入式數(shù)據(jù)庫如何加密

SQLite在Web開發(fā)中的安全性比常用的Access要可靠,當(dāng)然和大型DBMS例如Oracle、IBMDB2等相比,存在著較大的差距。但畢竟SQLite是一個(gè)小規(guī)模的數(shù)據(jù)庫,能夠?qū)崿F(xiàn)這樣的安全性實(shí)屬不易。

四、SQLite的總結(jié)和前景

實(shí)現(xiàn)對(duì)SQLite數(shù)據(jù)庫的加密是為推廣SQLite的重要前提,也是完善一個(gè)數(shù)據(jù)庫的重要方面。由于性能良好、資源占用少和零管理成本,再加上安全保障,嵌入式數(shù)據(jù)庫SQLite有了用武之地,它將為那些以前無法提供用作持久數(shù)據(jù)的后端數(shù)據(jù)庫的應(yīng)用程序提供了高效的性能?;赟QLite的一些模塊也發(fā)展起來,如PySQLite、SQLiteAnalyzer、sQLiteDB,這些模塊的出現(xiàn)將更好地發(fā)揮SQLite的優(yōu)良性能。

小知識(shí)之C庫

一般是指編譯器提供的可在c源程序中調(diào)用的函數(shù)??煞譃閮深悾活愂莄語言標(biāo)準(zhǔn)規(guī)定的庫函數(shù),一類是編譯器特定的庫函數(shù)。