散列函數的應用及其安全性


本次作業為擴展有關散列函數安全性的知識擴展。

 

作業題目:散列函數的應用及其安全性。

 

內容要求:

 

(1) 給出散列函數的具體應用。

 

(2) 結合生日攻擊、以及2004、2005年王曉雲教授有關MD5安全性和2017年google公司SHA-1的安全性,說明散列函數的安全性以及目前安全散列函數的發展。問題2的回答可以參考下面給出的第一個鏈接。

鏈接1:https://www.win.tue.nl/hashclash/

 

(3)結合md5算法中的選擇前綴碰撞以及第二個鏈接中的helloworld.exe和goodbyworld.exe兩個可執行文件的md5消息摘要值和兩個文件的執行結果說明md5算法在驗證軟件完整性時可能出現的問題。

鏈接2:http://www.win.tue.nl/hashclash/SoftIntCodeSign/

 

一 、散列函數的具體應用

 

1、散列函數的說明

 

Hash,一般翻譯做"散列",也有直接音譯為"哈希"的,就是把任意長度的輸入(又叫做預映射, pre-image),通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯一的確定輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。

 

HASH函數,又稱雜湊函數,是在信息安全領域有廣泛和重要應用的密碼算法,它有一種類似於指紋的應用。在網絡安全協議中,雜湊函數用來處理電子簽名,將冗長的簽名文件壓縮為一段獨特的數字信息,像指紋鑒別身份一樣保證原來數字簽名文件的合法性和安全性。在前面提到的SHA-1和MD5都是目前最常用的雜湊函數。經過這些算法的處理,原始信息即使只更動一個字母,對應的壓縮信息也會變為截然不同的“指紋”,這就保證了經過處理信息的唯一性。為電子商務等提供了數字認證的可能性。

 

散列的概念屬於查找,它不以關鍵字的比較為基本操作,采用直接尋址技術。在理想情況下,查找的期望時間為O(1)。

散列函數把消息或數據壓縮成摘要,使得數據量變小,將數據的格式固定下來,比如我們自定義密碼的存儲。

 

散列(Hashing)通過散列函數將要檢索的項與索引(散列,散列值)關聯起來,生成一種便於搜索的數據結構(散列表)。

 

2、散列函數特征

 

HASH函數必須具備兩個基本特征:單向性 和 碰撞約束。

單向性是指其的操作方向的不可逆性,在HASH函數中是指 只能從輸入推導出輸出,而不能從輸出計算出輸入;

碰撞約束是指 不能找到一個輸入使其輸出結果等於一個已知的輸出結果 或者 不能同時找到兩個不同的輸入使其輸出結果完全一致。

一個函數只用同時嚴格的具備了這樣的特性,我們才能認可這樣的一個HASH。

 

HASH函數的特點:固定長度的輸出,單向不可逆,碰撞約束。

 

3.散列函數的具體應用

 Hash函數被廣泛的應用於各種不同的安全應用和網絡協議中

 

 

1、保證數據的完整性

就是用散列函數對數據或文件進行轉換,生成一個散列碼並保存,下次使用該數據和文件,同樣進行散列函數計算得出結果與之比較,如果數據或文件被惡意篡改的,這兩個值就不同了。以此發現病毒或入侵者。因為一個比特或幾個比特被改變,它的hash結果就被改變。

 

2、單向數據加密

例子有口令加密,將用戶口令的散列碼存到一個表中,使用時將用戶輸入口令進行散列運算然后與准備好的散列表值進行對比,從而完成口令的有效驗證。

 

3、數字簽名

 

 

所謂數字簽名(Digital Signature)(又稱公鑰數字簽名、電子簽章)是一種類似寫在紙上的普通的物理簽名,但是使用了公鑰加密領域的技術實現,用於鑒別數字信息的方法。一套數字簽名通常定義兩種互補的運算,一個用於簽名,另一個用於驗證。

散列函數用於消息認證

 

MAC(消息認證碼(帶密鑰的hash函數))

