在刑事偵查中叨恨,偵查員會用到指紋,在計(jì)算機(jī)中挖垛,使用單向散列函數(shù)就可以獲取消息的指紋痒钝,通過對比指紋,就能夠知道兩條消息是否一致
什么是單向散列函數(shù)
單向散列函數(shù)有一個輸入和一個輸出痢毒,其中輸入稱為消息送矩,輸出稱為散列值,單向散列函數(shù)可以根據(jù)消息的內(nèi)容計(jì)算出散列值哪替,而散列值就可以被用來檢查消息的完整性栋荸。
這里的消息可以是文字、圖像文件或者聲音文件凭舶。單向散列函數(shù)不需要知道消息實(shí)際代表的含義晌块,任何消息,單向散列函數(shù)都會將它作為單純的比特序列來處理帅霜,即根據(jù)比特序列計(jì)算出散列值匆背。
散列值長度和消息的長度無關(guān),1比特身冀、100GB钝尸,單向散列函數(shù)都會計(jì)算出固定長度的散列值。 SHA-256所計(jì)算出的散列值的長度永遠(yuǎn)是256比特(32字節(jié))
單向散列函數(shù)的性質(zhì)
兩個不同的消息產(chǎn)生同一個散列值的情況稱為碰撞搂根,如果要將單向散列函數(shù)用于完整性的檢查蝶怔,則需要確保在事實(shí)上不可能被人為地發(fā)現(xiàn)碰撞。
難以發(fā)現(xiàn)碰撞的性質(zhì)稱為抗碰撞性兄墅,密碼技術(shù)中所使用的單向散列函數(shù)踢星,都需要具備抗碰撞性。
單向散列函數(shù)必須確保要找到和該條消息具有相同散列值的另外一條消息是非常困難的隙咸。這一性質(zhì)稱為弱抗碰撞性沐悦。單向散列函數(shù)都必須具備弱抗碰撞性。
要找到散列值相同的兩條不同的消息使非常困難的 這一性質(zhì)稱為強(qiáng)抗碰撞性五督,在這里藏否,散列值可以是任意值。單向散列函數(shù)都必須具備強(qiáng)抗碰撞性充包。
單向散列函數(shù)必須具備單向性副签,單向散列函數(shù)并不是一種加密遥椿,因此無法通過解密將散列值還原為原來的消息。
單向散列函數(shù)也稱為消息摘要函數(shù)淆储、哈希函數(shù)冠场、雜湊函數(shù)
單向散列函數(shù)的實(shí)際應(yīng)用
檢測軟件是否被篡改
很多軟件都會通過單向散列函數(shù)計(jì)算出的散列值公布在自己的官方網(wǎng)站上,用戶在下載到軟件之后本砰,可以自行計(jì)算散列值碴裙,然后與官方網(wǎng)站上公布的散列值進(jìn)行對比。
基于口令的加密
單向散列函數(shù)也被用于基于口令的加密(PBE)
PBE的原理是將口令和鹽(salt 通過偽隨機(jī)數(shù)生成器產(chǎn)生的隨機(jī)數(shù))混合后計(jì)算其散列值点额,然后將這個散列值用作加密的秘鑰舔株。
消息認(rèn)證碼
使用單向散列函數(shù)可以構(gòu)造消息認(rèn)證碼
消息認(rèn)證碼是將“發(fā)送者和接受者之間的共享密鑰”和“消息”進(jìn)行混合后計(jì)算出的散列值。使用消息認(rèn)證碼可以檢測并防止通信過程中的錯誤还棱、篡改以及偽裝载慈。
數(shù)字簽名
在進(jìn)行數(shù)字簽名時也會使用單向散列函數(shù)
數(shù)字簽名是現(xiàn)實(shí)社會中的簽名和蓋章這樣的行為在數(shù)字世界中的實(shí)現(xiàn)。數(shù)字簽名的處理過程非常耗時珍手,因此一般不會對整個消息內(nèi)容直接施加數(shù)字簽名办铡,而是先通過單向散列函數(shù)計(jì)算出消息的散列值,然后再對整個散列值施加數(shù)字簽名珠十。
偽隨機(jī)數(shù)生成器
使用單向散列函數(shù)可以構(gòu)造偽隨機(jī)數(shù)生成器
密碼技術(shù)中所使用的隨機(jī)數(shù)需要具備“事實(shí)上不可能根據(jù)過去的隨機(jī)數(shù)預(yù)測未來的隨機(jī)數(shù)列”這樣的性質(zhì)料扰。為了保證不可預(yù)測性,可以利用單向散列函數(shù)的單向性焙蹭。
一次性口令
使用單向散列函數(shù)可以構(gòu)造一次性口令一次性口令經(jīng)常被用于服務(wù)器對客戶端的合法性認(rèn)證晒杈。在這種方式中,通過使用單向散列函數(shù)可以保證口令只在通信鏈路上傳送一次孔厉,因此即使竊聽者竊取了口令拯钻,也無法使用。
單向散列函數(shù)的具體例子
MD4撰豺、MD5
MD4現(xiàn)在已經(jīng)不安全了粪般。
MD5的強(qiáng)抗碰撞性已經(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)被列入“可謹(jǐn)慎運(yùn)用的密碼清單”稼钩,即除了用于保持兼容性的目的以外顾稀,其他情況下都不推薦使用。
SHA-256坝撑、SHA-384静秆、SHA-512的散列長度分別為256比特粮揉、384比特和512比特,這些單向散列函數(shù)合起來統(tǒng)稱SHA-2,它們的消息長度也存在上限(SHA-256的上限接近于264比特抚笔,SHA-384和SHA-512的上限接近于2128比特)
SHA-1的強(qiáng)抗碰撞性已于2005年被攻破也就是說扶认,現(xiàn)在已經(jīng)能夠產(chǎn)生具備相同散列值的兩條不同的消息,不過SHA-2還尚未被攻破塔沃。
RIPEMD-160
RIPEMD-160已經(jīng)被列入“可謹(jǐn)慎運(yùn)用的密碼清單”即除了用于保持兼容性的目的以外蝠引,其他情況下都不推薦使用阳谍。
RIPEMD的強(qiáng)抗碰撞性已經(jīng)與2004年被攻破蛀柴,但RIPEMD-160還尚未被攻破,比特幣使用的就是RIPEMD-160
SHA-3
SHA-3是一種作為新標(biāo)準(zhǔn)發(fā)布的單向散列函數(shù)算法矫夯,用來替代在理論上已被找出攻擊方法的SHA-1算法鸽疾,于2012年正式確定將Keccak算法作為SHA-3標(biāo)準(zhǔn)。
Keccak最終被選為SHA-3的理由如下
- 采用了與SHA-2完全不同的結(jié)構(gòu)
- 結(jié)構(gòu)清晰训貌,易于分析
- 能夠適用于各種設(shè)備制肮,也適用于嵌入式應(yīng)用
- 在硬件上的實(shí)現(xiàn)顯示出了很高的性能
- 比其他最終候選算法安全性邊際更大
Keccak采用了海綿結(jié)構(gòu),輸入的數(shù)據(jù)在進(jìn)行填充之后递沪,要經(jīng)過吸收階段和基礎(chǔ)階段豺鼻,最終生成輸出的散列值。
Keccak可以生成任意長度的散列值款慨,但為了配合SHA-2的散列值長度儒飒,SHA-3標(biāo)準(zhǔn)中共規(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ū)?shí)際應(yīng)用中的Keccak算法形成威脅的攻擊方法。
應(yīng)該怎么選擇單向散列函數(shù)
MD5是不安全的写半,因此不應(yīng)該使用岸蜗。
SHA-1除了用于對過去生成的散列值進(jìn)行校驗(yàn)之外,不應(yīng)該被用于新的用途叠蝇,而是應(yīng)該遷移到SHA-2
SHA-2有效應(yīng)對了針對SHA-1的攻擊方法璃岳,因此是安全的,可以使用
SHA-3是安全的悔捶,可以使用
SHA-2(SHA-256铃慷、SHA-384、SHA-512)被列入了“電子政府推薦使用的密碼清單”中蜕该。
對單項(xiàng)散列函數(shù)的攻擊
暴力破解
利用文件的冗余性生成具有相同散列值的另一個文件犁柜,這就是一種針對單向散列函數(shù)的攻擊。
尋找和"100萬元合同"具備相同散列值的另一條不同的消息堂淡,這相當(dāng)于一種視圖破解單向散列函數(shù)的”弱抗碰撞性“的攻擊這種情況下馋缅,暴力破解的次數(shù)根據(jù)散列值的長度計(jì)算出來,以SHA3-512為例绢淀,長度為512比特萤悴,最多需要嘗試2512次就能夠找到目標(biāo)消息了,如此多的嘗試次數(shù)在現(xiàn)實(shí)中是不可能完成的皆的。
找出具有指定散列值的消息的攻擊分為兩種覆履,即原像攻擊和第二原像攻擊,原像攻擊是指給定一個散列值祭务,找出具有該散列值的任意消息内狗,第二原像攻擊是指給定一條消息1, 找出另外一條消息2义锥,消息2的散列值和消息1相同柳沙。
生日攻擊
生日攻擊的原理來自生日悖論,也就是利用了任意散列值一致的概率比想象中要高
注意:
在 N 個人中拌倍,保證至少有兩個人生日一樣的概率大于二分之一赂鲤,那么 N 至少是多少?
先計(jì)算 N 個人生日全都不一樣的概率柱恤,然后再用1減去這個值就可以了数初,最后發(fā)現(xiàn)當(dāng) N 取23時,概率為0.507297梗顺,大于二分之一泡孩。
Mallory所進(jìn)行的生日攻擊的步驟如下:
1、Mallory生成 N 個100萬元合同
2寺谤、Mallory生成 N 個1億元合同
3仑鸥、Mallory將1的 N 個散列值和2的 N 個散列值進(jìn)行對比吮播,尋找其中是否有一致的情況
4、如果找出了一致的情況眼俊,則利用這一組100萬元合同和1億元合同來欺騙Alice
以512比特的散列值為例意狠,對單向散列函數(shù)進(jìn)行暴力破解所需要的嘗試次數(shù)為2512次,而對同一單向散列函數(shù)進(jìn)行生日攻擊所需的嘗試次數(shù)為2256次疮胖,因此和暴力破解相比环戈,生日攻擊所需的嘗試次數(shù)要少的多。
單項(xiàng)散列函數(shù)無法解決的問題
單項(xiàng)散列函數(shù)能夠辨別出“篡改”澎灸,但無法辨別出“偽裝”
注意:此處的偽裝例如:主動攻擊者M(jìn)allory偽裝成Alice院塞,向Bob同時發(fā)送了消息和散列值,這時Bob能夠通過單向散列函數(shù)檢查消息的完整性击孩,但是這只是針對發(fā)送的消息進(jìn)行檢查迫悠,而無法檢查出發(fā)送者的身份是否被Mallory進(jìn)行了偽裝鹏漆。
用于認(rèn)證的技術(shù)包括消息認(rèn)證碼和數(shù)字簽名消息認(rèn)證碼能夠向通信對象保證消息沒有被篡改巩梢,而數(shù)字簽名不僅能夠向通信對象保證消息沒有被篡改,還能夠向所有第三方做出這樣的保證艺玲。