單向散列函數
在介紹單向散列函數之前,我們先了解一下什麼情況下需要使用到單向散列函數。
如果你需要從國外的網站上下載下傳一個軟體,但是因為種種原因,國外的網絡太慢了,下載下傳幾個G的資料幾乎是不可能的。剛好國内有鏡像網站,可以從國内下載下傳資料。但是如何保證國内的鏡像不是被篡改過後的呢?這個時候就需要單向散列函數了。一般來說網站會提供MD5或者SHA的值作為驗證值。
單向散列函數有一個輸入和輸出。輸入稱為消息,輸出稱為散列值。
散列值的長度跟消息的長度無關,不論多少大小的長度的消息,都會計算出固定長度的散列值。
單向散列函數的性質
單向散列函數具有下面幾個特性:
- 能夠根據任意長度的消息計算出固定長度的散列值。
- 計算速度要快。
-
消息不同,散列值也不同。
這就意味着,如果僅僅是一點點的變動都會引起整個散列值的巨大變化。
因為散列值的大小是固定的,是以有可能會出現不同的消息産生相同散列值的情況。這種情況叫做碰撞。
難以發現碰撞的性質被稱為抗碰撞性。當給定某條消息的散列值時,必須保證很難找到和該消息具有相同散列值的另一條消息。
- 單向散列函數必須具有單向性。所謂單向性是指無法通過散列值來反推出消息的性質。
單向散列函數的實作
單向散列函數有很多實作方式,你甚至可以自己寫一個。常見的如MD4,MD5, MD(Message Digest)是消息摘要的縮寫。
MD4和MD5是由Rivest在1990年設計的,現在已經不再安全了。
SHA-1 是由NIST設計的一種能夠産生160比特散列值的單向散列函數。現在已經不推薦使用。
SHA-256, SHA-384, SHA-512同樣是由NIST設計的單向散列函數,他們的散列長度分别是256,384,512比特。這幾種單向散列函數統稱為SHA-2。
SHA-1已經在2005年被攻破了。
SHA-3是在2005年SHA-1被攻破的背景下開始制定的,SHA-3是通過公開競争的方法選拔出來的,最終被選中的算法叫做Keccak算法。
對單向雜湊演算法的攻擊
單向雜湊演算法最後的hash值是有固定長度的,是以隻要我們願意,總是可以不斷的重試,進而找到兩個相同的hash值。
更多教程請參考 flydean的部落格