消息認證碼(帶密鑰的Hash函數):密碼學中,通信實體雙方使用的一種驗證機制,保證消息數據完整性的一種工具。構造方法由M.Bellare提出,安全性依賴於Hash函數,故也稱帶密鑰的Hash函數。消息認證碼是基於密鑰和消息摘要所獲得的一個值,可用於數據源發認證和完整性校驗。

 

 消息認證是用來驗證消息完整性的一種機制和服務。消息認證確保收到的數據確實和發送時的一樣,還要求消息認證機制確保發送方聲稱的身份是真實有效的。當Hash函數用於提供消息認證功能時,Hash函數值通常被稱為消息摘要。

 

發送方根據待發送的消息使用該函數計算一組Hash值,然后將Hash值和消息一起發送過去。接收方接收后對於消息執行同樣的Hash計算,並將結果與收到的Hash值進行比較。如果匹配,則消息准確。反之,消息遭受了篡改。

 

實際應用中,消息認證通常使用消息認證碼(MAC)實現。MAC函數將通信雙方共享的密鑰和數據塊作為輸入,產生Hash值作為MAC碼,然后將MAC碼和受保護的消息一起傳遞或存儲。需要檢查消息的完整性時,使用MAC函數對消息重新計算,並將計算結果與存儲的MAC碼對比。MAC提供安全保護,用於抵抗不知道密鑰的攻擊者的攻擊。在實現中,往往使用比加密算法效率更高的特殊設計的MAC函數。

 

消息驗證碼有兩種計算方式

 

一種是利用已有的加密算法,如DES等直接對摘要值進行加密處理;另一種是使用專門的MAC算法。HMAC,它基於MD5或者SHA-1,在計算散列值時將密鑰和數據同時作為輸入,並采用了二次散列迭代的方式,實際計算方法如下:

 

HMAC(K,M)=H(K⊕opad∣H(K⊕ipad∣M))

 

其中K是密鑰,長度應為64字節,若小於該長度,則自動在密鑰后面用“0”填充補足。M是消息;H是散列函數;opad和Ipad分別是由若干個0x5c和0x36組成的字符串;⊕表示異或運算,∣表示連接操作。
 
散列函數用於數字簽名

 

數字簽字可以用對稱算法實現,也可以用公鑰算法實現。但前者除了文件簽字者和文件接受者雙方,還需要第三方認證,較麻煩;通過公鑰加密算法的實現方法,由於用秘密密鑰加密的文件,需要靠公開密鑰來解密,因此這可以作為數字簽名,簽名者用秘密密鑰加密一個簽名(可以包括姓名、證件號碼、短信息等信息),接收人可以用公開的、自己的公開密鑰來解密,如果成功,就能確保信息來自該公開密鑰的所有人。

 

Hash簽名是最主要的數字簽名方法,也稱之為數字摘要法(digital digest)、數字指紋法(digital finger print)。它與RSA數字簽名是單獨的簽名不同,該數字簽名方法是將數字簽名與要發送的信息緊密聯系在一起,它更適合於電子商務活動。將一個商務合同的個體內容與簽名結合在一起,比合同和簽名分開傳遞,更增加了可信度和安全性。下面我們將詳細介紹Hash簽名中的函數與算法。
  
單向函數
  
  單向函數的概念是公開密鑰密碼的核心。盡管它本身並不是一個協議,但對大多數協議來說卻是一個基本結構模塊。
  
  單向函數的概念是計算起來相對容易,但求逆卻非常困難。也就是說,已知x,我們很容易計算f(x)。但已知f(x),卻難於計算出x。在這里,"難"定義成:即使世界上所有的計算機都用來計算,從f(x)計算出x也要花費數百萬年的時間。
  
  打碎盤子就是一個很好的單向函數的例子。把盤子打碎成數千片碎片是很容易的事情,然而,要把所有這些碎片再拼成為一個完整的盤子,卻是非常困難的事情。

 

Hash簽名不屬於強計算密集型算法,應用較廣泛。很多少量現金付款系統,如DEC的Millicent和CyberCash的CyberCoin等都使用Hash簽名。使用較快的算法,可以降低服務器資源的消耗,減輕中央服務器的負荷。Hash的主要局限是接收方必須持有用戶密鑰的副本以檢驗簽名, 因為雙方都知道生成簽名的密鑰,較容易攻破,存在偽造簽名的可能。如果中央或用戶計算機中有一個被攻破,那么其安全性就受到了威脅。

 

 

