如何設(shè)計(jì)加密的嵌入式數(shù)據(jù)庫(kù)管理系統(tǒng)
隨著互聯(lián)網(wǎng)技術(shù)的不斷進(jìn)步,嵌入式數(shù)據(jù)庫(kù)系統(tǒng)用途廣泛,如用于消費(fèi)電子產(chǎn)品、移動(dòng)計(jì)算設(shè)備、企業(yè)實(shí)時(shí)管理應(yīng)用、網(wǎng)絡(luò)存儲(chǔ)與管理以及各種專(zhuān)用設(shè)備,這一市場(chǎng)目前正處于高速增長(zhǎng)之中。但同時(shí)由于嵌入式數(shù)據(jù)庫(kù)是使用越來(lái)越廣泛,它的安全問(wèn)題自然是變的越來(lái)越重要。
一、加密嵌入式數(shù)據(jù)庫(kù)管理系統(tǒng)總體設(shè)計(jì)
目前安全嵌入式數(shù)據(jù)庫(kù)管理系統(tǒng)的研究還處于探索階段,沒(méi)有自己的設(shè)計(jì)原則,故只能在分析嵌入式數(shù)據(jù)庫(kù)管理系統(tǒng)和安全數(shù)據(jù)庫(kù)管理系統(tǒng)設(shè)計(jì)原則的基礎(chǔ)上,對(duì)ESDBMS進(jìn)行有探索性的研究。
1、安全數(shù)據(jù)庫(kù)管理系統(tǒng)的設(shè)計(jì)原則
在安全數(shù)據(jù)庫(kù)管理系統(tǒng)的設(shè)計(jì)方面,作為保存數(shù)據(jù)和信息記錄的數(shù)據(jù)庫(kù)系統(tǒng)的管理系統(tǒng),應(yīng)當(dāng)提供對(duì)信息和數(shù)據(jù)的安全存取的服務(wù),即在向授權(quán)用戶(hù)提供可靠的信息/數(shù)據(jù)服務(wù)的同時(shí),又要拒絕非授權(quán)的對(duì)數(shù)據(jù)的存取訪問(wèn)請(qǐng)求,保證數(shù)據(jù)庫(kù)管理下的數(shù)據(jù)的可用性、完整性和一致性,進(jìn)而保護(hù)數(shù)據(jù)庫(kù)所有者和使用者的合法權(quán)益。其基本安全要求為:保密性;完整正確;信息在存儲(chǔ)或傳輸過(guò)程中保持不被修改、不被破壞和不丟失。
2、ESDBMS框架設(shè)計(jì)與模塊劃分
對(duì)應(yīng)用于電力系統(tǒng)的ESDBMS安全策略和數(shù)據(jù)庫(kù)結(jié)構(gòu)模型確定以后,ESDBMS的框架結(jié)構(gòu)也就順理成章了。本文把數(shù)據(jù)庫(kù)管理系統(tǒng)劃分為四個(gè)模塊:安全后端模塊、安全數(shù)據(jù)庫(kù)引擎模塊、安全前端模塊和安全事務(wù)處理模塊。在每個(gè)模塊的具體設(shè)計(jì)中,將有機(jī)地融合安全功能,從而保證數(shù)據(jù)庫(kù)管理系統(tǒng)整體的安全性。
二、安全后端模塊及加密設(shè)計(jì)與實(shí)現(xiàn)
為了減少開(kāi)發(fā)難度,安全后端模塊的設(shè)計(jì)采用分層設(shè)計(jì)的思想,屏蔽掉各層之間的差異性,實(shí)現(xiàn)高層向低層的透明調(diào)用,這樣有利于降低層次之間的耦合度。并且對(duì)于ESDBMS的其它功能模塊,它們可以透明地調(diào)用安全后端模塊最高層提供的標(biāo)準(zhǔn)接口,而不需要了解安全后端模塊的底層實(shí)現(xiàn)機(jī)制,這樣有利于安全后端模塊的拆卸和擴(kuò)充,有利于實(shí)現(xiàn)ESDBMS整體的模塊化。
cache管理子模塊是本地文件系統(tǒng)和其它上層模塊之間的中間模塊。它是通過(guò)本地操作系統(tǒng)IO API訪問(wèn)本地?cái)?shù)據(jù)庫(kù)和日志文件的模塊,即定義一個(gè)易于使用,獨(dú)立于文件系統(tǒng)的接口,用來(lái)從數(shù)據(jù)庫(kù)文件中訪問(wèn)頁(yè)面。cache管理子模塊的功能就是將用戶(hù)所需要的數(shù)據(jù)項(xiàng)從數(shù)據(jù)庫(kù)文件中讀入主存,并在內(nèi)存中操作,如果有需要,再把它寫(xiě)回?cái)?shù)據(jù)庫(kù)文件。這種功能可以歸結(jié)為cache讀操作,cache寫(xiě)操作和cache替換操作,下面分別設(shè)計(jì)實(shí)現(xiàn)。
1、cache讀操作
通過(guò)檢索關(guān)鍵字pPcm引用cache。為了讀取一頁(yè),是通過(guò)Pcm API函數(shù)來(lái)實(shí)現(xiàn)。表和索引管理模塊調(diào)用基于頁(yè)碼的ES-DBMSPcm_get這個(gè)函數(shù),其中關(guān)鍵部分偽代碼如下:
If(pPg==0){//沒(méi)有找到P
if (pPcm->nPagemxPage){//是否有free slot
PPg=ESDBMSMallocRaw( sizeof(*pPg));//獲取free slot
address_retum(pPg);
return ESDBMS OK;
}
else
{
if(pPg->dirty){//見(jiàn)有slot是否dirty?
寫(xiě)回?cái)?shù)據(jù)庫(kù)文件;
pPg->dirty=0;
rc=pager_recycle(pPcm,l,&pPg);//釋放該slot
if(rc!=ESDBMS_OK)(//出錯(cuò)處理
retum rc;}
把P頁(yè)從數(shù)據(jù)庫(kù)文件讀到該810t;
address_retum(pPg);)
Else{address_return(pPg);
return ESDBMS OK}
2、cache寫(xiě)操作
當(dāng)一頁(yè)地址返回給表和索引管理模塊,cache管理模塊并不知表和索引管理模塊什么時(shí)候?qū)Υ隧?yè)操作。ESpBMS對(duì)每一頁(yè)按照如下協(xié)議:獲得頁(yè)面,使用頁(yè)面,然后釋放頁(yè)面。獲取頁(yè)面之后,表和索引管理模塊可以直接改變頁(yè)面的內(nèi)容,但是它必須在修改頁(yè)面內(nèi)容之前調(diào)用ESDBMSPcm_ writeo API函數(shù)。
3、cache替換操作
當(dāng)cache已經(jīng)用完,此時(shí)需要移出cache中的舊頁(yè),以便為新頁(yè)騰出地方。即在cache讀時(shí),當(dāng)一個(gè)請(qǐng)求的頁(yè)不在cache中,并且在cache中并沒(méi)有free slot那么cache管理模塊就會(huì)替換掉一個(gè)slot。這個(gè)被替換掉的slot按照cache替換策略執(zhí)行,ESDBMS使用最近最少使用(LRU)cache替換策略。
4、加密子模塊的設(shè)計(jì)與實(shí)現(xiàn)
在物理存儲(chǔ)之前完成其加密解密工作;加密粒度為文件級(jí)別;采用基于口令的加密方法,密鑰由口令而產(chǎn)生;加密算法是AES,為了避免加密的開(kāi)始就過(guò)多的考慮底層的數(shù)據(jù)格式,選擇計(jì)數(shù)器模式把AES加密塊轉(zhuǎn)換成256位的加密流,不需要任何的填充操作,密文和原來(lái)的明文有相同的長(zhǎng)度,比其他的模式節(jié)省空間。加密過(guò)程中首先將整個(gè)數(shù)據(jù)庫(kù)劃分成塊,每個(gè)塊都可以作為一個(gè)單獨(dú)的AES加密塊,在計(jì)數(shù)器和由口令和鹽產(chǎn)生的密鑰作用下加密。
其中ESDBMScodecattachQ函數(shù)是用口令來(lái)連接相應(yīng)的數(shù)據(jù)庫(kù),用戶(hù)的口令通過(guò)get_a_keys函數(shù)而獲得。由于采用的是AES加密算法,計(jì)數(shù)器模式,密鑰和密文就有確定的大小,系統(tǒng)就能準(zhǔn)確分配空間。圖中Salt值在這里沒(méi)有采用隨機(jī)產(chǎn)生的方法,而是采用固定值,這樣減小了空間存入額外信息的開(kāi)銷(xiāo)。
加密和解密用的是相同的算法,即AES encrypt key256和AES decrypt key256都使用Rijndael算法。首先初始化一個(gè)進(jìn)程的計(jì)數(shù)器,把數(shù)據(jù)庫(kù)分成一個(gè)一個(gè)的塊,每個(gè)都作為一個(gè)單獨(dú)的AES加密塊(為256位),每個(gè)塊都從O開(kāi)始編號(hào),依據(jù)傳入編碼函數(shù)的page size和page number參數(shù),算出計(jì)數(shù)塊內(nèi)的計(jì)數(shù)值f等于塊的編號(hào)1和偏移量,然后用它來(lái)初始化加密流,貫穿加密模塊過(guò)程始終的數(shù)據(jù)結(jié)構(gòu)是:
typedef struct {
aes encrypt ctx cx;1/加密內(nèi)容
unsigned char key[KEYes LEN];
unsigned char newKey[KEYee LEN];
int isKeyed;//如果設(shè)定了口令置true
int isReKey;//如果重新設(shè)定口令置true
Httee*bt:刪昔向B+tree的指針
}stDbSeclnfo;
三、事務(wù)管理模塊的分析與設(shè)計(jì)
事務(wù)是一系列的數(shù)據(jù)庫(kù)操作,是數(shù)據(jù)庫(kù)應(yīng)用程序的基本邏輯單元。應(yīng)用程序不能直接從數(shù)據(jù)庫(kù)中讀或者寫(xiě)數(shù)據(jù),除非通過(guò)讀和寫(xiě)事務(wù)處理操作特別是在電力系統(tǒng)這種關(guān)系國(guó)計(jì)民生的產(chǎn)業(yè)應(yīng)用中,更要確保數(shù)據(jù)的完整性和安全性。事務(wù)管理中最重要的兩個(gè)功能就是并發(fā)事務(wù)的處理和日志文件的管理。事務(wù)管理有兩個(gè)組成部分:一般處理和恢復(fù)處理,一般處理的操作主要是指讀事務(wù)和寫(xiě)事務(wù),即從數(shù)據(jù)庫(kù)文件讀page和寫(xiě)page。
(1)讀操作
為了能在數(shù)據(jù)庫(kù)的page上進(jìn)行操作,B+樹(shù)需要應(yīng)用以pg-不存在則頁(yè)面緩沖管理模塊創(chuàng)建page。如果文件的shared或更強(qiáng)的鎖還沒(méi)有獲得,函數(shù)就獲得該文件的shared鎖。如果請(qǐng)求sha-ed鎖失敗,那么就代表其它事務(wù)具有與之不可兼容鎖,然后它返回ESDBMS BUSY錯(cuò)誤代碼給調(diào)用者。否則它就執(zhí)行一個(gè)cache讀操作,返回page給調(diào)用者。
(2)寫(xiě)操作
修改page之前,通過(guò)調(diào)用ESDBMSPcm_get函數(shù),表和索引管理子模塊選定page。頁(yè)面緩沖管理模塊申請(qǐng)page所在數(shù)據(jù)庫(kù)文件的reserved鎖。如果申請(qǐng)re8erved鎖失敗,則返回ES-DBMSes_BUSY給調(diào)用者。調(diào)用ESDBMSPcm_write函數(shù),如圖5所示。
嵌入式數(shù)據(jù)庫(kù)的名稱(chēng)來(lái)自其獨(dú)特的運(yùn)行模式。這種數(shù)據(jù)庫(kù)嵌入到了應(yīng)用程序進(jìn)程中,消除了與客戶(hù)機(jī)服務(wù)器配置相關(guān)的開(kāi)銷(xiāo)。嵌入式數(shù)據(jù)庫(kù)實(shí)際上是輕量級(jí)的,在運(yùn)行時(shí),它們需要較少的內(nèi)存。它們是使用精簡(jiǎn)代碼編寫(xiě)的,對(duì)于嵌入式設(shè)備,其速度更快,效果更理想。嵌入式運(yùn)行模式允許嵌入式數(shù)據(jù)庫(kù)通過(guò) SQL 來(lái)輕松管理應(yīng)用程序數(shù)據(jù),而不依靠原始的文本文件。嵌入式數(shù)據(jù)庫(kù)還提供零配置運(yùn)行模式,這樣可以啟用其中一個(gè)并運(yùn)行一個(gè)快照。



