密碼技術(shù)(七、二)之單向散列函數(shù)

單向散列函數(shù)
??——獲取消息的“指紋”

單向散列函數(shù)具體例子

MD4、MD5

?MD4是由Rivest 于1990年設(shè)計的單向散列函數(shù),能夠產(chǎn)生128比特的散列值。不過,雖則Dobbertin提出尋找MD4散列碰撞方法,現(xiàn)在它已經(jīng)不安全了。
?MD5是由Rivest于1991年設(shè)計的單向散列函數(shù),能夠產(chǎn)生128比特的散列值。MD5的強抗碰撞性已經(jīng)被攻破,也就是說,現(xiàn)在已經(jīng)能夠產(chǎn)生具備相同散列值的兩條不同的消息,因此它也已經(jīng)不安全了。
MD4和MD5的MD是消息摘要(Message Digest)的縮寫。

SHA-1、SHA-256、SHA-384、SHA-512

?SHA-1是由NIST(National Institue of Standards and Technology ,美國國家標準計算研究所)設(shè)計的一種能夠產(chǎn)生160比特的散列值的單向散列函數(shù)。1993年別作為美國聯(lián)邦信息處理標準規(guī)格發(fā)布的是SHA,1995年發(fā)布修訂版FIPS PUB 180-1稱為SHA-1。在《CRYPTREC密碼清單》中,SHA-1已經(jīng)被列入“可謹慎運用的密碼清單”,即除了用于保持兼容性的目的以外,其他情況都不推薦使用。
?SHA-256、SHA-384和SHA512都是由NIST設(shè)計的單向散列函數(shù),它們的散列值長度分別為256比特、384比特和512比特。這些單向散列函數(shù)合起來統(tǒng)稱為SHA-2,它們的消息長度也存在上限(SHA-256的上限近于264比特,SHA-384和SHA-512的上限接近于2128比特 )。這些單詞散列函數(shù)式于2002年和SHA-1一起作為FIPS PUB 180-2發(fā)布的。
?SHA-1的強抗碰撞性已于2005年被攻破,也就是說,現(xiàn)在已經(jīng)能夠產(chǎn)生具備相同散列值的兩條不同消息。不過SHA-2還尚未被攻破。
6種版本SHA-2

6種版本的SHA-2.png

RIPEMD-160

?RIPEMD 是與1996年由Hans Dobbertin、Antoon Bosselaers 和Bart Preneel 設(shè)計的一種能夠產(chǎn)生160比特的散列值單向散列函數(shù)。RIPEMD-160是歐盟RIPE項目所設(shè)計的RIPEMD單向散列函數(shù)的修訂版。這一系列的函數(shù)還包括RIPEMD-128、RIPEMD-256、RIPEMD-320等其他一些版本。在《CRYPTREC密碼清單》中,RIPEMD已經(jīng)被列入“可謹慎運用的密碼清單”,即除了用于保持兼容性的目的以外,其他情況都不推薦使用。
?RIPEMD的強碰撞性已于2004年被攻破,但RIPEMD-160還尚未被攻破。比特幣中使用的就是RIPEMD-160。

SHA-3

?SHA-3(Secure Hash Algorithm-3)是一種作為新標準發(fā)布的單向散列函數(shù)算法,用來替代在理論上已經(jīng)被找出攻擊方法的SHA-1算法。全世界的企業(yè)和密碼學家提交了SHA-3的候選方案很多,經(jīng)過5年的選拔,最終在2013年正式確定了將Keccak算法作為SHA-3的標準。
Keccak最終被選為SHA-3的理由如下:

  • 采用了與SHA-2完全不同的結(jié)構(gòu)
  • 結(jié)構(gòu)清晰,易于分析
  • 能歐適用于各種設(shè)備,也適用于嵌入式應用
  • 在硬件上的實現(xiàn)顯示出了很高的性能
  • 比其他最終候選算法安全性邊際更大

Keccak