(1)數據校驗
    HASH函數有類似數據冗余校驗類似的功能,但是它比簡單的冗余校驗碰撞的概率要小得多,顧而在現在密碼學中總是用HASH來做關鍵數據的驗證。


(2)單向性的運用
    利用HASH函數的這個特點,我們能夠實現口令,密碼等安全數據的安全存儲。密碼等很多關鍵數據我們需要在數據庫中存儲,但是在實際運用的過程中,只是作比較操作,顧而我們可以比較HASH結果。


(3)碰撞約束以及有限固定摘要長度
    數字簽名正是運用了這些特點來提高效率的。我們知道非對稱加密算法速度較低,通過HASH處理我們可以使其僅僅作用於HASH摘要上,從而提高效率。


(4)可以運用HASH到隨機數的生成和密碼,salt值等的衍生中
    因為HASH算法能夠最大限度的保證其唯一性,故而可以運用到關鍵數據的衍生中(從一個隨機的種子數產生,並且不暴露種子本身秘密)。

(5)產生單向口令文件

 

在操作系統中,存儲口令的Hash值而不是口令本身,當用戶輸入口令時,操作系統將比對輸入口令的Hash值和存儲在口令文件中的Hash值來進行用戶驗證。

 

6)用於入侵檢測和病毒檢測

 

將每個文件的Hash值H(F)存儲在安全系統中(如CD-R),隨后就能通過重新計算H(F)來判斷文件是否被修改過。入侵者只能夠改變F,而不能改變H(F)

 

 

在信息安全方面的應用

 

1)文件校驗
  我們比較熟悉的校驗算法有奇偶校驗和CRC校驗,這2種校驗並沒有抗數據篡改的能力,它們一定程度上能檢測並糾正數據傳輸中的信道誤碼,但卻不能防止對數據的惡意破壞。
  MD5 Hash算法的"數字指紋"特性,使它成為目前應用最廣泛的一種文件完整性校驗和(Checksum)算法,不少Unix系統有提供計算md5 checksum的命令。


2)數字簽名
  Hash 算法也是現代密碼體系中的一個重要組成部分。由於非對稱算法的運算速度較慢,所以在數字簽名協議中,單向散列函數扮演了一個重要的角色。對 Hash 值,又稱"數字摘要"進行數字簽名,在統計上可以認為與對文件本身進行數字簽名是等效的。而且這樣的協議還有其他的優點。


3)鑒權協議
  如下的鑒權協議又被稱作"挑戰--認證模式:在傳輸信道是可被偵聽,但不可被篡改的情況下,這是一種簡單而安全的方法。

 

二、結合生日攻擊、以及2004、2005年王曉雲教授有關MD5安全性和2017年google公司SHA-1的安全性,說明散列函數的安全性以及目前安全散列函數的發展。問題2的回答可以參考下面給出的第一個鏈接。

 

1、生日攻擊

 

 

利用“兩個集合相交”問題的原理生成散列函數碰撞,達到目的的攻擊稱為生日攻擊,也稱為平方根攻擊。
生日攻擊方法沒有利用Hash函數的結構和任何代數弱性質,它只依賴於消息摘要的長度,即Hash值的長度。

 

 

第一類生日攻擊:

              就是說,n個輸入,其中有一個輸出H(x),那我要多少個y才能使H(y)=H(x)的概率達到0.5?

 

              答案是2/n個。假如輸出為m位長,那么就有2m個輸出。引出了第二類生日攻擊

 

第二類生日攻擊:

 

              k~=2m/2,說明了散列值不能小於128位啊。

 

 

 模差分攻擊:

 

              最有效的方法,也叫比特追蹤法。這個假期研究研究。

 

生日攻擊的方法

 

設h:X->Y是一個Hash函數,X和Y都是有限的,並且|X|>=2|Y|,記|X|=m,|Y|=n。顯然至少有n個碰撞,問題是如何去找到這些碰撞。一個很自然的方法是隨機選擇k個不同的元素x1,x2,x3,.....,xk ∈X,計算yI=h(xi),1<=i<=k,然后確定是否有一個碰撞發生。這個過程類似於把k個球隨機地扔到n個箱子里邊,然后檢查看是否某一箱子里邊至少有兩個球。k個球對應於k個隨機數x1,x2,x3,.....,xk,n個箱子對應於Y中的n個可能的元素。我們將計算用這種方法找到一個碰撞的概率的下界,該下界只依賴於k和n,而不依賴於m。

 

