密碼技術之單向散列函數
單向散列函數(one-way hash function),也稱為消息摘要函數(message digest function)、哈希函數、雜湊函數,是指輸入消息(message)輸出散列值(hash value),用於消息的完整性(一致性)檢查。
它有啥特點:
1,根據任意長度的消息計算出固定長度的散列值。
2,能夠快速計算出散列值。
3,輸入消息不同,散列值也不同。
4,單向性。通過散列值無法還原出消息。
它有啥應用:
比如:
基於口令的加密(Password Based Encryption,PBE),通過口令和salt計算散列值,用於加密的密鑰,防止針對口令的字典攻擊。
消息認證碼可以檢測篡改和偽裝。
數字簽名用於是指計算出消息的散列值,然後對其簽名。
一次性口令,常用於伺服器對客戶端的合法性認證,通過使用散列函數保證口令在通信鏈路上只傳輸一次,即使泄露了口令,也無法使用。
有那些單向散列函數呢?
1,MD4被外國人、MD5已經被我國王小雲院士碰撞攻擊演算法攻破了,不安全了。
2,SHA-1、SHA-2(SHA-256、SHA-384、SHA-512),當然SHA-1也是在2005年被王院士攻破了,雖然SHA-2還沒被攻破。
3,SHA-3,在05年SHA-1被強碰撞性被攻破的情況下,NIST(美國國家標準技術研究所)開始制定了下一代SHA-3的標準工作,2012年keccak演算法成為SHA-3。
由於之前的單向散列函數都是通過循環執行壓縮函數的方法來生成散列值,keccak是一種海綿結構因此傳統攻擊方法無效。
keccak的設計者之一Gilles Van Assche大神,在Github上的主頁:https://github.com/gvanas
看一看keccak的設計思路吧:
先看一看Hash(n, M, N, H)參數
散列位大小 (n)是指SHA3的散列值長度有224、256、384、512四種。
消息文本M:輸入消息。
N:消息摘要的長度bit大小。
哈希變數H:輸出。
keccak是一種海綿結構。對輸入數據填充經過absorbing phase吸收和squeezing phase擠出兩個階段,最終輸出散列值。還有一種變體雙工結構。
1,將填充後的輸入消息,按照r個bit為一組進行分割成若干個輸入分組。現在要每個分組的r的比特,吸收進海綿中,然後擠出,如何進行?
將輸入分組1,與初始值為0的內部狀態的r個比特進行異或運算,其結果作為函數f的輸入值。
將函數f的輸出值r個比特再與輸入分組2進行異或。反覆執行,直到最後一個輸入分組,結束吸收階段,進入擠出階段。
函數f的輸入輸出長度都是b=r+c,這裡面的c是不受輸入分組直接影響,但會到函數f的間接影響。r被稱為比特率,c被稱為容量,主要是用於防止消息內部特徵泄露。
2,函數keccak內部狀態是一個三維比特數組,5*5*b個比特組成的數組,這個參數就是b,也就是內部狀態的比特長度。
SHA3採用的b=1600,1600是25的整數倍(2的6次方64倍)。keccak-f[b]的每一輪包含5個步驟。實質上就是對各個比特位進行運算,詳細情況可以Google。
攻擊途徑:
1,暴力破解,利用文件冗餘性生成具有同一散列值的另一個文件,暴力破解需要嘗試的次數根據散列值長度技術出來,比如SHA3-512,需要嘗試2的512次方,現實中是不可能完成了。找出具有指定散列值的消息攻擊分為2種,pre-image attack是指給定一個散列值,找出具有該值的任意消息。second pre-image attack是指給定消息1,找到和消息1散列值相同的消息2。
2,生日攻擊(birthday attack),暴力破解是指找到特定生成散列值的消息,生日攻擊是找到散列值相同的兩條消息,散列值可以是任意值。舉例來說暴力破解是已有文本的散列值,找到相同散列值的文本進行替換。生日攻擊是事先準備好兩份散列值相同的消息,將消息進行替換。也可以這樣理解,兩個人的生日都是某個特點日期可能性確實不高,但是找到「只要有2個人生日日期相同,不管哪一天都可以」的話,可能性卻很高。
最後,單向散列函數雖然能辨別出「篡改」但無法解決消息的發送者偽裝問題,還需要進行認證。
本文為安智客之前的一篇讀書筆記!
![](https://pic.pimg.tw/zzuyanan/1488615166-1259157397.png)
![](https://pic.pimg.tw/zzuyanan/1482887990-2595557020.jpg)
TAG:安智客 |