胡逸平 王俊 張龍 劉洋 徐敏 王六平
摘要: 介紹了Hash算法在數(shù)據(jù)庫加密系統(tǒng)中的應用,包括在用戶身份驗證中的應用,在數(shù)據(jù)庫完整性認證中的應用,以及在密文檢索中的應用。
關鍵詞: 數(shù)據(jù)庫安全; Hash算法; 身份驗證; 數(shù)據(jù)庫完整性; 密文檢索
中圖分類號:TP309.2文獻標志碼:A 文章編號:1006-8228(2012)04-06-03
Application of Hash algorithm in database security
Hu Yiping, Wang Jun, Zhang Long, Liu Yang, Xu Ming, Wang Liuping
(Hu Nan Normal University, Changsha, Hunan 410081, China)
Abstract: In this paper, the authors mainly consider the application of hash algorithm in database security, including the application of hash algorithm in identity authentication, database integrity checking, and encrypted data searching.
Key words: database security; hash algorithm; identity authentication; database integrity checking; encrypted data searching
0 引言
計算機的產(chǎn)生逐漸將人類帶進了信息化技術的時代,但是高風險性使得信息系統(tǒng)的安全性問題隨著信息化進程而變得日益敏感和重要。作為信息系統(tǒng)的核心,數(shù)據(jù)庫安全問題一直是人們所關注的焦點。
數(shù)據(jù)庫安全的威脅包括數(shù)據(jù)的泄密和非法修改,即對數(shù)據(jù)的三種屬性的破壞:可用性、保密性和完整性。可用性是指合法用戶可以隨時訪問他被授權的可以訪問的數(shù)據(jù),保密性是指數(shù)據(jù)信息不被泄密,完整性是指數(shù)據(jù)信息不被非法修改或破壞。
為了保護數(shù)據(jù)庫中數(shù)據(jù)的安全性,目前大型數(shù)據(jù)庫管理系統(tǒng)(DBMS)都構建了自身的安全機制。以Microsoft公司的SQL Server為例,SQL Server的安全機制可以劃分為四個等級:客戶機操作系統(tǒng)登錄的安全性、SQL Server登錄的安全性、數(shù)據(jù)庫訪問的安全性、數(shù)據(jù)庫對象使用的安全性。SQL Server提供了授權機制、角色機制、視圖機制、審計機制以及數(shù)據(jù)加密等來實現(xiàn)上述安全機制。合理利用這些安全機制,能夠極大地增強數(shù)據(jù)庫系統(tǒng)的安全性。
大多數(shù)數(shù)據(jù)庫管理系統(tǒng)都僅局限于訪問控制,然而,在眾多的安全機制中,數(shù)據(jù)加密才是保護敏感信息最為有效的手段。加密后的數(shù)據(jù)以密文的形式存儲在數(shù)據(jù)庫中,只有擁有解密密鑰的管理人員才能將其解密得到明文;對于攻擊者來說,即使他得到了數(shù)據(jù)庫的物理文件,也無法獲得其中敏感數(shù)據(jù)的明文信息。用于數(shù)據(jù)庫數(shù)據(jù)加密的各種加密算法,大都是經(jīng)過實踐檢驗運行良好的算法,具有很高的安全性,如果沒有解密密鑰,在現(xiàn)有的計算條件下,一般很難破解。
基于數(shù)據(jù)加密的數(shù)據(jù)庫安全機制,可以采用兩級密鑰體系:一級是用于加密敏感信息的數(shù)據(jù)密鑰,另一級是用于加密數(shù)據(jù)密鑰的服務密鑰。加密時,首先生成數(shù)據(jù)加密密鑰,并用數(shù)據(jù)密鑰加密敏感信息,然后用服務密鑰加密數(shù)據(jù)密鑰。解密時,系統(tǒng)先用服務密鑰解密加密后的數(shù)據(jù)密鑰得到數(shù)據(jù)密鑰,再用數(shù)據(jù)密鑰解密敏感信息。由于對稱加密算法速度比非對象加密算法快,而非對稱加密算法比對稱加密算法安全,所以,加密敏感信息一般采用對稱加密算法,而加密數(shù)據(jù)密鑰一般采用非對稱加密算法,這樣敏感信息和數(shù)據(jù)密鑰都得到了有效的保護,因而系統(tǒng)具有很高的安全性,同時又不會過于影響數(shù)據(jù)訪問效率。
然而,無論機制設計如何精巧,并不能解決數(shù)據(jù)庫所有的安全問題。即使用于加密數(shù)據(jù)密鑰的服務密鑰可以寫入專用硬件,攻擊者還是有可乘之機。由于數(shù)據(jù)庫管理員在登錄系統(tǒng)時需要提供SQL Server賬戶和密碼,這就難以防止SQL Server注入攻擊。而一旦攻擊者登錄到數(shù)據(jù)庫,即使他不能獲得敏感信息的明文數(shù)據(jù),他還是可以對敏感信息進行篡改,比如用一個加密的記錄值替換另外的加密值。而如果數(shù)據(jù)庫中數(shù)據(jù)極多,針對幾條記錄的篡改是很難以被發(fā)現(xiàn)的。除此之外,針對加密數(shù)據(jù)庫的數(shù)據(jù)檢索也是極其費時的,這是數(shù)據(jù)庫加密系統(tǒng)需要解決的另一個問題。
Hash算法是一種計算相對簡單的單向函數(shù),其意義在于提供了一種快速存取數(shù)據(jù)的方法:它用一種算法建立了鍵值與真實值之間的對應關系。Hash算法由于自身的具有優(yōu)良的特性,可以被用于用戶身份驗證、數(shù)據(jù)庫完整性認證以及數(shù)據(jù)檢索中,從而極大地提高原有系統(tǒng)的性能。
1 Hash算法在用戶身份認證中的應用
SQL Server提供了兩種類型的用戶管理方法:一是SQL Server身份驗證模式,二是Windows識別模式。SQL Server身份驗證模式是通過比較用戶傳入數(shù)據(jù)與存儲在SQL Server數(shù)據(jù)庫中的數(shù)據(jù)來實現(xiàn)的,這使得數(shù)據(jù)庫容易被下載或復制,也容易受到SQL注入攻擊。在Windows識別模式下用戶必須通過Windows用戶賬戶驗證,然后才可以連接到SQL Server,這種模式雖然具有較高的安全性,卻不適用于大規(guī)模的網(wǎng)絡應用環(huán)境中。
在SQL Server身份驗證模式下,數(shù)據(jù)庫中存儲的數(shù)據(jù)不是通常意義下的密碼,而是密碼經(jīng)過某種算法處理后的隨機值,當用戶登錄系統(tǒng)時,也用相同的算法計算隨機值,如果兩個值互相匹配,就可以訪問數(shù)據(jù)庫,這樣就可以防止SQL Server注入攻擊。而Hash算法具有不可逆性和唯一性的優(yōu)良特性,使得我們可以選擇一種安全的Hash算法來完成這個任務。
SHA算法就是一種很好的Hash算法,它是由美國國家標準和技術協(xié)會(NIST)開發(fā),于1993年作為聯(lián)邦信息處理標準發(fā)表。對于長度小于264位的消息,SHA會產(chǎn)生一個160位的消息摘要。當接收到消息時,這個消息摘要可以用來驗證數(shù)據(jù)的完整性。在傳輸過程中,如果數(shù)據(jù)發(fā)生變化,那么就會產(chǎn)生不同的消息摘要。SHA具有如下特性:不能從消息摘要中復原信息;兩個不同的消息不會產(chǎn)生同樣的消息摘要。該算法經(jīng)過加密專家多年來的發(fā)展和改進已日益完善,現(xiàn)在已成為世界公認的最安全的哈希算法之一,并被廣泛使用。
可以用SHA算法來對用戶密碼產(chǎn)生哈希值,并將這個值存儲在數(shù)據(jù)中。當用戶登錄系統(tǒng)時,也用SHA對密碼進行處理,再將哈希值將數(shù)據(jù)庫中的值進行匹配。為了防止攻擊者對密碼的哈希值進行分析,我們還可以為每個密碼添加一個惟一的隨機值。用戶登錄系統(tǒng)時,采用兩次SHA而不是一次SHA,第一次是用SHA將用戶輸入數(shù)據(jù)進行哈希,第二次是將哈希值添加隨機值后再用SHA進行哈希,最后再與數(shù)據(jù)庫中數(shù)據(jù)進行匹配。而數(shù)據(jù)庫中數(shù)據(jù)也是用戶密碼經(jīng)過兩次哈希并添加隨機值后的值,這樣即使攻擊者得到了密碼數(shù)據(jù)庫,也無法還原密碼。
2 Hash算法在數(shù)據(jù)庫完整性驗證中的應用
如果攻擊者登錄到數(shù)據(jù)庫中,他就擁有對數(shù)據(jù)的權限。如果數(shù)據(jù)庫中的數(shù)據(jù)沒有進行加密處理,攻擊者就能查看到所有的敏感信息,從而導致數(shù)據(jù)泄露。如果在加密數(shù)據(jù)庫系統(tǒng)中,此時攻擊者如果沒有解密密鑰就不能獲得敏感信息,從而不會導致數(shù)據(jù)泄露。但是如果攻擊者擁有對數(shù)據(jù)進行修改的權限,攻擊者就可以對數(shù)據(jù)進行篡改甚至替換某些記錄,這種行為無疑對數(shù)據(jù)庫的完整性造成了極大的破壞。在不知道數(shù)據(jù)庫被攻擊的情況下,數(shù)據(jù)庫的這種完整性破壞可能要經(jīng)過很長時間才能被數(shù)據(jù)庫管理員發(fā)現(xiàn),或許也有可能直到數(shù)據(jù)庫被廢棄時也未被發(fā)現(xiàn)。通過審計機制我們或許可以發(fā)現(xiàn)一些端倪,可是如果攻擊者足夠聰明,即使我們能夠發(fā)現(xiàn)數(shù)據(jù)庫中數(shù)據(jù)被篡改,也無法定位到具體數(shù)據(jù)。為保證數(shù)據(jù)的完整性,研究人員提出了多種方案。2007年Chien-Yuan Chen等人提出了一種可保證數(shù)據(jù)庫完整性的加密方案[2],在他們的方案中使用隨機過濾器為每一條記錄生成一個認證向量從而節(jié)省了認證數(shù)據(jù)的存儲空間,在檢查完整性時只需通過若干次Hash操作,并且當有數(shù)據(jù)被篡改后通過認證向量也可檢查出被篡改的具體數(shù)據(jù)項。這種方案能夠有效地保護數(shù)據(jù)庫中數(shù)據(jù)的完整性。其中的Hash操作是一種被稱為Bloom Filter的技術,因其空間高效性和隨機性在許多領域中都有其應用。
Bloom Filter 是由 Howard Bloom 在1970年提出的二進制向量數(shù)據(jù)結構,它具有很好的空間和時間效率,被用來檢測一個元素是不是集合中的一個成員。這種檢測只會對在集合內(nèi)的數(shù)據(jù)錯判,而不會對不是集合內(nèi)的數(shù)據(jù)進行錯判,這樣每個檢測請求返回有“在集合內(nèi)(可能錯誤)”和“不在集合內(nèi)(絕對不在集合內(nèi))”兩種情況[1]。
初始狀態(tài)時,Bloom Filter是一個包含m位的位數(shù)組,每一位都置為0。
為了表達S={x1, x2,…,xn}這樣一個n個元素的集合,Bloom Filter使用k個相互獨立的哈希函數(shù)(Hash Function),它們分別將集合中的每個元素映射到{1,…,m}的范圍中。對任意一個元素x,第i個哈希函數(shù)映射的位置hi(x)就會被置為1(1≤i≤k)。如果一個位置多次被置為1,那么只有第一次會起作用,后面幾次將沒有任何效果。
在判斷y是否屬于這個集合時,我們對y應用k次哈希函數(shù),如果所有hi(y)的位置都是1(1≤i≤k),那么我們就認為y是集合中的元素,否則就認為y不是集合中的元素。圖1中k=3,y1就不是集合中的元素。y2或者屬于這個集合,或者剛好是一個False positive。
圖1
假設kn 其中1/m表示任意一個哈希函數(shù)選中這一位的概率(前提是哈希函數(shù)是完全隨機的),(1-1/m)表示哈希一次沒有選中這一位的概率。要把S完全映射到位數(shù)組中,需要做kn次哈希。某一位還是0意味著kn次哈希都沒有選中它,因此這個概率就是(1-1/m)的kn次方。在實際應用中,可由集合元素和所期望的誤報率來選擇合適的Bloom Filter。 基于Bloom Filter的數(shù)據(jù)庫加密數(shù)據(jù)庫認證方案是為每條記錄都引入一個Bloom Filter向量,加密時對每條記錄的每個敏感字段都將其明文數(shù)據(jù)與數(shù)據(jù)字段密鑰的“異或”值用一組相互獨立的Hash函數(shù)映射到Bloom Filter向量中,并用一個計數(shù)器向量記錄Bloom Filter向量中每一位被映射的次數(shù)。完成映射后再用數(shù)據(jù)字段密鑰將明文數(shù)據(jù)加密后存入數(shù)據(jù)庫中,當整條記錄被處理完畢后將這條記錄的Bloom Filter向量存入數(shù)據(jù)庫中,這樣Bloom Filter就記錄了一條記錄中每個敏感字段的信息。在對密文數(shù)據(jù)庫進行查詢或更新時,也是先將輸入數(shù)據(jù)的每個敏感字段數(shù)據(jù)值與數(shù)據(jù)字段密鑰進行“異或,”再將“異或”值用相同的一組Hash函數(shù)映射到一個向量中,當所有數(shù)據(jù)都處理完畢后再將新生成的向量與存儲在數(shù)據(jù)庫中的向量相“與”,如果結果與新生成的向量相同,則再將要查詢的數(shù)據(jù)加密與存儲在數(shù)據(jù)庫中的加密數(shù)據(jù)相匹配,如果相同再對數(shù)據(jù)庫中的記錄進行解密。如果數(shù)據(jù)庫中數(shù)據(jù)被篡改或是替換了,則兩個向量的相“與”值與新生成的向量必不相等。而且由于Bloom Filter向量記錄了每條記錄中每個敏感字段的信息,在數(shù)據(jù)被篡改或替換的情況下,我們還可以精確定位到每個數(shù)據(jù)字段值。 3 Hash算法在數(shù)據(jù)庫檢索中的應用 SQL Server提供了數(shù)據(jù)加密功能,然而數(shù)據(jù)加密功能并非免費的午餐,若需要使用數(shù)據(jù)加密功能,就一定要為之付出代價—典型的代價就是數(shù)據(jù)庫讀寫性能下降。不同的加密方法在不同情況下對性能的影響各不相同。對稱加密算法性能要遠遠高于非對稱加密算法。非對稱加密的加密效果要高于對稱加密,但是加密性能上的代價也必須考慮。所有類型的加密都是非確定性的,所以在對已經(jīng)實現(xiàn)索引的數(shù)據(jù)進行搜索或者過濾時,索引的作用也不能很好地發(fā)揮。如果搜索、聯(lián)結、或者分組操作是基于被加密數(shù)據(jù)的,那么即使使用性能較好的對稱加密也會影響到數(shù)據(jù)庫的可擴展性。 當然,加密并非一無是處,如果對敏感數(shù)據(jù)進行安全確定的哈希,那么就能夠同時兼顧數(shù)據(jù)庫中數(shù)據(jù)安全性和系統(tǒng)可擴展性。基于信息驗證碼(message authentication code,MAC)的搜索鍵可以充分發(fā)揮索引的作用,從而達到最佳的性能。 MAC是敏感數(shù)據(jù)與一個隱秘數(shù)值相結合之后的哈希值。這是一種使用了安全加密鹽的哈希算法,可以防止字典攻擊。MAC作為加密數(shù)據(jù)的一個安全的、確定性的表示值,可以與加密數(shù)據(jù)保存到同一個表中,所有的搜索操作都是針對MAC列進行的。 為了實現(xiàn)MAC方案,首先要把一個隱秘的數(shù)據(jù)進行加密并存入數(shù)據(jù)庫中,把它作為加密鹽,然后把該加密鹽解密后與數(shù)據(jù)連接起來。使用加密鹽改變了數(shù)據(jù)的哈希值,可以使字典攻擊幾乎完全失效。最后要把連接后的結果傳入一個安全的Hash函數(shù),生成一個MAC。當把加密后的數(shù)據(jù)存儲到數(shù)據(jù)庫中時,同時也要將MAC進行保存。 檢索數(shù)據(jù)時,我們首先將加密鹽解密,然后把該加密鹽與輸入數(shù)據(jù)連接起來,再把連接后的結果傳入Hash函數(shù)生成一個新的MAC,隨后用數(shù)據(jù)庫中MAC列中的數(shù)據(jù)與新的MAC進行比較,最后再將匹配的結果記錄解密。由于MAC列以明文形式存儲在數(shù)據(jù)庫中,故而可以對其建立索引。而我們在進行檢索數(shù)據(jù)時,都是針對MAC進行檢索,并不直接針對加密數(shù)據(jù),因此可以達到最佳的性能。 4 結束語 數(shù)據(jù)庫中數(shù)據(jù)的可用性、保密性和完整性是數(shù)據(jù)庫安全性的主要方面。數(shù)據(jù)加密是保護敏感數(shù)據(jù)最有效的手段。Hash算法由于其不可逆性、惟一性以及其高效的性能,在加密數(shù)據(jù)庫系統(tǒng)中得到了廣泛的應用。Hash算法在用戶身份認證、數(shù)據(jù)庫數(shù)據(jù)完整性認證以及密文數(shù)據(jù)檢索中具有極其重要的價值。合理利用Hash算法,能夠顯著提高加密數(shù)據(jù)庫的安全性和可擴展性。 參考文獻: [1] 任洪慶,盧建朱,許嬌陽. 基于 Bloom Filter 的加密數(shù)據(jù)庫字段認證方案[J].計算機工程與設計,2011.32:818~821 [2] Chen Chien-Yuan,Ku Cheng-Yuan,David C Yen.Cryptographic relational algebra for databases using the field authenticator[J].Computers & Mathematics with Applications,2007.54(1):38~44 [3] 楊昱昺.一種通用數(shù)據(jù)庫數(shù)據(jù)加密方案[J].計算機安全,2009.7:72~74 [4] 鐘阿林,許方恒.數(shù)據(jù)庫加密新技術的研究[J].河南師范大學學報(自然科學版),2007.4:51~53 [5] 徐立新,何敏,狄文輝.同時保護數(shù)據(jù)庫數(shù)據(jù)保密性和完整性的方法[J].計算機工程,2007.33(10):179~180