本篇文章主要說一說應用系統測評時數據完整性相關的基礎知識和內容。
a)應采用校驗技術或密碼技術保證重要數據在傳輸過程中的完整性,包括但不限于鑒別數據、重要業務數據、重要審計數據、重要配置數據、重要視頻數據和重要個人信息等;
b)應采用校驗技術或密碼技術保證重要數據在存儲過程中的完整性,包括但不限于鑒別數據、重要業務數據、重要審計數據、重要配置數據、重要視頻數據和重要個人信息等。
是指信息在傳輸、交換、存儲和處理過程中,保持信息不被破壞或修改、不丟失和信息未經授權不能改變的特性,也是最基本的安全特征。
那么如果是傳輸過程中的完整性,也即當數據在傳輸過程中,接收方應該至少具備判斷接收到的數據是否完整,如是否被篡改過,或是否因為網絡等原因沒有接收完整等。
校驗技術我不怎么了解,實際測評中也沒怎么遇到過,比如CRC循環校驗等,這里就不多說了。
常用來實現數據的完整性判斷的密碼技術為“單向散列函數”,一般也叫Hash(哈希)算法、散列算法、雜湊算法,下文統稱哈希算法。
實現數據完整性的判斷,往往需要在原始數據里再附加一些額外數據,然后接收方接收到所有數據后,通過一些算法,實現完整性的判斷。
那么為什么常用哈希算法來實現完整性判斷呢?這里要先說說哈希算法。
哈希算法有一個輸入與輸出,輸入任意長度的數據,會輸出一個固定長度的值(哈希值)。且輸入的數據不同,輸出的哈希值也不同,哪怕只有1bit的不同,產生的哈希值也會完全不一樣,且沒有規律。
另外,這個算法是單向的,也就是說從哈希值無法推導出原文是什么。
用常用的哈希算法MD5算法舉例來說,輸入字符串1,則輸出c4ca4238a0b923820dcc509a6f75849b,如果輸入10,則輸出d3d9446802a44259755d38e6d163e820。
當然,有一種方法可以反向推斷出原文,但這不是算法本身的缺陷,比如你先把一些常見字符串的MD5值算出來,并將其和原文同時存儲在數據庫中,比如1的MD5是c4ca4238a0b923820dcc509a6f75849b,那么以后你碰見c4ca4238a0b923820dcc509a6f75849b這個MD5值時,你去數據庫中搜索,就能得知MD5值對于的原文是1。
另外,由于輸入的值的范圍是無限的,而輸出的值的范圍確是固定的(長度固定了),所以一個MD5值實際上必然對應著無數的原文。
但一個合格的哈希算法中,會讓這種情況出現的概率極低。
回到完整性來,利用哈希算法,比如MD5算法,可以輕松的實現一個基本的完整性校驗方法。
當客戶端向服務器端發送數據時,在數據原文后面附加上數據的MD5值,一并發送過去。
當服務器端收到數據后,使用MD5計算出數據原文的MD5值,再與附加的MD5值進行對比,即能得數據是否被篡改。
如別人修改了原文部分,則無法通過校驗。或者修改了MD5值部分,那也無法通過校驗。
不過這種簡單的方法是還是有很大的漏洞的,因為你的輸入值和輸出值都是明文,別人經過嘗試,可以很快的推斷出你所使用的是哪一種哈希算法。
得知后,別人修改原文部分之后,再使用你約定使用的哈希算法,算出哈希值部分,這樣就能夠在篡改數據的情況下通過校驗了。
所以可以再加上一些措施,對于原文A,計算出其哈希值B,然后使用某加密算法對哈希值B進行加密,得到C,最后傳輸“A+C”。
接收方收到數據后,對C進行解密,得到B,然后計算出A的哈希值D,對比B和D,即可得知結果。
這樣情況下,別人就沒辦法得知你使用的哈希算法了,因為你對哈希值B進行了加密。一旦修改了A或者B部分,都無法通過校驗。
當然,其實這還是有漏洞,因為沒有使用隨機值或者時間戳,每次傳輸原文A,最終傳輸的值都是“A+C”,對方重復幾個流程,可得到“D+Z”、“V+M”等等數據。
然后,當傳輸A時,用“D+Z”整個替換“A+C”,也能通過校驗,這叫做重放攻擊。
a)應采用校驗技術或密碼技術保證重要數據在傳輸過程中的完整性,包括但不限于鑒別數據、重要業務數據、重要審計數據、重要配置數據、重要視頻數據和重要個人信息等;
實際測評過程中,極少有自己編程實現這整個過程的,因為一般情況下沒有必要自己造一個輪子,水平不夠造的輪子還容易有很多的漏洞。
對于B/S類型的應用系統來說,一般都是使用HTTPS協議,HTTPS協議同時實現了保密性和完整性。
而對于C/S類型的應用系統來說,如果是直接連接數據庫的那種,要看數據庫是否配置了SSL,在連接的時候是否使用了SSL。
或者是否使用了其他的密碼技術來實現完整性,比如在“等保測評2.0:Oracle身份鑒別(下)”中,Oracle在進行參數上的配置后,即可保證數據傳輸過程中的完整性。而如果是使用中間件(也即客戶端不直接和數據庫打交道)的C/S類型的應用系統,要看是否使用了SSL。
實際測評過程中還是很簡單的,甚至你都不需要了解相關的密碼知識。
不過最好還是要懂一些,萬一真有自己編程實現這個過程的,你也不至于完全不明白。
另外,如果連密碼算法都是自己實現的,且不屬于國家密碼部門核準的密碼算法,一般頂多給部分符合。
因為這種自己造的輪子(密碼算法),根本沒有得到驗證,其安全性很值得懷疑。
MD5是大家最常用的密碼算法,也有人說MD5不夠安全,應該使用更安全的SHA256等哈希算法。
這其實要看MD5不安全在哪方面:
2005年山東大學的王小云教授發布算法可以輕易構造MD5碰撞實例,此后2007年,有國外學者在王小云教授算法的基礎上,提出了更進一步的MD5前綴碰撞構造算法“chosen prefix collision”,此后還有專家提供了MD5碰撞構造的開源的庫。
什么是碰撞實例呢?舉個例子,比如原文A,其MD5值為B。當我們拿到B時,可以很快的構造出一個C(C可能是A也可能不是),這個C的散列值也是B。
在這種情況下,MD5在保證數據完整性或實現數字簽名方面,確實有很大的問題。
b)應采用校驗技術或密碼技術保證重要數據在存儲過程中的完整性,包括但不限于鑒別數據、重要業務數據、重要審計數據、重要配置數據、重要視頻數據和重要個人信息等。
這里要注意和傳輸過程分開區別,傳輸過程是一個短暫的、動態的、進行過程,而這里的存儲則其實應該理解為長期的保存的過程。
當然,存儲是否有短暫的、動態的、進行過程?當然是有的,比如你用記事本或者任何程序保存數據時,當你下指令保存數據后,程序就會將內存中的數據保存至硬盤當中,這個就是短暫的存儲過程。
但明顯的,測評項指的應該是長期的保存過程。
應用系統中,一般都會將重要的數據存儲到數據庫當中。那么在數據庫中,如何使用密碼技術保證數據庫中的數據一旦被非法篡改,你就能發現呢?
在實際測評中,我沒遇到過實現的相關例子,只是自己設想了一個簡單的模型。比如存儲用戶的個人信息的表中,有姓名、性別、號碼等字段,然后除了這個字段,再添加一個校驗字段,按照一定的算法,比如:SHA256 ( SHA256(姓名+性別+號碼)+SHA256(姓名) )。
然后算出哈希值。
這樣,每次存儲、更新數據的時候,都按照這個算法計算哈希值,存儲到校驗字段中。
每次讀取數據的時候,也按照這個算法,再次計算出哈希值,看是否等于校驗字段的值。
這樣,一旦出現了非法篡改,就能夠得知,不過這個不能抵御重放攻擊,還需要再使用一些其他的措施,這里就不多說了。
雖然這一項基本沒人實現,但是至少被測評方問你怎么實現的時候,你可以大概回答下,不至于說我也不知道。
另外,如果應用系統存儲了一些重要文件(比如個人照片)等,也需用使用校驗技術或密碼技術保證其完整性。
這個理論上也可以實現,比如個人照片文件,一般來說,在數據庫應該也會有一個表存儲其相關屬性,比如路徑等,再增加一個校驗字段,按照一定的算法,比如:SHA256 ( SHA256(個人照片)+SHA256(路徑) )。
然后算出哈希值,存儲到校驗字段中。
每次使用的時候,進行校驗。或者為了降低資源占用,可以寫一個定時腳本、策略等,定時進行校驗。
注意,測評項中強調了使用校驗技術或密碼技術來實現,所以通過數據庫自身的完整性約束、安全審計、入侵防范等增加安全性的,和這個測評項都沒有關系。
聯系地址:甘肅省蘭州市城關區南濱河東路58號
?版權所有 2011-2020 甘肅安信信息安全技術有限公司
Copyright ? 2011-2020 Gansu Anxin information Safe Technology Ltd