因為我們關心的是碰撞概率的下界,所以可以假定對所有y∈Y,有|h-1(y)|≈m/n。這個假定是合理的,這是因為如果原像集h-1(y)( y∈Y)不是近似相等的,那么找到一個碰撞的概率將增大。

 

因為原像集h-1(y)( y∈Y)的個數都近似相等,並且xI(1<=i<=k)是隨機選擇的,所以可將yI=h(xi),1<=i<=k視作Y中的隨機元素(yi(1<=i<=k)未必不同)。但計算k個隨機元素y1,y2, .....yk∈Y是不同的概率是一件容易的事情。依次考慮y1,y2, .....yk。y1可任意地選擇;y2 ≠y1的概率為1-1/n;y3 ≠y1 ,y2的概率為1-2/n;.....;yk ≠y1,y2, .....,yk-1的概率為1-(k-1)/n。

 

因此,沒有碰撞的概率是(1-1/n)(1-2/n).....(1-(k-1)/n)。如果x是一個比較小的實數,那么1-x≈e-x,這個估計可由下式推出:e-x=1-x+x2/2!-x3/3!+ .....。現在估計沒有碰撞的概率(1-1/n)(1-2/n).....(1-(k-1)/n)約為e-k(k-1)/2n。我們設ε是至少有一個碰撞的概率,則ε≈1-e-k(k-1)/2n,從而有k2-k≈nln(1/(1-ε)2)。去掉-k這一項,我們有k2≈nln(1/(1-ε)2),即k≈sqrt(nln(1/(1-ε)2))。

 

如果我們取ε=0.5,那么k≈1.17 sqrt(n)。這表明,僅sqrt(n)個X的隨機的元素就能以50%的概率產生一個碰撞。注意ε的不同選擇將導致一個不同的常數因子,但k與sqrt(n)仍成正比例。

 

如果X是一個教室中的所有學生的集合,Y是一個非閏年的365天的集合,h(x)表示學生x的生日,這時n=365,ε=0.5,由k≈1.17 sqrt(n)可知,k≈22.3。因此,此生日問題的答案為23。

 

生日攻擊隱含着消息摘要的長度的一個下界。一個40比特長的消息摘要是很不安全的,因為僅僅用2^20(大約一百萬)次隨機Hash可至少以1/2的概率找到一個碰撞。為了抵抗生日攻擊,通常建議消息摘要的長度至少應取為128比特,此時生日攻擊需要約2^64次Hash。安全的Hash標准的輸出長度選為160比特是出於這種考慮。

 

中間相遇攻擊是生日攻擊的一種變形,它不比較Hash值,而是比較鏈中的中間變量。這種攻擊主要適用於攻擊具有分組鏈結構的Hash方案。中間相遇攻擊的基本原理為:將消息分成兩部分,對偽造消息的第一部分從初試值開始逐步向中間階段產生r1個變量;對偽造消息的第二部分從Hash結果開始逐步退回中間階段產生r2個變量。在中間階段有一個匹配的概率與生日攻擊成功的概率一樣。

 

在修正分組攻擊中,為了修正Hash結果並獲得期望的值,偽造消息和一個分組級聯。這種攻擊通常應用於最后一個組,因此也稱為修正最后分組攻擊。差分分析是攻擊分組密碼的一種方法。這種攻擊也可用來攻擊某些Hash算法。

 

 

