HASH函数
目錄
HASH函數
MD5
SHA-1
SHA-256
參考轉載:
https://blog.csdn.net/u011583927/article/details/80905740
Hash算法的講解?
hash算法原理詳解
SM3密碼雜湊算法
HASH函數
1、HASH算法
目前流行的hash算法有MD5、SHA-1、SHA-256以及國產SM3算法。
2、安全的散列函數應滿足的條件
1)輸入長度是任意的,輸出長度是固定的;
2)單向性:對每個給定的輸入,計算其雜湊值很容易;給定雜湊值,找到滿足的輸入是不可行的;
3)抗碰撞:給定雜湊函數的描述,找到兩個不同的輸入信息雜湊到同一個值是不可行的;
4)抗生日攻擊(強弱而已)
3、Hash算法在信息安全方面的應用
數據一致性/完整性驗證:數據一致性說得是如何保證一段數據在傳輸的過程中沒有遺漏、破壞或者修改過。一般來說,目前流行的做法是對數據進行hash,得到的hash值和數據一起傳輸,然后在收到數據的時候也對數據進行hash,將得到的hash值和傳輸過來的hash值進行比對,如果是不一樣的,說明數據已經被修改過;如果是一樣的,則說明極有可能是完整的。
文件校驗:我們比較熟悉的校驗算法有奇偶校驗和CRC校驗,這2種校驗并沒有抗數據篡改的能力,它們一定程度上能檢測并糾正數據傳輸中的信道誤碼,但卻不能防止對數據的惡意破壞。MD5 Hash算法的"數字指紋"特性,使它成為目前應用最廣泛的一種文件完整性校驗和(Checksum)算法,不少Unix系統有提供計算md5 checksum的命令。
數字簽名:Hash 算法也是現代密碼體系中的一個重要組成部分。由于非對稱算法的運算速度較慢,所以在數字簽名協議中,單向散列函數扮演了一個重要的角色。 對 Hash 值,又稱"數字摘要"進行數字簽名,在統計上可以認為與對文件本身進行數字簽名是等效的。而且這樣的協議還有其他的優點。
鑒權協議:鑒權協議又被稱作挑戰--認證模式:在傳輸信道是可被偵聽,但不可被篡改的情況下,這是一種簡單而安全的方法。
MD5
MD5信息摘要算法(MD5 Message-Digest Algorithm),一種被廣泛使用的密碼雜湊函數,可以產生出一個128位(16位元組)的散列值(hash value),用于確保信息傳輸完整一致。
一、MD5算法過程
對MD5算法簡要的敘述可以為:MD5以512位分組來處理輸入的信息,且每一分組又被劃分為16個32位子分組,經過了一系列的處理后,算法的輸出由四個32位分組組成,將這四個32位分組級聯后將生成一個128位散列值。
1、填充:如果輸入信息的長度(bit)對512求余的結果不等于448,就需要填充使得對512求余的結果等于448。填充的方法是填充一個1和n個0。填充完后,信息的長度就為N*512+448(bit);
2、記錄信息長度:用64位來存儲填充前信息長度。這64位加在第一步結果的后面,這樣信息長度就變為N*512+448+64=(N+1)*512位。
3、裝入標準的幻數(四個整數):標準的幻數(物理順序)是(A=(01234567)16,B=(89ABCDEF)16,C=(FEDCBA98)16,D=(76543210)16)。如果在程序中定義應該是:
(A=0X67452301L,B=0XEFCDAB89L,C=0X98BADCFEL,D=0X10325476L)
4、四輪循環運算:循環的次數是分組的個數(N+1)
1)將每一512字節細分成16個小組,每個小組64位(8個字節)
2)先認識四個線性函數(&是與,|是或,~是非,^是異或)
????????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)設Mj表示消息的第j個子分組(從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)四輪運算
5)每輪循環后,將A,B,C,D分別加上a,b,c,d,然后進入下一循環。
二、MD5算法相關
1、MD5功能
輸入任意長度的信息,經過處理,輸出為128位的信息(數字指紋);
不同的輸入得到的不同的結果(唯一性);
2、MD5用途
防篡改:
比如發送一個電子文檔,發送前,我先得到MD5的輸出結果a。然后在對方收到電子文檔后,對方也得到一個MD5的輸出結果b。如果a與b一樣就代表中途未被篡改。
比如我提供文件下載,為了防止不法分子在安裝程序中添加木馬,我可以在網站上公布由安裝文件得到的MD5輸出結果。
SVN在檢測文件是否在CheckOut后被修改過,也是用到了MD5.
防止直接看到明文:
現在很多網站在數據庫存儲用戶的密碼的時候都是存儲用戶密碼的MD5值。這樣就算不法分子得到數據庫的用戶密碼的MD5值,也無法知道用戶的密碼。(比如在UNIX系統中用戶的密碼就是以MD5(或其它類似的算法)經加密后存儲在文件系統中。當用戶登錄的時候,系統把用戶輸入的密碼計算成MD5值,然后再去和保存在文件系統中的MD5值進行比較,進而確定輸入的密碼是否正確。通過這樣的步驟,系統在并不知道用戶密碼的明碼的情況下就可以確定用戶登錄系統的合法性。這不但可以避免用戶的密碼被具有系統管理員權限的用戶知道,而且還在一定程度上增加了密碼被破解的難度。)
防止抵賴(數字簽名):
這需要一個第三方認證機構。例如A寫了一個文件,認證機構對此文件用MD5算法產生摘要信息并做好記錄。若以后A說這文件不是他寫的,權威機構只需對此文件重新產生摘要信息,然后跟記錄在冊的摘要信息進行比對,相同的話,就證明是A寫的了。這就是所謂的“數字簽名”。
3、MD5不屬于加密算法
認為不屬于的人是因為他們覺得不能從密文(散列值)反過來得到原文,即沒有解密算法,所以這部分人認為MD5只能屬于算法,不能稱為加密算法;認為屬于的人是因為他們覺得經過MD5處理后看不到原文,即已經將原文加密,所以認為MD5屬于加密算法;我個人支持前者,正如認為BASE64算法只能算編碼一樣。
4、MD5算法不可逆
MD5不可逆的原因是其是一種散列函數,使用的是hash算法,在計算過程中原文的部分信息是丟失了的。
不過有個地方值得指出的是,一個MD5理論上的確是可能對應無數多個原文的,因為MD5是有限多個的而原文可以是無數多個。比如主流使用的MD5將任意長度的“字節串映射為一個128bit的大整數。也就是一共有2^128種可能,大概是3.4*10^38,這個數字是有限多個的,而但是世界上可以被用來加密的原文則會有無數的可能性。
不過需要注意的一點是,盡量這是一個理論上的有限對無限,不過問題是這個無限在現實生活中并不完全成立,因為一方面現實中原文的長度往往是有限的(以常用的密碼為例,一般人都在20位以內),另一方面目前想要發現兩段原文對應同一個MD5(專業的說這叫雜湊沖撞)值非常困難,因此某種意義上來說,在一定范圍內想構建MD5值與原文的一一對應關系是完全有可能的。所以對于MD5目前最有效的攻擊方式就是彩虹表。
MD5相當于超損壓縮。
5、MD5安全性
普遍認為MD5是很安全,因為暴力破解的時間是一般人無法接受的。實際上如果把用戶的密碼MD5處理后再存儲到數據庫,其實是很不安全的。因為用戶的密碼是比較短的,而且很多用戶的密碼都使用生日,手機號碼,身份證號碼,電話號碼等等。或者使用常用的一些吉利的數字,或者某個英文單詞。如果我把常用的密碼先MD5處理,把數據存儲起來,然后再跟你的MD5結果匹配,這時我就有可能得到明文。比如某個MD5破解網站http://www.cmd5.com/default.aspx,所以現在大多數網站密碼的策略是強制要求用戶使用數字大小寫字母的組合的方式提高用戶密碼的安全度。
SHA-1
1、消息填充?
2、初始化緩沖區
3、執行算法主循環?
????????核心:壓縮函數?
SHA-256
為了更好的理解SHA256的原理,這里首先將算法中可以單獨抽出的模塊,包括常量的初始化、信息預處理、使用到的邏輯運算分別進行介紹,甩開這些理解上的障礙后,一起來探索SHA256算法的主體部分,即消息摘要是如何計算的。
1 、常量初始化
SHA256算法中用到了8個哈希初值以及64個哈希常量。
其中,SHA256算法的8個哈希初值如下:
h0 := 0x6a09e667;h1 := 0xbb67ae85;h2 := 0x3c6ef372;h3 := 0xa54ff53a;
h4 := 0x510e527f;h5 := 0x9b05688c;h6 := 0x1f83d9ab;h7 := 0x5be0cd19;
于是,質數2的平方根的小數部分取前32bit就對應出了0x6a09e667
在SHA256算法中,用到的64個常量如下:
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個哈希初值類似,這些常量是對自然數中前64個質數(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…)的立方根的小數部分取前32bit而來。
2、信息預處理(pre-processing)
SHA256算法中的預處理就是在想要Hash的消息后面補充需要的信息,使整個消息滿足指定的結構。信息的預處理分為兩個步驟:附加填充比特和附加長度。
1)附加填充比特:
在報文末尾進行填充,使報文長度在對512取模以后的余數是448;填充方式:先補第一個比特為1,然后都補0,直到長度滿足對512取模后余數是448。需要注意的是,信息必須進行填充,也就是說,即使長度已經滿足對512取模后余數是448,補位也必須要進行,這時要填充512個比特。因此,填充是至少補一位,最多補512位。
為什么是448?因為在第一步的預處理后,第二步會再附加上一個64bit的數據,用來表示原始報文的長度信息。而448+64=512,正好拼成了一個完整的結構。
2)附加長度值:
附加長度值就是將原始數據(第一步填充前的消息)的長度信息補到已經進行了填充操作的消息后面。SHA256用一個64位的數據來表示原始消息的長度。因此,通過SHA256計算的消息長度必須要小于2^64 ,當然絕大多數情況這足夠大了。
回到剛剛的例子,消息“abc”,3個字符,占用24個bit;因此,在進行了補長度的操作以后,整個消息就變成16進制格式;
61626380 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000018
3、 邏輯運算
SHA256散列函數中涉及的操作全部是邏輯的位運算;包括如下的邏輯函數:
其中:
| 邏輯運算 | 含義 |
| ∧ | 按位“與” |
| ? | 按位“補” |
| ⊕ | 按位“異或” |
| S^{n} | 循環右移n個bit |
| R^{n} | 右移n個bit |
4、 計算消息摘要
現在來介紹SHA256算法的主體部分,即消息摘要是如何計算的。
首先:消息分組,將消息分解成512-bit大小的塊
假設消息M可以被分解為n個塊,于是整個算法需要做的就是完成n次迭代,n次迭代的結果就是最終的哈希值,即256bit的數字摘要;一個256bit的摘要的初始值H0,經過第一個數據塊進行運算,得到H1,即完成了第一次迭代;H1經過第二個數據塊得到H2,……,依次處理,最后得到Hn,Hn即為最終的256bit消息摘要;將每次迭代進行的映射用Map(H{i-1}) = H{i}表示,于是迭代可以更形象的展示為:
圖中256-bit的Hi被描述8個小塊,這是因為SHA256算法中的最小運算單元稱為“字”(Word),一個字是32位。此外,第一次迭代中,映射的初值設置為前面介紹的8個哈希初值,如下圖所示:
下面開始介紹每一次迭代的內容:
1):構造64個字(word)
對于每一塊,將塊分解為16個32bit的big-endian的字,記為w[0], …, w[15];也就是說,前16個字直接由消息的第i個塊分解得到
其余的字由如下迭代公式得到:
Wt?=σ1?(Wt?2?)+Wt?7?+σ0?(Wt?15?)+Wt?16?
2):進行64次循環
映射包含了64次加密循環,即進行64次加密循環即可完成一次迭代;每次加密循環可以由下圖描述:
圖中,ABCDEFGH這8個字(word)在按照一定的規則進行更新,其中:
- 深藍色方塊是事先定義好的非線性邏輯函數,即將兩個數字加在一起,如果結果大于2^{32}?,你必須除以?2^{32}并找到余數。
- ABCDEFGH一開始的初始值分別為H{i-1}(0),H{i-1}(1),…,H{i-1}(7)
- Kt是第t個密鑰,對應我們上文提到的64個常量
- Wt是本區塊產生第t個word。原消息被切成固定長度512-bit的區塊,對每一個區塊,產生64個word,通過重復運行循環n次對ABCDEFGH這八個字循環加密。
- 最后一次循環所產生的八個字合起來即是第i個塊對應到的散列字符串H{i}
補:?
注:
如有錯誤、侵權,請聯系作者更改刪除!!!
總結
- 上一篇: 隐私计算--差分隐私
- 下一篇: 隐私计算--代理重加密