HASH函数
目錄
HASH函數(shù)
MD5
SHA-1
SHA-256
參考轉(zhuǎn)載:
https://blog.csdn.net/u011583927/article/details/80905740
Hash算法的講解?
hash算法原理詳解
SM3密碼雜湊算法
HASH函數(shù)
1、HASH算法
目前流行的hash算法有MD5、SHA-1、SHA-256以及國產(chǎn)SM3算法。
2、安全的散列函數(shù)應(yīng)滿足的條件
1)輸入長度是任意的,輸出長度是固定的;
2)單向性:對每個(gè)給定的輸入,計(jì)算其雜湊值很容易;給定雜湊值,找到滿足的輸入是不可行的;
3)抗碰撞:給定雜湊函數(shù)的描述,找到兩個(gè)不同的輸入信息雜湊到同一個(gè)值是不可行的;
4)抗生日攻擊(強(qiáng)弱而已)
3、Hash算法在信息安全方面的應(yīng)用
數(shù)據(jù)一致性/完整性驗(yàn)證:數(shù)據(jù)一致性說得是如何保證一段數(shù)據(jù)在傳輸?shù)倪^程中沒有遺漏、破壞或者修改過。一般來說,目前流行的做法是對數(shù)據(jù)進(jìn)行hash,得到的hash值和數(shù)據(jù)一起傳輸,然后在收到數(shù)據(jù)的時(shí)候也對數(shù)據(jù)進(jìn)行hash,將得到的hash值和傳輸過來的hash值進(jìn)行比對,如果是不一樣的,說明數(shù)據(jù)已經(jīng)被修改過;如果是一樣的,則說明極有可能是完整的。
文件校驗(yàn):我們比較熟悉的校驗(yàn)算法有奇偶校驗(yàn)和CRC校驗(yàn),這2種校驗(yàn)并沒有抗數(shù)據(jù)篡改的能力,它們一定程度上能檢測并糾正數(shù)據(jù)傳輸中的信道誤碼,但卻不能防止對數(shù)據(jù)的惡意破壞。MD5 Hash算法的"數(shù)字指紋"特性,使它成為目前應(yīng)用最廣泛的一種文件完整性校驗(yàn)和(Checksum)算法,不少Unix系統(tǒng)有提供計(jì)算md5 checksum的命令。
數(shù)字簽名:Hash 算法也是現(xiàn)代密碼體系中的一個(gè)重要組成部分。由于非對稱算法的運(yùn)算速度較慢,所以在數(shù)字簽名協(xié)議中,單向散列函數(shù)扮演了一個(gè)重要的角色。 對 Hash 值,又稱"數(shù)字摘要"進(jìn)行數(shù)字簽名,在統(tǒng)計(jì)上可以認(rèn)為與對文件本身進(jìn)行數(shù)字簽名是等效的。而且這樣的協(xié)議還有其他的優(yōu)點(diǎn)。
鑒權(quán)協(xié)議:鑒權(quán)協(xié)議又被稱作挑戰(zhàn)--認(rèn)證模式:在傳輸信道是可被偵聽,但不可被篡改的情況下,這是一種簡單而安全的方法。
MD5
MD5信息摘要算法(MD5 Message-Digest Algorithm),一種被廣泛使用的密碼雜湊函數(shù),可以產(chǎn)生出一個(gè)128位(16位元組)的散列值(hash value),用于確保信息傳輸完整一致。
一、MD5算法過程
對MD5算法簡要的敘述可以為:MD5以512位分組來處理輸入的信息,且每一分組又被劃分為16個(gè)32位子分組,經(jīng)過了一系列的處理后,算法的輸出由四個(gè)32位分組組成,將這四個(gè)32位分組級聯(lián)后將生成一個(gè)128位散列值。
1、填充:如果輸入信息的長度(bit)對512求余的結(jié)果不等于448,就需要填充使得對512求余的結(jié)果等于448。填充的方法是填充一個(gè)1和n個(gè)0。填充完后,信息的長度就為N*512+448(bit);
2、記錄信息長度:用64位來存儲填充前信息長度。這64位加在第一步結(jié)果的后面,這樣信息長度就變?yōu)镹*512+448+64=(N+1)*512位。
3、裝入標(biāo)準(zhǔn)的幻數(shù)(四個(gè)整數(shù)):標(biāo)準(zhǔn)的幻數(shù)(物理順序)是(A=(01234567)16,B=(89ABCDEF)16,C=(FEDCBA98)16,D=(76543210)16)。如果在程序中定義應(yīng)該是:
(A=0X67452301L,B=0XEFCDAB89L,C=0X98BADCFEL,D=0X10325476L)
4、四輪循環(huán)運(yùn)算:循環(huán)的次數(shù)是分組的個(gè)數(shù)(N+1)
1)將每一512字節(jié)細(xì)分成16個(gè)小組,每個(gè)小組64位(8個(gè)字節(jié))
2)先認(rèn)識四個(gè)線性函數(shù)(&是與,|是或,~是非,^是異或)
????????F(X,Y,Z)=(X&Y)|((~X)&Z)
????????G(X,Y,Z)=(X&Z)|(Y&(~Z))
????????H(X,Y,Z)=X^Y^Z
????????I(X,Y,Z)=Y^(X|(~Z))
3)設(shè)Mj表示消息的第j個(gè)子分組(從0到15),<<
????????FF(a,b,c,d,Mj,s,ti)表示a=b+((a+F(b,c,d)+Mj+ti)<<<s)
????????GG(a,b,c,d,Mj,s,ti)表示a=b+((a+G(b,c,d)+Mj+ti)<<<s)
????????HH(a,b,c,d,Mj,s,ti)表示a=b+((a+H(b,c,d)+Mj+ti)<<<s)
????????II(a,b,c,d,Mj,s,ti)表示a=b+((a+I(b,c,d)+Mj+ti)<<<s)
4)四輪運(yùn)算
5)每輪循環(huán)后,將A,B,C,D分別加上a,b,c,d,然后進(jìn)入下一循環(huán)。
二、MD5算法相關(guān)
1、MD5功能
輸入任意長度的信息,經(jīng)過處理,輸出為128位的信息(數(shù)字指紋);
不同的輸入得到的不同的結(jié)果(唯一性);
2、MD5用途
防篡改:
比如發(fā)送一個(gè)電子文檔,發(fā)送前,我先得到MD5的輸出結(jié)果a。然后在對方收到電子文檔后,對方也得到一個(gè)MD5的輸出結(jié)果b。如果a與b一樣就代表中途未被篡改。
比如我提供文件下載,為了防止不法分子在安裝程序中添加木馬,我可以在網(wǎng)站上公布由安裝文件得到的MD5輸出結(jié)果。
SVN在檢測文件是否在CheckOut后被修改過,也是用到了MD5.
防止直接看到明文:
現(xiàn)在很多網(wǎng)站在數(shù)據(jù)庫存儲用戶的密碼的時(shí)候都是存儲用戶密碼的MD5值。這樣就算不法分子得到數(shù)據(jù)庫的用戶密碼的MD5值,也無法知道用戶的密碼。(比如在UNIX系統(tǒng)中用戶的密碼就是以MD5(或其它類似的算法)經(jīng)加密后存儲在文件系統(tǒng)中。當(dāng)用戶登錄的時(shí)候,系統(tǒng)把用戶輸入的密碼計(jì)算成MD5值,然后再去和保存在文件系統(tǒng)中的MD5值進(jìn)行比較,進(jìn)而確定輸入的密碼是否正確。通過這樣的步驟,系統(tǒng)在并不知道用戶密碼的明碼的情況下就可以確定用戶登錄系統(tǒng)的合法性。這不但可以避免用戶的密碼被具有系統(tǒng)管理員權(quán)限的用戶知道,而且還在一定程度上增加了密碼被破解的難度。)
防止抵賴(數(shù)字簽名):
這需要一個(gè)第三方認(rèn)證機(jī)構(gòu)。例如A寫了一個(gè)文件,認(rèn)證機(jī)構(gòu)對此文件用MD5算法產(chǎn)生摘要信息并做好記錄。若以后A說這文件不是他寫的,權(quán)威機(jī)構(gòu)只需對此文件重新產(chǎn)生摘要信息,然后跟記錄在冊的摘要信息進(jìn)行比對,相同的話,就證明是A寫的了。這就是所謂的“數(shù)字簽名”。
3、MD5不屬于加密算法
認(rèn)為不屬于的人是因?yàn)樗麄冇X得不能從密文(散列值)反過來得到原文,即沒有解密算法,所以這部分人認(rèn)為MD5只能屬于算法,不能稱為加密算法;認(rèn)為屬于的人是因?yàn)樗麄冇X得經(jīng)過MD5處理后看不到原文,即已經(jīng)將原文加密,所以認(rèn)為MD5屬于加密算法;我個(gè)人支持前者,正如認(rèn)為BASE64算法只能算編碼一樣。
4、MD5算法不可逆
MD5不可逆的原因是其是一種散列函數(shù),使用的是hash算法,在計(jì)算過程中原文的部分信息是丟失了的。
不過有個(gè)地方值得指出的是,一個(gè)MD5理論上的確是可能對應(yīng)無數(shù)多個(gè)原文的,因?yàn)镸D5是有限多個(gè)的而原文可以是無數(shù)多個(gè)。比如主流使用的MD5將任意長度的“字節(jié)串映射為一個(gè)128bit的大整數(shù)。也就是一共有2^128種可能,大概是3.4*10^38,這個(gè)數(shù)字是有限多個(gè)的,而但是世界上可以被用來加密的原文則會有無數(shù)的可能性。
不過需要注意的一點(diǎn)是,盡量這是一個(gè)理論上的有限對無限,不過問題是這個(gè)無限在現(xiàn)實(shí)生活中并不完全成立,因?yàn)橐环矫娆F(xiàn)實(shí)中原文的長度往往是有限的(以常用的密碼為例,一般人都在20位以內(nèi)),另一方面目前想要發(fā)現(xiàn)兩段原文對應(yīng)同一個(gè)MD5(專業(yè)的說這叫雜湊沖撞)值非常困難,因此某種意義上來說,在一定范圍內(nèi)想構(gòu)建MD5值與原文的一一對應(yīng)關(guān)系是完全有可能的。所以對于MD5目前最有效的攻擊方式就是彩虹表。
MD5相當(dāng)于超損壓縮。
5、MD5安全性
普遍認(rèn)為MD5是很安全,因?yàn)楸┝ζ平獾臅r(shí)間是一般人無法接受的。實(shí)際上如果把用戶的密碼MD5處理后再存儲到數(shù)據(jù)庫,其實(shí)是很不安全的。因?yàn)橛脩舻拿艽a是比較短的,而且很多用戶的密碼都使用生日,手機(jī)號碼,身份證號碼,電話號碼等等?;蛘呤褂贸S玫囊恍┘臄?shù)字,或者某個(gè)英文單詞。如果我把常用的密碼先MD5處理,把數(shù)據(jù)存儲起來,然后再跟你的MD5結(jié)果匹配,這時(shí)我就有可能得到明文。比如某個(gè)MD5破解網(wǎng)站http://www.cmd5.com/default.aspx,所以現(xiàn)在大多數(shù)網(wǎng)站密碼的策略是強(qiáng)制要求用戶使用數(shù)字大小寫字母的組合的方式提高用戶密碼的安全度。
SHA-1
1、消息填充?
2、初始化緩沖區(qū)
3、執(zhí)行算法主循環(huán)?
????????核心:壓縮函數(shù)?
SHA-256
為了更好的理解SHA256的原理,這里首先將算法中可以單獨(dú)抽出的模塊,包括常量的初始化、信息預(yù)處理、使用到的邏輯運(yùn)算分別進(jìn)行介紹,甩開這些理解上的障礙后,一起來探索SHA256算法的主體部分,即消息摘要是如何計(jì)算的。
1 、常量初始化
SHA256算法中用到了8個(gè)哈希初值以及64個(gè)哈希常量。
其中,SHA256算法的8個(gè)哈希初值如下:
h0 := 0x6a09e667;h1 := 0xbb67ae85;h2 := 0x3c6ef372;h3 := 0xa54ff53a;
h4 := 0x510e527f;h5 := 0x9b05688c;h6 := 0x1f83d9ab;h7 := 0x5be0cd19;
于是,質(zhì)數(shù)2的平方根的小數(shù)部分取前32bit就對應(yīng)出了0x6a09e667
在SHA256算法中,用到的64個(gè)常量如下:
428a2f98 71374491 b5c0fbcf e9b5dba5
3956c25b 59f111f1 923f82a4 ab1c5ed5
d807aa98 12835b01 243185be 550c7dc3
72be5d74 80deb1fe 9bdc06a7 c19bf174
e49b69c1 efbe4786 0fc19dc6 240ca1cc
2de92c6f 4a7484aa 5cb0a9dc 76f988da
983e5152 a831c66d b00327c8 bf597fc7
c6e00bf3 d5a79147 06ca6351 14292967
27b70a85 2e1b2138 4d2c6dfc 53380d13
650a7354 766a0abb 81c2c92e 92722c85
a2bfe8a1 a81a664b c24b8b70 c76c51a3
d192e819 d6990624 f40e3585 106aa070
19a4c116 1e376c08 2748774c 34b0bcb5
391c0cb3 4ed8aa4a 5b9cca4f 682e6ff3
748f82ee 78a5636f 84c87814 8cc70208
90befffa a4506ceb bef9a3f7 c67178f2
和8個(gè)哈希初值類似,這些常量是對自然數(shù)中前64個(gè)質(zhì)數(shù)(2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97…)的立方根的小數(shù)部分取前32bit而來。
2、信息預(yù)處理(pre-processing)
SHA256算法中的預(yù)處理就是在想要Hash的消息后面補(bǔ)充需要的信息,使整個(gè)消息滿足指定的結(jié)構(gòu)。信息的預(yù)處理分為兩個(gè)步驟:附加填充比特和附加長度。
1)附加填充比特:
在報(bào)文末尾進(jìn)行填充,使報(bào)文長度在對512取模以后的余數(shù)是448;填充方式:先補(bǔ)第一個(gè)比特為1,然后都補(bǔ)0,直到長度滿足對512取模后余數(shù)是448。需要注意的是,信息必須進(jìn)行填充,也就是說,即使長度已經(jīng)滿足對512取模后余數(shù)是448,補(bǔ)位也必須要進(jìn)行,這時(shí)要填充512個(gè)比特。因此,填充是至少補(bǔ)一位,最多補(bǔ)512位。
為什么是448?因?yàn)樵诘谝徊降念A(yù)處理后,第二步會再附加上一個(gè)64bit的數(shù)據(jù),用來表示原始報(bào)文的長度信息。而448+64=512,正好拼成了一個(gè)完整的結(jié)構(gòu)。
2)附加長度值:
附加長度值就是將原始數(shù)據(jù)(第一步填充前的消息)的長度信息補(bǔ)到已經(jīng)進(jìn)行了填充操作的消息后面。SHA256用一個(gè)64位的數(shù)據(jù)來表示原始消息的長度。因此,通過SHA256計(jì)算的消息長度必須要小于2^64 ,當(dāng)然絕大多數(shù)情況這足夠大了。
回到剛剛的例子,消息“abc”,3個(gè)字符,占用24個(gè)bit;因此,在進(jìn)行了補(bǔ)長度的操作以后,整個(gè)消息就變成16進(jìn)制格式;
61626380 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000018
3、 邏輯運(yùn)算
SHA256散列函數(shù)中涉及的操作全部是邏輯的位運(yùn)算;包括如下的邏輯函數(shù):
其中:
| 邏輯運(yùn)算 | 含義 |
| ∧ | 按位“與” |
| ? | 按位“補(bǔ)” |
| ⊕ | 按位“異或” |
| S^{n} | 循環(huán)右移n個(gè)bit |
| R^{n} | 右移n個(gè)bit |
4、 計(jì)算消息摘要
現(xiàn)在來介紹SHA256算法的主體部分,即消息摘要是如何計(jì)算的。
首先:消息分組,將消息分解成512-bit大小的塊
假設(shè)消息M可以被分解為n個(gè)塊,于是整個(gè)算法需要做的就是完成n次迭代,n次迭代的結(jié)果就是最終的哈希值,即256bit的數(shù)字摘要;一個(gè)256bit的摘要的初始值H0,經(jīng)過第一個(gè)數(shù)據(jù)塊進(jìn)行運(yùn)算,得到H1,即完成了第一次迭代;H1經(jīng)過第二個(gè)數(shù)據(jù)塊得到H2,……,依次處理,最后得到Hn,Hn即為最終的256bit消息摘要;將每次迭代進(jìn)行的映射用Map(H{i-1}) = H{i}表示,于是迭代可以更形象的展示為:
圖中256-bit的Hi被描述8個(gè)小塊,這是因?yàn)镾HA256算法中的最小運(yùn)算單元稱為“字”(Word),一個(gè)字是32位。此外,第一次迭代中,映射的初值設(shè)置為前面介紹的8個(gè)哈希初值,如下圖所示:
下面開始介紹每一次迭代的內(nèi)容:
1):構(gòu)造64個(gè)字(word)
對于每一塊,將塊分解為16個(gè)32bit的big-endian的字,記為w[0], …, w[15];也就是說,前16個(gè)字直接由消息的第i個(gè)塊分解得到
其余的字由如下迭代公式得到:
Wt?=σ1?(Wt?2?)+Wt?7?+σ0?(Wt?15?)+Wt?16?
2):進(jìn)行64次循環(huán)
映射包含了64次加密循環(huán),即進(jìn)行64次加密循環(huán)即可完成一次迭代;每次加密循環(huán)可以由下圖描述:
圖中,ABCDEFGH這8個(gè)字(word)在按照一定的規(guī)則進(jìn)行更新,其中:
- 深藍(lán)色方塊是事先定義好的非線性邏輯函數(shù),即將兩個(gè)數(shù)字加在一起,如果結(jié)果大于2^{32}?,你必須除以?2^{32}并找到余數(shù)。
- ABCDEFGH一開始的初始值分別為H{i-1}(0),H{i-1}(1),…,H{i-1}(7)
- Kt是第t個(gè)密鑰,對應(yīng)我們上文提到的64個(gè)常量
- Wt是本區(qū)塊產(chǎn)生第t個(gè)word。原消息被切成固定長度512-bit的區(qū)塊,對每一個(gè)區(qū)塊,產(chǎn)生64個(gè)word,通過重復(fù)運(yùn)行循環(huán)n次對ABCDEFGH這八個(gè)字循環(huán)加密。
- 最后一次循環(huán)所產(chǎn)生的八個(gè)字合起來即是第i個(gè)塊對應(yīng)到的散列字符串H{i}
補(bǔ):?
注:
如有錯(cuò)誤、侵權(quán),請聯(lián)系作者更改刪除!!!
總結(jié)
- 上一篇: 隐私计算--差分隐私
- 下一篇: 隐私计算--代理重加密