单向散列函数
文章目錄
- 單向散列函數(shù)
- 單向散列函數(shù)的性質(zhì)
- 單向散列函數(shù)的實現(xiàn)
- 對單向散列算法的攻擊
單向散列函數(shù)
在介紹單向散列函數(shù)之前,我們先了解一下什么情況下需要使用到單向散列函數(shù)。
如果你需要從國外的網(wǎng)站上下載一個軟件,但是因為種種原因,國外的網(wǎng)絡(luò)太慢了,下載幾個G的數(shù)據(jù)幾乎是不可能的。剛好國內(nèi)有鏡像網(wǎng)站,可以從國內(nèi)下載數(shù)據(jù)。但是如何保證國內(nèi)的鏡像不是被篡改過后的呢?這個時候就需要單向散列函數(shù)了。一般來說網(wǎng)站會提供MD5或者SHA的值作為驗證值。
單向散列函數(shù)有一個輸入和輸出。輸入稱為消息,輸出稱為散列值。
散列值的長度跟消息的長度無關(guān),不論多少大小的長度的消息,都會計算出固定長度的散列值。
單向散列函數(shù)的性質(zhì)
單向散列函數(shù)具有下面幾個特性:
能夠根據(jù)任意長度的消息計算出固定長度的散列值。
計算速度要快。
消息不同,散列值也不同。
這就意味著,如果僅僅是一點點的變動都會引起整個散列值的巨大變化。
因為散列值的大小是固定的,所以有可能會出現(xiàn)不同的消息產(chǎn)生相同散列值的情況。這種情況叫做碰撞。
難以發(fā)現(xiàn)碰撞的性質(zhì)被稱為抗碰撞性。當(dāng)給定某條消息的散列值時,必須保證很難找到和該消息具有相同散列值的另一條消息。
單向散列函數(shù)必須具有單向性。所謂單向性是指無法通過散列值來反推出消息的性質(zhì)。
單向散列函數(shù)的實現(xiàn)
單向散列函數(shù)有很多實現(xiàn)方式,你甚至可以自己寫一個。常見的如MD4,MD5, MD(Message Digest)是消息摘要的縮寫。
MD4和MD5是由Rivest在1990年設(shè)計的,現(xiàn)在已經(jīng)不再安全了。
SHA-1 是由NIST設(shè)計的一種能夠產(chǎn)生160比特散列值的單向散列函數(shù)。現(xiàn)在已經(jīng)不推薦使用。
SHA-256, SHA-384, SHA-512同樣是由NIST設(shè)計的單向散列函數(shù),他們的散列長度分別是256,384,512比特。這幾種單向散列函數(shù)統(tǒng)稱為SHA-2。
SHA-1已經(jīng)在2005年被攻破了。
SHA-3是在2005年SHA-1被攻破的背景下開始制定的,SHA-3是通過公開競爭的方法選拔出來的,最終被選中的算法叫做Keccak算法。
對單向散列算法的攻擊
單向散列算法最后的hash值是有固定長度的,所以只要我們愿意,總是可以不斷的重試,從而找到兩個相同的hash值。
更多精彩內(nèi)容且看:
- 區(qū)塊鏈從入門到放棄系列教程-涵蓋密碼學(xué),超級賬本,以太坊,Libra,比特幣等持續(xù)更新
- Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續(xù)更新
- Spring 5.X系列教程:滿足你對Spring5的一切想象-持續(xù)更新
- java程序員從小工到專家成神之路(2020版)-持續(xù)更新中,附詳細文章教程
更多教程請參考 flydean的博客
總結(jié)
- 上一篇: Scala的自定义类型标记
- 下一篇: 混合密码系统