做網(wǎng)站服務(wù)器e3安徽網(wǎng)絡(luò)建站
一、哈希函數(shù)
1.安全性質(zhì)
1)抗第一原像攻擊(Preimage Resistance)
給定哈希后的值,很難找到哈希前的原消息。這很好理解,需要哈希函數(shù)具有單向性。
一個(gè)簡(jiǎn)單的例子就是密碼存儲(chǔ)系統(tǒng),用戶登錄服務(wù)器需要密碼匹配,服務(wù)器出于安全考慮不會(huì)存儲(chǔ)用戶密碼,會(huì)存儲(chǔ)用戶密碼的哈希值,這樣,每次用戶發(fā)來密碼,進(jìn)行哈希來看是否一致。這樣的話,即使黑客獲得了用戶密碼的哈希值,也沒辦法登錄系統(tǒng)。
2)抗第二原像攻擊(Second Preimage Resistance)
給定消息m和哈希后的值,很難找到另一個(gè)消息n,使得n哈希后的值和m哈希后的值一樣。
一個(gè)簡(jiǎn)單的例子是軟件下載時(shí)使用哈希來校驗(yàn)文件的integrity,用戶下載軟件后,使用哈希函數(shù)得到值,來和開發(fā)者提供的哈希值對(duì)比,如果一致就認(rèn)為下載的文件沒有被篡改。這里如果黑客可以通過開發(fā)者提供的哈希值和文件,找到一個(gè)哈希值一樣的文件,那么他就可以替換掉這個(gè)文件。
3)碰撞避免(Collision Resistance)
對(duì)于一個(gè)哈希函數(shù),對(duì)于找到兩個(gè)具有相同哈希值的消息m,n是計(jì)算上不可能的。盡管哈希是理論上無限的域向固定域的映射,總會(huì)碰撞,但是要保證計(jì)算上找不到這個(gè)碰撞。
一個(gè)簡(jiǎn)單的例子是,發(fā)送信息的人本來就是黑客。例如b找到了兩個(gè)相同哈希值的文件,他讓a簽署,文件1只需要a付出很小的代價(jià),而文件2需要a付出很大的代價(jià)。那么b就將文件1發(fā)給a簽,簽完之后說a簽的是文件2。
2.SHA-1
任意長(zhǎng)比特串-->160bits哈希值
1)padding
先在后面補(bǔ)1,然后補(bǔ)0直到長(zhǎng)度L%512=(512-64),因?yàn)閟ha-1每次對(duì)512bit做處理,所以整體長(zhǎng)度一定是512的倍數(shù),那么為什么要512-64呢,因?yàn)樽詈?4位要留著指示消息的長(zhǎng)度,注意這里消息的長(zhǎng)度指的是padding前的初始長(zhǎng)度。
2)然后就是計(jì)算了,取第一個(gè)512bit和初始值做計(jì)算,計(jì)算結(jié)果160bit作為初始值和下一512bit做計(jì)算,這樣一直下去最后產(chǎn)生160bit的哈希值。
看看每512bit這個(gè)計(jì)算具體是如何做的。
首先512bit下來了將他擴(kuò)展成80個(gè)w,每個(gè)w是32bit。前16個(gè)w直接照抄原來的512bit,之后每個(gè)wt都通過以下式子計(jì)算得出,s幾就是循環(huán)左移幾位。
得到80個(gè)w之后開始計(jì)算,先拿初始值填充abcde,然后每個(gè)w進(jìn)行一輪計(jì)算。
這是前20個(gè)w進(jìn)行的前20輪計(jì)算的例子,總共的80輪只有f和w不一樣,f是每20輪有一個(gè)f,而80輪的w對(duì)應(yīng)先前生成的80個(gè)w。
這個(gè)計(jì)算就是把先前的abcde分別做一些移位、置換之類的操作,生成新的abcde。
80輪之后,把最后生成的abcde和一開始的初始值分別相加,生成這一階段的最終的160bit值,如果還有下一階段,那么這160bit值就是下一階段的初始值。
注意這里所有的+都是模(2的32次方)加。
3.SHA們
不同版本的sha的參數(shù)的對(duì)比
4.生日攻擊
根據(jù)生日悖論,一個(gè)群體中有兩個(gè)人生日是同一天的概率比直覺要大。
對(duì)于一個(gè)大小為2的n次方的哈希輸出空間,找到兩個(gè)同樣哈希值的輸入,在嘗試2的n/2次方次時(shí),概率為50%。
那么這里有一個(gè)攻擊的例子,a產(chǎn)生消息給b簽字。
a產(chǎn)生2的n/2次方種同一正常消息的變種(就類似于我是老師/老師是我)這樣的變種,就對(duì)應(yīng)2的n/2次方個(gè)哈希值。然后再產(chǎn)生2的n/2次方種個(gè)詐騙q消息。這樣,正常消息和詐騙消息中有很大概率有相同哈希值的,這樣他就找到了一組相同哈希值的消息,只用了2的(n/2+1)次方次嘗試,這比正常的暴力破解平均2的n-1次方要快了不少。
二、消息摘要(Message Digest)
很多時(shí)候消息并不在意confidentiality,比如一些廣播包,亦或者剛才提到的軟件下載。只需要保證消息的integrity就好了,那么如果還是對(duì)消息加密的話,盡管可以保證integrity(因?yàn)榧用苤髣e人沒法篡改,篡改了解密出來就是亂碼了),但會(huì)有很大的不必要的開銷,相當(dāng)于做了額外的工作,那么這個(gè)時(shí)候可以采用一種簡(jiǎn)單的模式,那就是把消息哈希之后,把哈希值附在消息后面?zhèn)?。收包的收到之后?duì)消息哈希,然后比對(duì)自己哈希出來的和對(duì)方傳來的,一致就認(rèn)為沒問題。
但是如果有人在途中同時(shí)改了消息和消息摘要,就不行了。
三、MAC(Message Authentication Code)消息認(rèn)證碼
雙方共享一個(gè)秘密(一串?dāng)?shù),一個(gè)密鑰),發(fā)送方將這個(gè)秘密和消息m鏈接,然后哈希,將哈希附在消息后面一起發(fā)送,接收方收到之后,將秘密和消息m鏈接,然后哈希,發(fā)現(xiàn)得到的值和發(fā)送方發(fā)來的一致,那么就認(rèn)為消息未被篡改。
這里就是通過雙方共享密鑰來做了認(rèn)證。
但是這里還有一個(gè)問題,他不能抗否認(rèn),就是這個(gè)key是雙方都有的,他會(huì)耍賴說這個(gè)消息不是我發(fā)的,是你發(fā)的。要做抗否認(rèn)(Non-repudiation),就需要下面講的數(shù)字簽名技術(shù)。
這里再介紹一個(gè)MAC算法,HMAC。這個(gè)的設(shè)計(jì)理念就很OCP,他想直接套現(xiàn)有的哈希函數(shù),并且讓以后的哈希函數(shù)亦可以直接套進(jìn)來。
首先把密鑰用0padding成哈希的分組長(zhǎng)度,然后在和ipad做異或,作為進(jìn)入哈希的第一個(gè)塊,然后進(jìn)哈希函數(shù),出來哈希函數(shù)對(duì)應(yīng)的n比特哈希值。
然后還要走第二輪,第一個(gè)塊還是密鑰用0padding成哈希的分組長(zhǎng)度異或上另一個(gè)op,第二塊就是剛才生成的n比特哈希,這里注意sha是有自己的padding機(jī)制的,所以這里不用padding。這兩個(gè)塊再過一遍哈希,得到的就是消息認(rèn)證碼。
四、數(shù)字簽名
要做抗否認(rèn)(Non-repudiation),那就不能使用雙方的共同秘密,就要用到只有一個(gè)人有的,且別人都不知道的,那就是公鑰技術(shù)。
所以這樣就可以先把消息哈希,然后用自己的私鑰簽名,然后再把這個(gè)結(jié)果附在消息后面?zhèn)鬏?。?duì)面收到后,對(duì)消息哈希得到哈希值,然后再拿你的公鑰解你附在后面的簽名后的哈希值,這樣匹配了,就達(dá)到了(integrity),且這是拿你的私鑰簽名的,沒法抵賴(Non-repudiation)。