摘 要:嵌入式系統(tǒng)已經(jīng)成為了當(dāng)今IT方面的熱門話題。隨之而來的嵌入式數(shù)據(jù)庫(kù)的安全問題更得到了重視,本文設(shè)計(jì)了一套相對(duì)比較可行的安全機(jī)制。保持了嵌入式數(shù)據(jù)庫(kù)的特性基礎(chǔ)上,大大的提高了使用的安全性。
關(guān)鍵詞:數(shù)據(jù)庫(kù);安全;加密;SQLite
中圖分類號(hào):TP311.13
SQLite是一個(gè)開源的,同時(shí)具有查詢快、占用內(nèi)存空間小以及存儲(chǔ)效率高等特性,能夠被企業(yè)廣泛的應(yīng)用。其安全問題也受到高度重視。本文在對(duì)數(shù)據(jù)庫(kù)安全機(jī)制進(jìn)行分析的基礎(chǔ)上,也設(shè)計(jì)和實(shí)現(xiàn)了SQLite數(shù)據(jù)庫(kù)的安全機(jī)制。
1 數(shù)據(jù)庫(kù)的安全機(jī)制分析
為了使嵌入式系統(tǒng)滿足對(duì)數(shù)據(jù)庫(kù)本身的輕便性,和對(duì)數(shù)據(jù)存儲(chǔ)效率、以及訪問速度、內(nèi)存占用率等性能的要求條件,SQLite采取了不同于大型數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法機(jī)制,與此同時(shí)也帶來了一些潛在的安全隱患。
開源的SQLite數(shù)據(jù)庫(kù)沒有為用戶提供嚴(yán)謹(jǐn)?shù)募用軝C(jī)制,在數(shù)據(jù)的使用安全上有很大隱患。而且,由于SQLite數(shù)據(jù)庫(kù)的數(shù)據(jù)存儲(chǔ)方式相對(duì)比較簡(jiǎn)單,目前沒有一個(gè)特定存儲(chǔ)的工具,用戶通過文本編輯器就可以對(duì)數(shù)據(jù)內(nèi)容進(jìn)行查看。同時(shí),SQLite數(shù)據(jù)庫(kù)沒有為大家提供多用戶機(jī)制,數(shù)據(jù)庫(kù)就缺少了相應(yīng)的審計(jì)機(jī)制,在對(duì)數(shù)據(jù)庫(kù)的數(shù)據(jù)進(jìn)行備份和恢復(fù)時(shí),通常只是通過手工的拷貝來完成,這對(duì)數(shù)據(jù)的安全使用是非常不安全的。
2 SQLite的安全機(jī)制設(shè)計(jì)
2.1 口令認(rèn)證
SQLite數(shù)據(jù)庫(kù)文件比較簡(jiǎn)單,僅僅是一個(gè)普通的文本文件,所以對(duì)數(shù)據(jù)庫(kù)的訪問主要是依賴于對(duì)文件的訪問控制。本文對(duì)數(shù)據(jù)庫(kù)文件添加了口令認(rèn)證,用戶只有在提供正確的口令之后,才能夠?qū)υ摂?shù)據(jù)庫(kù)文件中的數(shù)據(jù)進(jìn)行增加、刪除、修改、查詢等操作。如果口令不正確,將不能對(duì)數(shù)據(jù)文件進(jìn)行任何操作。
2.2 數(shù)據(jù)庫(kù)加密
有以下兩種數(shù)據(jù)庫(kù)加密的方式:(1)將加密功能在數(shù)據(jù)庫(kù)管理系統(tǒng)中進(jìn)行實(shí)現(xiàn);(2)對(duì)應(yīng)用程序中數(shù)據(jù)庫(kù)的一些字段的值實(shí)現(xiàn)加密,數(shù)據(jù)庫(kù)管理系統(tǒng)管理的是已經(jīng)加密的密文。
在SQLite數(shù)據(jù)庫(kù)進(jìn)行開發(fā)的時(shí)候,設(shè)計(jì)人員已經(jīng)事先留好了對(duì)數(shù)據(jù)庫(kù)進(jìn)行加密的相關(guān)接口,方便使用該數(shù)據(jù)庫(kù)的工作人員對(duì)DBMS進(jìn)行進(jìn)一步的加密操作。目前已經(jīng)實(shí)現(xiàn)了對(duì)SQLite數(shù)據(jù)庫(kù)進(jìn)行加密的設(shè)置[1],和之前的版本進(jìn)行比較,其內(nèi)部的函數(shù)和數(shù)據(jù)結(jié)構(gòu)等方面已經(jīng)有了進(jìn)一步的改進(jìn)和提高。
2.3 審計(jì)機(jī)制
開發(fā)具體的審計(jì)的功能是針對(duì)SQLite沒有用戶管理這一功能來設(shè)計(jì)的。在不對(duì)原本導(dǎo)出接口進(jìn)行改變的前提下,本設(shè)計(jì)采用特定的文本文件方式,來對(duì)系統(tǒng)的重要事件進(jìn)行簡(jiǎn)單的記錄,如打開和關(guān)閉數(shù)據(jù)庫(kù)、設(shè)計(jì)和更改口令等。
由于SQLite數(shù)據(jù)庫(kù)系統(tǒng)沒有設(shè)計(jì)用戶管理這一模塊,因此我們需要開發(fā)一個(gè)具體的審計(jì)機(jī)制。在不改變數(shù)據(jù)庫(kù)原本的導(dǎo)出接口的基礎(chǔ)之上,本設(shè)計(jì)采用特定的文本文件方式,來對(duì)數(shù)據(jù)庫(kù)系統(tǒng)進(jìn)行一系列的操作,打開、關(guān)閉數(shù)據(jù)庫(kù)操作,修改和刪除數(shù)據(jù)操作等。
2.4 備份和恢復(fù)機(jī)制
根據(jù)SQLite存儲(chǔ)數(shù)據(jù)庫(kù)數(shù)據(jù)內(nèi)容的特殊方式(單個(gè)文件存儲(chǔ)整個(gè)內(nèi)容),我們可以用文件拷貝的方式來對(duì)數(shù)據(jù)庫(kù)進(jìn)行備份和恢復(fù)。
3 SQLite加密機(jī)制的實(shí)現(xiàn)
3.1 SQLite提供的加密接口
一是sqlite3.h中所提供的sqlite3_key()和sqlite3_rekey()函數(shù),其中指定數(shù)據(jù)庫(kù)所設(shè)定的密鑰由sqlite3_key()實(shí)現(xiàn),給數(shù)據(jù)庫(kù)重新設(shè)定密鑰由sqlite3_rekey()實(shí)現(xiàn);另一種是在attach.c文件中所提供的密鑰與數(shù)據(jù)庫(kù)進(jìn)行關(guān)聯(lián)的接口函數(shù)sqlite3CodecGetKey()和sqlite3CodecAttach,返回當(dāng)前數(shù)據(jù)庫(kù)的密鑰由sqlite3CodecGetKey()完成,將密鑰和頁(yè)面編碼函數(shù)關(guān)聯(lián)于數(shù)據(jù)庫(kù)由sqlite3CodecAttach實(shí)現(xiàn)[2]。
3.2 加密算法的選擇與實(shí)現(xiàn)
SQLite數(shù)據(jù)庫(kù)對(duì)數(shù)據(jù)的保存時(shí)銅鼓哦頁(yè)面形式完成的。因此,我們可以選擇使用以下兩種加密算法:分組加密算法和須留加密算法。當(dāng)加密快的大小和頁(yè)面的大小之間相差不是整數(shù)倍數(shù)時(shí),分組加密算法需要對(duì)數(shù)據(jù)進(jìn)行填充,這將改變存儲(chǔ)頁(yè)面的長(zhǎng)度,還需要對(duì)數(shù)據(jù)庫(kù)做出相應(yīng)的修改。而序列加密算法恰好對(duì)這一問題有所處理,能夠很好的避免。
3.3 密鑰的設(shè)計(jì)與實(shí)現(xiàn)
一般情況下,用戶所設(shè)定的口令長(zhǎng)度是不固定的,如果用用戶輸入的口令來作為加密密鑰就會(huì)存在安全隱患,在應(yīng)用程序中可能會(huì)泄露密鑰。因此,本系統(tǒng)設(shè)計(jì)了一個(gè)導(dǎo)出函數(shù)用來密鑰的設(shè)計(jì),對(duì)輸入的口令進(jìn)行變換,將其結(jié)構(gòu)用作密鑰來對(duì)數(shù)據(jù)庫(kù)進(jìn)行加密。
3.4 安全機(jī)制的設(shè)計(jì)與實(shí)現(xiàn)
本文在SQLite3.6.15版本的基礎(chǔ)上進(jìn)行研究,對(duì)上述SQLite安全機(jī)制,使用了標(biāo)準(zhǔn)C實(shí)現(xiàn)了SQLite的上述安全機(jī)制。通過用文本文件來加密數(shù)據(jù)庫(kù)的數(shù)據(jù),實(shí)現(xiàn)了審計(jì)功能;通過用文件拷貝的方式來實(shí)現(xiàn)數(shù)據(jù)庫(kù)數(shù)據(jù)的備份和恢復(fù);通過使用序列加密算法RC4來實(shí)現(xiàn)對(duì)SQLite的加密機(jī)制。
3.5 測(cè)試加密功能
筆者測(cè)試了SQLite數(shù)據(jù)庫(kù)的各項(xiàng)修改后的功能,均能夠正常運(yùn)行。
測(cè)試過程:編寫一個(gè)SQLite3應(yīng)用程序。程序代碼的功能是打開一個(gè)數(shù)據(jù)庫(kù)test2.db,創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)表(table),并插入兩條記錄[3]。
由測(cè)試結(jié)果可以看出:在不使用加密機(jī)制的情況下,直接訪問數(shù)據(jù)庫(kù)文件就可以得知數(shù)據(jù)庫(kù)中存儲(chǔ)信息的內(nèi)容。修改程序代碼,在代碼sqlite3 _open (“test2.db”,db)的下面增加一行代碼:Sqlite3_key(db,“123456”,6);表示對(duì)數(shù)據(jù)庫(kù)db進(jìn)行加密,口令為“123456”,口令長(zhǎng)度為6。
由測(cè)試結(jié)果可看出:數(shù)據(jù)庫(kù)文件的內(nèi)容已經(jīng)變?yōu)閬y碼,達(dá)到了數(shù)據(jù)保密的目的。編寫一個(gè)SQLite3 應(yīng)用程序,程序的功能是讀出加密后的數(shù)據(jù)庫(kù)test2. db的表user的內(nèi)容,其中:代碼sqlite3 _key(db,“123456”,6)指定數(shù)據(jù)庫(kù)的加密口令;函數(shù)SelectTable為回調(diào)函數(shù)。如果提供的口令不正確,如:sqlite3_key( db,“1234”,4),則訪問數(shù)據(jù)庫(kù)的函數(shù)會(huì)報(bào)錯(cuò):“file is encryp ted or isnot a database”,并且不能執(zhí)行數(shù)據(jù)庫(kù)訪問操作。
4 結(jié)束語(yǔ)
在信息系統(tǒng)中,對(duì)數(shù)據(jù)庫(kù)中的所有數(shù)據(jù)進(jìn)行存儲(chǔ)和使用都是通過數(shù)據(jù)庫(kù)來完成了,整個(gè)安全機(jī)制的設(shè)計(jì)數(shù)據(jù)庫(kù)的安全至關(guān)重要。筆記分析了當(dāng)前數(shù)據(jù)庫(kù)的安全機(jī)制,并在現(xiàn)有的基礎(chǔ)之上,對(duì)SQLite數(shù)據(jù)庫(kù)進(jìn)行改進(jìn),將其安全性盡可能的提高。通過測(cè)試,SQLite系統(tǒng)不但繼承了原有系統(tǒng)的優(yōu)點(diǎn),同時(shí)還增強(qiáng)了對(duì)數(shù)據(jù)庫(kù)使用的安全性。
參考文獻(xiàn):
[1]路旋.SQLite嵌入式數(shù)據(jù)庫(kù)系統(tǒng)的研究與實(shí)現(xiàn)[J].計(jì)算機(jī)應(yīng)用技術(shù),2009.
[2]唐敏,宋杰.嵌入式數(shù)據(jù)庫(kù)SQLite的原理與應(yīng)用[J].電腦知識(shí)與技術(shù),2008(02):51-54.
[3]劉海燕.楊健康.嵌入式數(shù)據(jù)庫(kù)SQLite的安全機(jī)制分析與設(shè)計(jì)[J].裝甲兵工程學(xué)院學(xué)報(bào),2009(10):41-46.
作者簡(jiǎn)介:王春波(1986.12-,男,吉林九臺(tái)人,碩士,研究方向:計(jì)算機(jī)網(wǎng)絡(luò)與通信。
作者單位:長(zhǎng)春理工大學(xué) 計(jì)算機(jī)科學(xué)技術(shù)學(xué)院,長(zhǎng)春 130022