定義:
Hash函數H將可變長度的數據塊M作為輸入,產生固定長度的Hash值h = H(M)。
稱M是h的原像。因為H是多對一的映射,所以對於任意給定的Hash值h,對應有多個原像。如果滿足x≠y且H(x)=H(y),則稱為碰撞。
應用:
用於驗證數據的完整性,即判斷數據是否被篡改過。
密碼學Hash函數的定義:
在安全應用中使用的Hash函數。
密碼學Hash函數的應用:
1、消息認證
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函數。
2、數字簽名
數字簽名的應用比消息認證更加廣泛。主要有如下兩種方案:
a) 使用發送方的私鑰利用公鑰密碼算法對Hash碼進行加密。這種方法也可提供認證;由於只有發送方可以產生加密后的Hash碼,所以這種方法也提供了數字簽名。
b) 若既希望保證保密性又希望有數字簽名,則先用發送方的私鑰對Hash碼加密,再用對稱密碼中的密鑰對象消息和公鑰算法加密結果進行加密,這種技術比較常用。
3、其他應用
對於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函數的攻擊
1、窮舉攻擊
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提出以下策略進行碰撞攻擊:
1、發送方A准備對文本消息x進行簽名(尚未簽名,但可預期要簽名的文件內容),其使用的方法是:用A的私鑰對m位的Hash碼加密並將加密后的Hash碼附於消息之后。
2、攻擊者產生該消息x的2m/2種變式x',每種變式都表達相同的意義,將這些消息以及對應的Hash值存儲起來。
產生多個具有相同意義的變式並不難,例如攻擊者可以在文件的詞與詞之間插入若干“空格-空格-退格”字符對,然后在實例中用“空格-退格-空格”替代這些字符,從而產生各種變式。攻擊者也可以簡單地改變消息中的某些詞但不改變消息的意義。
3、攻擊者准備偽造一條消息y,並想獲取A的簽名,只需要偽造y的變式y',然后計算H(y'),並與所有的H(x')進行比對,直到碰撞出現。
4、攻擊者將發生碰撞的消息x'提供給A簽名,然后將該簽名附於偽造消息y'后。這樣攻擊者就在不知道A密鑰的情況下獲得了有A數字簽名的消息y',並可以此獲利。
2、密碼分析
對Hash函數的密碼分析攻擊,也是利用算法的某種性質而不是通過窮舉來進行攻擊的。理想的Hash函數算法要求密碼分析攻擊所需的代價大於或等於窮舉攻擊所需的代價。