「OK思享匯」區塊鏈技術里的密碼學:哈希函數

Hash函數是密碼學的基本工具,hash函數可以用在數字簽名中,通過後面的介紹我們可以知道數字簽名使用的是橢圓曲線,計算複雜度十分高,在簽名之前,我們通常都將要簽名的文件或者信息經過hash函數壓縮之後再進行簽名。

哈希函數還可以用在數據完整性的檢測當中,例如說我們經常會看到網站上下載軟件時會在旁邊給出hash值,這個hash值就是用來判斷文件是否完整,是否在下載時被別人篡改了。我們從網站上下載了一個文件,我們怎麼判斷我們下載的文件是完整的呢?我們可以將文件經過hash函數之後得到的值與網站上的進行對比,看是否相同,相同則代表文件網站,不相同則代表不網站或者被篡改。

Hash函數還可以用於可證明安全密碼體制當中,這個之後我們會講到。其次hsah函數還可以檢測傳輸中消息是否被篡改,防止偽造電子簽名和消息認證碼,作為安全組件設計多種密碼體制和安全通信協議,比特幣和區塊鏈的核心技術。

「OK思享汇」区块链技术里的密码学:哈希函数

Hash函數又稱雜湊函數、散列函數、數字指紋等,將任意長的消息壓縮為一個固定長度的摘要。如下圖,我們可以看到hash函數可以將任意大小的文件壓縮成n比特的一個01串,n可以是128、160、192、256、384或512。

「OK思享汇」区块链技术里的密码学:哈希函数

我們可以看到hash函數的數學表達式是Y=H(M) , {0,1}*{0,1}n,H代表一個hash函數,M代表一個輸入信息,Y是一個輸出,可以看到,hash函數的輸入可以是任意位數的,但是輸出是定長位數的,為n。計算機中使用的hash表主要用於存儲和查找,是源於1953年IBM的歷史性討論所得到的。

密碼學中的hash函數與計算機中使用的hash函數略有不同,密碼學中使用的hash函數具有特定的安全屬性。之後我們會具體介紹它的安全屬性。

我們之前介紹的hash函數是不帶密鑰的,直接對消息進行壓縮。我們可以在hash函數中引入密鑰,使它變成可以進行身份驗證的MAC算法。我們可以看到下圖的表示,是把密鑰和消息同時作為hash函數的輸入。MAC函數具有消息完整性檢測和通信雙方的身份認證功能。¬¬hash函數廣泛應用於各類Internet協議,如IPsec、SSL/TLS、SSH、SNMP等,還有金融安全:銀行,電子錢幣等。

再來說一下hash函數的5大安全特性。首先,hash函數具有抗原像攻擊的安全屬性。抗原像攻擊是指給定任意Hash值Y,恢復消息M 是困難的。抗第二原像攻擊和抗碰撞性是相似的,抗第二原像攻擊指的是對於給定的消息M1 ,計算另一個消息M2 使H(M1)=H(M2)是困難的。

而抗碰撞性則是指找到不同的消息(M1, M2) 有相同的指紋,即H(M1)=H(M2)是困難的。這兩個安全屬性的不同點在於一個是給定M1,一個是M1可以自己選擇。

抗長度擴展攻擊指的是給定消息M的長度和H(M),不知道M的情況下,計算H(M||M’)是困難的。抗二次碰撞攻擊:給定一對碰撞消息M和M’,對於任意消息N,消息M||N和M’||N也形成碰撞。

「OK思享汇」区块链技术里的密码学:哈希函数

Hash函數主要有6種,分別是MD5,SHA-1,SHA-2,SHA-3,Whirlpool,SHA-3,SM3。MD5已經是很傳統的hash函數了,是在1992年由Rivest設計提出的,輸出長度為128比特。Rivest也是公鑰加密算法RSA的設計者之一,是其中的R,Rivest在2002年的時候得到了圖靈獎。

我的導師王小云教授在Crypto 2004上提出一種能成功攻破MD5的算法。SHA-1是1995年由NIST(美國國家標準與技術研究院)提出,輸出長度160比特。SHA-2是2002年由NIST提出,輸出長度256,384,512比特。Whirlpool是2000年由Rijmen等設計,輸出長度512比特。KECCAK在SHA-3標準競賽中勝出,成為SHA-3標準算法,是2007年由Daemen等設計,輸出長度256,384,512比特。Hash函數也有由中國人自己設計實現的算法,SM3,是在2010年由我的導師王小云院士等設計,輸出長度256比特。

其次王老師還攻破過SHA-1,SHA-2。王老師最推薦看的一本密碼學入門書籍是《碼書》。我是通過看《欺騙的藝術》說到MD5時有標註,MD5已被中國科學家王小云破解了解到王老師的,之後對王老師十分敬佩,並且成為她的研究生。

「OK思享汇」区块链技术里的密码学:哈希函数

Hash可以應用在登陸認證中。用戶提供用戶名和密碼,服務器在數據庫中查找用戶名,獲取salt值,計算Hash(salt+password)與數據庫中比對,相同則通過認證。這樣可以防止密碼直接存在數據庫中,黑客/管理員可以直接查看到用戶密碼。加salt的目的是防止兩個用戶密碼相同在服務器中可以直接查看到。

Hash可以用在密鑰衍生中。我們可以看到銀行使用的U盾所產生的隨機數就是通過hash函數產生的。其次hash函數也廣泛應用於RFID、衛星通訊等密碼系統中。

hash函數也在數字簽名中有應用。如果學習完下一節的知識之後,我們就會知道,數字簽名使用的是橢圓曲線簽名,在計算上十分慢,要籤的數據量越大簽名速度就會越慢,所以一般採用的辦法是,在簽名前先將要簽名的信息進行Hash壓縮,得到一個很短的比特串,之後再進行簽名運算。我們看下圖是一個金融安全的模型。

hash函數還在比特幣以及區塊鏈中有很好的應用。比特幣挖礦,其實就是在找一個隨機數n,使得n拼接上交易信息的hash值前m位為零。前m位為零,代表的是挖礦的計算複雜度,假設要尋找前60比特為0的hash值,那麼他的計算複雜度就是260次運算。電子貨幣:一種代替貨幣的電子簽名,通過用戶的公鑰(數字證書)可驗證貨幣的合法性。


分享到:


相關文章: