定義:算法
Hash函數H將可變長度的數據塊M做爲輸入,產生固定長度的Hash值h = H(M)。安全
稱M是h的原像。由於H是多對一的映射,因此對於任意給定的Hash值h,對應有多個原像。若是知足x≠y且H(x)=H(y),則稱爲碰撞。併發
應用:函數
用於驗證數據的完整性,即判斷數據是否被篡改過。加密
密碼學Hash函數的定義:spa
在安全應用中使用的Hash函數。操作系統
密碼學Hash函數的應用:設計
一、消息認證3d
Hash碼可以經過以下不一樣方法用於提供消息認證對象
a) 使用對稱密碼E加密消息和Hash碼,因爲只有A和B共享密鑰K,因此消息必然發自A處,且可經過驗證Hash碼證實數據在傳輸過程當中未被更改。
b) 使用對稱密碼只對Hash碼加密。因爲明文無需加密性的應用,這種方案大大減小了加密操做的負擔。
c) 不使用加密算法,僅使用Hash函數實現消息驗證。該方案中,通訊雙方共享相同的祕密值S,發送方A將消息M和祕密值S串聯後計算其Hash值,並將獲得的Hash值附在消息M後發送。由於接收方B同時掌握S值,因此可以從新計算該Hash值進行驗證。
d) 在方案c的基礎上將整個消息和Hash值加密,以提供保密性。
處於成本和速度方面的考慮,人們愈來愈對那些不包含加密函數的方法感興趣,所以b和c方案更受青睞,不過若是對整個消息有加密型要求,則a和d仍具備實際意義。
實際應用中,消息認證一般使用消息認證碼(MAC)實現。MAC函數將通訊雙方共享的密鑰和數據塊做爲輸入,產生Hash值做爲MAC碼,而後將MAC碼和受保護的消息一塊兒傳遞或存儲。須要檢查消息的完整性時,使用MAC函數對消息從新計算,並將計算結果與存儲的MAC碼對比。MAC提供安全保護,用於抵抗不知道密鑰的攻擊者的攻擊。在實現中,每每使用比加密算法效率更高的特殊設計的MAC函數。
二、數字簽名
數字簽名的應用比消息認證更加普遍。主要有以下兩種方案:
a) 使用發送方的私鑰利用公鑰密碼算法對Hash碼進行加密。這種方法也可提供認證;因爲只有發送方能夠產生加密後的Hash碼,因此這種方法也提供了數字簽名。
b) 若既但願保證保密性又但願有數字簽名,則先用發送方的私鑰對Hash碼加密,再用對稱密碼中的密鑰對象消息和公鑰算法加密結果進行加密,這種技術比較經常使用。
三、其餘應用
對於Hash函數,一般還被用於產生單向口令文件。在操做系統中,存儲口令的Hash值而不是口令自己,當用戶輸入口令時,操做系統將比對輸入口令的Hash值和存儲在口令文件中的Hash值來進行用戶驗證。
Hash函數還能用於入侵檢測和病毒檢測。將每一個文件的Hash值H(F)存儲在安全系統中(如CD-R),隨後就能經過從新計算H(F)來判斷文件是否被修改過。入侵者只可以改變F,而不能改變H(F)
密碼學Hash函數可以用於構建隨機函數PRF或用做僞隨機數發生器。基於Hash函數的PRF可用於對稱密碼中的密鑰產生。
密碼學Hash函數的安全性需求
弱Hash函數:只知足以上前五個要求的Hash函數。
強Hash函數:知足以上前六個要求的Hash函數。
強Hash函數可以保證免受如下攻擊:假設Bob寫一條借據消息併發送給Alice,Alice在借據上簽名承認。Bob若是能找到兩條消息具備一樣的Hash值,其中一個借據消息要求Alice歸還金額較小,另外一個金額很大,那麼讓Alice簽下第一個小額借據後,Bob就能聲稱第二個借據是真實的(將Alice在第一個借據的簽名附到第二個借據中)。
下圖展現了抗原像攻擊、抗弱碰撞攻擊和抗強碰撞攻擊三者之間的關係
在傳統觀念中並無把僞隨機性做爲密碼學Hash函數的安全性需求,但在實際應用中或多或少有所要求。密碼學Hash函數一般用於密鑰產生、僞隨機數發生器以及消息完整性應用,上述三個應用都要求Hash函數的輸出是隨機的。
對Hash函數的攻擊
一、窮舉攻擊
a) 原像攻擊和第二原像攻擊
攻擊者對給定的Hash值h,試圖找到知足H(y) = h的y。窮舉攻擊的方法是隨機選擇y,嘗試計算其Hash值知道碰撞出現。對於m位的Hash值,窮舉的規模大約是2m,對於攻擊者平均嘗試次數爲2m-1,才能找到一個知足H(y)=h的y值。
b) 碰撞攻擊
對於碰撞攻擊,攻擊者試圖找到兩個消息或數據塊x和y,知足H(x)=H(y),與原像攻擊和第二原像攻擊相比,其窮舉的規模相對更小一些,這也經過數學上的生日悖論獲得印證。本質上,若是咱們在均勻分佈的0到N-1的範圍內選擇隨機整數變量,那麼在N1/2次選擇後發生重複的機率就會超過0.5。所以,對於m位的Hash值,若是咱們隨機選擇數據塊,預計在2m/2次嘗試後就能找到兩個具備相同Hash值的數據塊。
Yuval提出如下策略進行碰撞攻擊:
一、發送方A準備對文本消息x進行簽名(還沒有簽名,但可預期要簽名的文件內容),其使用的方法是:用A的私鑰對m位的Hash碼加密並將加密後的Hash碼附於消息以後。
二、攻擊者產生該消息x的2m/2種變式x',每種變式都表達相同的意義,將這些消息以及對應的Hash值存儲起來。
產生多個具備相贊成義的變式並不難,例如攻擊者能夠在文件的詞與詞之間插入若干「空格-空格-退格」字符對,而後在實例中用「空格-退格-空格」替代這些字符,從而產生各類變式。攻擊者也能夠簡單地改變消息中的某些詞但不改變消息的意義。
三、攻擊者準備僞造一條消息y,並想獲取A的簽名,只須要僞造y的變式y',而後計算H(y'),並與全部的H(x')進行比對,直到碰撞出現。
四、攻擊者將發生碰撞的消息x'提供給A簽名,而後將該簽名附於僞造消息y'後。這樣攻擊者就在不知道A密鑰的狀況下得到了有A數字簽名的消息y',並能夠此獲利。
二、密碼分析
對Hash函數的密碼分析攻擊,也是利用算法的某種性質而不是經過窮舉來進行攻擊的。理想的Hash函數算法要求密碼分析攻擊所需的代價大於或等於窮舉攻擊所需的代價。