2、MD5算法

 

   MD5是一種摘要算法,所以理論上是不可能從簽名取得原文。認為要從MD5的結果中取得原文才算破解,本身就是對摘要算法的誤解。它通常應用於數字簽名中,用於標識原文的原始性--即在簽名后未作任何的修改。如果可以用不同的原文可以產生相同的簽名,這也就意味着簽名可能失效,就已經可以證明這種摘要算法的不安全。

 

  MD5是一個在國內外有着廣泛的應用的雜湊函數算法,它曾一度被認為是非常安全的。然而,王小雲教授發現,可以很快的找到MD5的“碰撞”,就是兩個文件可以產生相同的“指紋”。這意味着,當你在網絡上使用電子簽名簽署一份合同后,還可能找到另外一份具有相同簽名但內容迥異的合同,這樣兩份合同的真偽性便無從辨別。王小雲教授的研究成果證實了利用MD5算法的碰撞可以嚴重威脅信息系統安全,這一發現使目前電子簽名的法律效力和技術體系受到挑戰。因此,業界專家普林斯頓計算機教授Edward Felten等強烈呼吁信息系統的設計者盡快更換簽名算法,而且他們強調這是一個需要立即解決的問題。

 

3、2017年google公司SHA-1的安全性

 

2017年2月23日,Google經過兩年的研究,表示其已經成功破解了SHA-1加密,具體的詳情在90天之后我們就能知道(根據Google的披露原則)。同時,還發布了兩份特制 PDF 文檔,它們擁有相同的SHA-1值,但是內容卻不盡相同。谷歌公司多年來一直主張棄用SHA-1方案,特別是在TLS證書簽署等場景之下。早在2014年,Chrome小組就宣布將逐漸淘汰對SHA-1的使用。Google希望自己針對SHA-1完成的實際攻擊能夠進一步鞏固這一結論,讓更多人意識到其已經不再安全可靠。

關於SHA-1的安全性,早在2005年,密碼學家就證明SHA-1的破解速度比預期提高了2000倍,雖然破解仍然是極其困難和昂貴的,但隨着計算機變得越來越快和越來越廉價, SHA-1 算法的安全性也逐年降低,已被密碼學家嚴重質疑,希望由安全強度更高的 SHA-2 替代它。但是現在還是有好多領域在使用SHA-1。SHA-1 被業內廣泛用於數字簽名、文件 完整性驗證、以及保護廣泛的數字資產(包括信用卡交易、電子文檔、開源軟件資源庫與 軟件更新等)的加密標准。

互聯網的出現給人們的生活或者工作帶來了極大的方便。但是隨着計算機被廣泛應用的信息時代,面對越來越多的信息。如何保護信息的安全越來越顯得重要。特別是在網絡化的 今天,我們的很多信息暴露在網上,比如出生證明、身份信息、信用卡信息、學籍信息等。如果我們不對這些信息加以保護,那將給我們的生活帶來危害。哈希算法在我們日常網絡安 全、代碼倉庫安全、甚至是確認文件的完整性方面都扮演着重要的角色。比如我們在登錄系統時,將我們的登錄密碼進行哈希后再保存起來,可以防止存放賬號密碼的數據庫被人入侵 時,破壞者仍然不知道我們的密碼。

 

4、散列函數安全性

 

有兩種方法可以攻擊安全散列函數:密碼分析法和暴力攻擊法。散列函數抵抗暴力攻擊的強度完全依賴於算法生成的散列碼長度。Van Oorschot和Wiener曾經提出,花費1000萬美元涉及一個被專門用來搜索MD5算法碰撞的機器,則平均24天內就可以找到一個碰撞。


        2004年8月中國密碼學家王小雲教授等首次公布了提出一種尋找MD5碰撞的新方法。目前利用該方法用普通微機幾分鍾內即可找到MD5的碰撞。MD5已經唄徹底攻破。

 

 

Hash函數的安全要求

 

1.單向性:對任何給定的散列碼h,找到滿足H(x)=h的x在計算上是不可行的。

單向散列函數的說明

  單向散列函數也稱為消息摘要函數, 哈希函數 或者 雜湊函數

    單向散列函數輸出的散列值又稱為消息摘要 或者 指紋