?Keccak是一種被選定為SHA-3標準的單向散列函數(shù)算法。
?Keccak可以生成任意長度的散列值,但是為了配合SHA-2的散列值長度,SHA-3標準中共規(guī)定了SHA3-224、SHA-3-256、SHA3-384、SHA3-512這4個版本。在輸入數(shù)據(jù)的長度上限方面,SHA-1為264-1比特,SHA-2為2128-1比特,而SHA-3則沒有限制。
?此外FIPS202中還規(guī)定了兩個可輸出任意長度散列值的函數(shù)(extendable-output function,XOF),分別為SHAKE128和SHAKE256。據(jù)說SHAKE這個名字取自Secure Hash Algorithm 與Keccak這幾個單詞。

Keccak的結(jié)構(gòu)

?Keccak采用了海綿結(jié)構(gòu),輸入的數(shù)據(jù)在進行填充后,要經(jīng)過吸收階段擠出階段,最終生成輸出的散列值。
并且作為海綿結(jié)構(gòu)的變形, Keccak中還提出了一種雙共結(jié)構(gòu)。
這里關(guān)于 Keccak的結(jié)構(gòu),不做過多解讀,想詳細了解,請參考原著;

應該使用哪種單向散列

  • 首先MD5是不安全的,因此不應該使用。
  • SHA-1除了用于對過去生成散列值進行校驗外,不應該被用于新的用途,而是應該遷移到SHA-2。
  • SHA-2有效應對了SHA-1的攻擊方法,因此是安全的,可以使用。
  • SHA-3 是安全的,可以使用。
    和對稱密碼一樣,我們不應該使用任何自制算法。

對單向散列函數(shù)的攻擊

暴力破解
任何文件中都或多或少存在具有一定的冗余性。利用文件的冗余性生產(chǎn)具有相同散列值的另一個文件,這就是一種針對單向散列函數(shù)的攻擊。
在對密碼進行暴力破解時,我們就是按照順序改變密鑰,如0、1、2、3.....然后分別用這些密鑰進行解密的,對單向散列函數(shù)進行暴力破解也是如此,即每次都稍微改變一下消息的值,然后對這些消息求散列值。
現(xiàn)在我們在尋找的是一條具備特定散列值的消息,具備相同散列值的另一條不同的消息。這相當于一種試圖破解單向散列函數(shù)的“弱碰撞性”的攻擊 。在這種情況下,暴力破解需要嘗試的次數(shù),可以根據(jù)散列值的長度計算出來,以SHA3-512為例,由于它的散列值長度為512比特,因此最多只需要嘗試2^512次就能找到目標消息了,如此多的嘗試次數(shù)在現(xiàn)實中是不可能完成的。
由于嘗試次數(shù)純粹是由散列值的長度決定的,因此散列值的長度越長的單向散列函數(shù),其抵御暴力破解的能力也就越強。
找出具有指定散列值的消息的攻擊方式分為兩種,即“原像攻擊”和“第二原像攻擊”。原像攻擊(Pre-Image Attack)是指定一個散列值,找出具有該散列值的任意消息;第二原像攻擊(Second Pre-Image Attack)是指定一條消息1,找出另外一條消息2,消息2的散列值和消息1相同。

生日攻擊
要找到散列值相同的兩條消息,而散列值則可以是任意值。這樣的攻擊,一般稱為生日攻擊(birthday attack)或是沖突攻擊(collision attack),這是一種試圖破解單向散列函數(shù)的“強碰撞性”攻擊。
我們以512比特的散列值為例,對單向散列函數(shù)進行暴力破解所需要的嘗試次數(shù)2^512 次,而對同一單向散列函數(shù)進行生日攻擊所需要嘗試的次數(shù)2^256次,因此和暴力破解相比,生日攻擊所嘗試的次數(shù)要少的多。

單向散列函數(shù)無法解決的問題

單向散列函數(shù)能夠辨別出“篡改”,但無法辨別出“偽裝”。
當我們不僅需要確認文件的完整性,同時還需要確認這個文件是否真的屬于他的,我們還需要認證。


該系列的主要內(nèi)容來自《圖解密碼技術(shù)第三版》
我只是知識的搬運工
文章中的插圖來源于原著

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容