在刑事偵查中,偵查員會用到指紋,在計算機中,使用單向散列函數(shù)就可以獲取消息的指紋,通過對比指紋,就能夠知道兩條消息是否一致
什么是單向散列函數(shù)
單向散列函數(shù)有一個輸入和一個輸出,其中輸入稱為消息,輸出稱為散列值,單向散列函數(shù)可以根據(jù)消息的內(nèi)容計算出散列值,而散列值就可以被用來檢查消息的完整性。
這里的消息可以是文字、圖像文件或者聲音文件。單向散列函數(shù)不需要知道消息實際代表的含義,任何消息,單向散列函數(shù)都會將它作為單純的比特序列來處理,即根據(jù)比特序列計算出散列值。
散列值長度和消息的長度無關(guān),1比特、100GB,單向散列函數(shù)都會計算出固定長度的散列值。 SHA-256所計算出的散列值的長度永遠是256比特(32字節(jié))
單向散列函數(shù)的性質(zhì)
兩個不同的消息產(chǎn)生同一個散列值的情況稱為碰撞,如果要將單向散列函數(shù)用于完整性的檢查,則需要確保在事實上不可能被人為地發(fā)現(xiàn)碰撞。
難以發(fā)現(xiàn)碰撞的性質(zhì)稱為抗碰撞性,密碼技術(shù)中所使用的單向散列函數(shù),都需要具備抗碰撞性。
單向散列函數(shù)必須確保要找到和該條消息具有相同散列值的另外一條消息是非常困難的。這一性質(zhì)稱為弱抗碰撞性。單向散列函數(shù)都必須具備弱抗碰撞性。
要找到散列值相同的兩條不同的消息使非常困難的 這一性質(zhì)稱為強抗碰撞性,在這里,散列值可以是任意值。單向散列函數(shù)都必須具備強抗碰撞性。
單向散列函數(shù)必須具備單向性,單向散列函數(shù)并不是一種加密,因此無法通過解密將散列值還原為原來的消息。
單向散列函數(shù)也稱為消息摘要函數(shù)、哈希函數(shù)、雜湊函數(shù)
單向散列函數(shù)的實際應(yīng)用
檢測軟件是否被篡改
很多軟件都會通過單向散列函數(shù)計算出的散列值公布在自己的官方網(wǎng)站上,用戶在下載到軟件之后,可以自行計算散列值,然后與官方網(wǎng)站上公布的散列值進行對比。
基于口令的加密
單向散列函數(shù)也被用于基于口令的加密(PBE)
PBE的原理是將口令和鹽(salt 通過偽隨機數(shù)生成器產(chǎn)生的隨機數(shù))混合后計算其散列值,然后將這個散列值用作加密的秘鑰。
消息認證碼
使用單向散列函數(shù)可以構(gòu)造消息認證碼
消息認證碼是將“發(fā)送者和接受者之間的共享密鑰”和“消息”進行混合后計算出的散列值。使用消息認證碼可以檢測并防止通信過程中的錯誤、篡改以及偽裝。
數(shù)字簽名
在進行數(shù)字簽名時也會使用單向散列函數(shù)
數(shù)字簽名是現(xiàn)實社會中的簽名和蓋章這樣的行為在數(shù)字世界中的實現(xiàn)。數(shù)字簽名的處理過程非常耗時,因此一般不會對整個消息內(nèi)容直接施加數(shù)字簽名,而是先通過單向散列函數(shù)計算出消息的散列值,然后再對整個散列值施加數(shù)字簽名。
偽隨機數(shù)生成器
使用單向散列函數(shù)可以構(gòu)造偽隨機數(shù)生成器
密碼技術(shù)中所使用的隨機數(shù)需要具備“事實上不可能根據(jù)過去的隨機數(shù)預(yù)測未來的隨機數(shù)列”這樣的性質(zhì)。為了保證不可預(yù)測性,可以利用單向散列函數(shù)的單向性。
一次性口令
使用單向散列函數(shù)可以構(gòu)造一次性口令一次性口令經(jīng)常被用于服務(wù)器對客戶端的合法性認證。在這種方式中,通過使用單向散列函數(shù)可以保證口令只在通信鏈路上傳送一次,因此即使竊聽者竊取了口令,也無法使用。
單向散列函數(shù)的具體例子
MD4、MD5
MD4現(xiàn)在已經(jīng)不安全了。
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能夠產(chǎn)生160比特的散列值的單向散列函數(shù),不過它已經(jīng)被列入“可謹慎運用的密碼清單”,即除了用于保持兼容性的目的以外,其他情況下都不推薦使用。
SHA-256、SHA-384、SHA-512的散列長度分別為256比特、384比特和512比特,這些單向散列函數(shù)合起來統(tǒng)稱SHA-2,它們的消息長度也存在上限(SHA-256的上限接近于264比特,SHA-384和SHA-512的上限接近于2128比特)
SHA-1的強抗碰撞性已于2005年被攻破也就是說,現(xiàn)在已經(jīng)能夠產(chǎn)生具備相同散列值的兩條不同的消息,不過SHA-2還尚未被攻破。
RIPEMD-160
RIPEMD-160已經(jīng)被列入“可謹慎運用的密碼清單”即除了用于保持兼容性的目的以外,其他情況下都不推薦使用。
RIPEMD的強抗碰撞性已經(jīng)與2004年被攻破,但RIPEMD-160還尚未被攻破,比特幣使用的就是RIPEMD-160
SHA-3
SHA-3是一種作為新標準發(fā)布的單向散列函數(shù)算法,用來替代在理論上已被找出攻擊方法的SHA-1算法,于2012年正式確定將Keccak算法作為SHA-3標準。
Keccak最終被選為SHA-3的理由如下
- 采用了與SHA-2完全不同的結(jié)構(gòu)
- 結(jié)構(gòu)清晰,易于分析
- 能夠適用于各種設(shè)備,也適用于嵌入式應(yīng)用
- 在硬件上的實現(xiàn)顯示出了很高的性能
- 比其他最終候選算法安全性邊際更大
Keccak采用了海綿結(jié)構(gòu),輸入的數(shù)據(jù)在進行填充之后,要經(jīng)過吸收階段和基礎(chǔ)階段,最終生成輸出的散列值。
Keccak可以生成任意長度的散列值,但為了配合SHA-2的散列值長度,SHA-3標準中共規(guī)定了SHA3-224、SHA3-256、SHA3-384、SHA3-512這4種版本。在輸入數(shù)據(jù)的長度上限方面,SHA-1為264-1比特,SHA-2為2128-1比特,而SHA-3則沒有長度限制。
對Keccak的攻擊
Keccak之前的單向散列函數(shù)都是通過循環(huán)執(zhí)行壓縮函數(shù)的方式來生成散列值的,這種方式稱為MD結(jié)構(gòu),MD4、MD5、RIPEMD、RIPEMD-160、SHA-1、SHA-2等幾乎所有的傳統(tǒng)單向散列函數(shù)算法都是基于MD結(jié)構(gòu)的。
Keccak采用了和MD結(jié)構(gòu)完全不同的海綿結(jié)構(gòu),因此針對SHA-1的攻擊方法對Keccak是無效的。目前還沒有出現(xiàn)能夠?qū)嶋H應(yīng)用中的Keccak算法形成威脅的攻擊方法。
應(yīng)該怎么選擇單向散列函數(shù)
MD5是不安全的,因此不應(yīng)該使用。
SHA-1除了用于對過去生成的散列值進行校驗之外,不應(yīng)該被用于新的用途,而是應(yīng)該遷移到SHA-2
SHA-2有效應(yīng)對了針對SHA-1的攻擊方法,因此是安全的,可以使用
SHA-3是安全的,可以使用
SHA-2(SHA-256、SHA-384、SHA-512)被列入了“電子政府推薦使用的密碼清單”中。
對單項散列函數(shù)的攻擊
暴力破解
利用文件的冗余性生成具有相同散列值的另一個文件,這就是一種針對單向散列函數(shù)的攻擊。
尋找和"100萬元合同"具備相同散列值的另一條不同的消息,這相當(dāng)于一種視圖破解單向散列函數(shù)的”弱抗碰撞性“的攻擊這種情況下,暴力破解的次數(shù)根據(jù)散列值的長度計算出來,以SHA3-512為例,長度為512比特,最多需要嘗試2512次就能夠找到目標消息了,如此多的嘗試次數(shù)在現(xiàn)實中是不可能完成的。
找出具有指定散列值的消息的攻擊分為兩種,即原像攻擊和第二原像攻擊,原像攻擊是指給定一個散列值,找出具有該散列值的任意消息,第二原像攻擊是指給定一條消息1, 找出另外一條消息2,消息2的散列值和消息1相同。
生日攻擊
生日攻擊的原理來自生日悖論,也就是利用了任意散列值一致的概率比想象中要高
注意:
在 N 個人中,保證至少有兩個人生日一樣的概率大于二分之一,那么 N 至少是多少?
先計算 N 個人生日全都不一樣的概率,然后再用1減去這個值就可以了,最后發(fā)現(xiàn)當(dāng) N 取23時,概率為0.507297,大于二分之一。
Mallory所進行的生日攻擊的步驟如下:
1、Mallory生成 N 個100萬元合同
2、Mallory生成 N 個1億元合同
3、Mallory將1的 N 個散列值和2的 N 個散列值進行對比,尋找其中是否有一致的情況
4、如果找出了一致的情況,則利用這一組100萬元合同和1億元合同來欺騙Alice
以512比特的散列值為例,對單向散列函數(shù)進行暴力破解所需要的嘗試次數(shù)為2512次,而對同一單向散列函數(shù)進行生日攻擊所需的嘗試次數(shù)為2256次,因此和暴力破解相比,生日攻擊所需的嘗試次數(shù)要少的多。
單項散列函數(shù)無法解決的問題
單項散列函數(shù)能夠辨別出“篡改”,但無法辨別出“偽裝”
注意:此處的偽裝例如:主動攻擊者Mallory偽裝成Alice,向Bob同時發(fā)送了消息和散列值,這時Bob能夠通過單向散列函數(shù)檢查消息的完整性,但是這只是針對發(fā)送的消息進行檢查,而無法檢查出發(fā)送者的身份是否被Mallory進行了偽裝。
用于認證的技術(shù)包括消息認證碼和數(shù)字簽名消息認證碼能夠向通信對象保證消息沒有被篡改,而數(shù)字簽名不僅能夠向通信對象保證消息沒有被篡改,還能夠向所有第三方做出這樣的保證。