單向散列函數的特點:
 
   (1) 加密后密文的長度是定長的(即對任意長度的消息三列,得到的散列值是定長的
   (2) 散列計算速度快,非常高效
   (3) 如果明文不一樣,那么散列后的結果一定不一樣
     ( 4)如果明文一樣,那么加密后的密文一定一樣(對相同數據加密,加密后的密文一樣)
     (5) 所有的加密算法是公開的
     (6) 具備單向性,不可以逆推反算




2.抗弱碰撞性:對任何給定的消息x,找到滿足y≠x且H(x)=H(y)的y在計算上是不可行的。

當給定某條消息的散列值時,單向散列函數必須確保要找到和該條消息具有相同散列值的另外一條消息是非常困難的。


3.抗強碰撞性:找到任何滿足H(x)=H(y)的偶對(x,y)在計算上是不可行的。

是指要找到散列值相同的兩條不同的消息是非常困難的。

 

5、安全散列函數

安全散列函數結構:

因為所需的安全散列長度越來越長,因此我們可以使用有限定義域上的散列函數(俗稱壓縮函數)通過迭代方式拓展為具有無限定義域的散列函數。而最為代表性的就Merkle-Damgard結構
 
 
 
 
 
這個結構的好處是,如果壓縮函數是抗碰撞的,那經過此結構處理后的散列函數也是抗碰撞的。
SM3,HMAC就是基於這種結構,因為Merkle-Damgard結構並不能抵抗擴展攻擊,因此HMAC引入了Key。
 
 

三、結合md5算法中的選擇前綴碰撞以及第二個鏈接中的helloworld.exe和goodbyworld.exe兩個可執行文件的md5消息摘要值和兩個文件的執行結果說明md5算法在驗證軟件完整性時可能出現的問題。

 

 

MD5算法:

 

       輸入消息:長度小於264,以512位一組。

 

       輸出消息:128位

 

過程:

 

1.消息填充:將消息長度填充至差64位就是512的倍數。那64位是表示填充長度的,是先從低位表示填充長度的。

2.填充后的消息是512的倍數,然后按512分組,每組又是16個32位長的字。

3.初始化中間結果:128位的緩存區來存儲中間結果,對其初始化4個32位長的寄存器分別存放四個固定的整數。

4.迭代壓縮:每個分組經壓縮函數HMD5處理。

 

      那就說說這個壓縮函數,HMD5有四輪處理,四個輪函數結構相同但是邏輯函數不同。

 

5.    輸出:最后一個HMD5的輸出即為消息摘要。

 

 

MD5算法具有以下特點

 

1、壓縮性:任意長度的數據,算出的MD5值長度都是固定的。

 

2、容易計算:從原數據計算出MD5值很容易。

 

3、抗修改性:對原數據進行任何改動,哪怕只修改1個字節,所得到的MD5值都有很大區別。

 

4、強抗碰撞:已知原數據和其MD5值,想找到一個具有相同MD5值的數據(即偽造數據)是非常困難的。

 

MD5的作用是讓大容量信息在用數字簽名軟件簽署私人密鑰前被"壓縮"成一種保密的格式(就是把一個任意長度的字節串變換成一定長的十六進制數字串)。除了MD5以外,其中比較有名的還有sha-1、RIPEMD以及Haval等。

 

數據校驗是為保證數據的完整性進行的一種驗證操作。通常用一種指定的算法對原始數據計算出的一個校驗值,接收方用同樣的算法計算一次校驗值,如果兩次計算得到的檢驗值相同,則說明數據是完整的。

 

 

數據完整性校驗

         檢查數據有沒有被篡改過,這里取個例子。當用Android手機進行OTA升級的時候,下載完升級包(不管是全升包還是增量包),緊接着就是用該升級包的標准MD5進行驗證,如果校驗的結果等於標准的MD5值,那么就證明這個升級包沒有被篡改過。

 

一個MD5摘要可以對應多個原文,從而使得MD5加密算法變得不可逆,就因為這樣,假如數據庫中存着一個用戶密碼的MD5摘要,當用戶登錄時,需要將用戶輸入的密碼轉換為MD5摘要並與數據庫中對應用戶的MD5摘要進行比對,那么這樣豈不是意味着用戶輸入了一個錯誤的密碼而剛好這個錯誤密碼的摘要恰好與數據庫中的摘要匹配成功,這不就等於使用了錯誤密碼但是登錄成功了。
 
MD5算法中,需要初始鏈接變量,作為算法第一輪運算的基礎,它作為MD5算法的初始值,可以想象,就算是同一段原文在進行MD5生成時,只要鏈接變量不一樣,生成的MD5校驗值也是不一樣的。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM