安全性是實現區塊鏈系統功能的基礎,也是目前阻礙區塊鏈應用推廣的因素之一。
密碼學是信息安全的基石,以很小的代價給信息提供一種強有力的安全保護,廣泛應用於政治、經濟、軍事、外交和情報等重要領域。
1 定義
哈希算法(Hash Algorithms)也稱為散列算法、雜湊算法或數字指紋,是可以將任意長度的消息壓縮為一個固定長度的消息的算法。
哈希算法是區塊鏈技術體系的重要組成部分,也是現代密碼學領域的重要分支,在身份認證、數字籤名等諸多領域有著廣泛的應用。
深刻理解哈希算法原理,對於區塊鏈系統的設計與實現有著至關重要的作用。
哈希算法可以在極短的時間內,將任意長度的二進位字符串映射為固定長度的二進位字符串,輸出值稱為哈希值(Hash Value)或者數字摘要(Digital Digest)。
一般而言,哈希函數的數學表達形式如下:
h=Hash(m)
式中,h為固定長度的輸出值;m為任意長度的輸入值。任意輸入值(Message)的二進位編碼經過哈希函數計算後,可以得出n比特的一個0、1字符串的哈希值,在不同算法中n的取值可能不同,例如128、160、192、256、384或512等。
哈希算法在區塊鏈技術中得到了廣泛的應用,各個區塊之間通過哈希指針連接形成區塊鏈,每個區塊的完整性檢驗將以哈希運算的方式進行。
密碼學哈希算法的主要特性就是單向性,即在算法上,只能從輸入值計算得到輸出值,而從輸出值計算得到輸入值是不可行的。
因為哈希算法的輸出值是固定長度的,所以哈希算法存在一個碰撞的問題,即哈希算法的輸出值的長度為n比特,那麼,任取2n+1個不同的輸入值,就一定存在兩個不同的輸入值會得到相同的輸出值。因此,在一定數量的輸入值情況下,輸出值越長的哈希算法,其碰撞的概率會越小。
2 常用的哈希算法
常用的哈希算法包括MD系列算法和SHA系列算法,其中MD系列算法有MD2、MD4、MD5、RIPEMD算法等,SHA系列算法有SHA0、SHA1、SHA2、SHA3算法等。
在哈希算法中,MD5算法和SHA1算法是應用最廣泛的,兩者的原理相差不大,但MD5算法加密後的輸出值的長度為128比特,SHA1算法加密後的輸出值的長度為160比特。
在2004年的國際密碼學大會上,王小雲教授介紹了對一系列哈希算法尋找實際碰撞的方法,並當場破解了包括MD4、MD5、HAVAL128算法在內的多種哈希算法。2005年,王小雲教授進一步優化了方案,對SHA0、SHA1算法也成功地給出了碰撞攻擊。
這些攻擊技術對當時哈希算法的安全性造成了很大威脅,但同時也促進了新的哈希算法的設計與研究。
1. MD系列算法
MD系列算法是一個應用非常廣泛的算法集,最出名的MD5算法由RSA公司的羅納德·林·李維斯特(Ronald L. Rivest)在1992年提出,目前被廣泛應用於數據完整性校驗、消息摘要、消息認證等。MD2算法的運算速度較慢但相對安全,MD4算法的運算速度很快,但安全性下降,MD5算法比MD4算法更安全、運算速度更快。
雖然這些算法的安全性逐漸提高,但均被王小雲教授證明是不夠安全的。MD5算法被破解後,Ronald L. Rivest在2008年提出了更完善的MD6算法,但MD6算法並未得到廣泛使用。
MD5算法的設計採用了密碼學領域的Merkle-Damgard構造法,這是一類採用抗碰撞的單向壓縮函數來構造哈希函數的通用方法。
MD5算法的基本原理是將數據信息壓縮成128比特來作為信息摘要,首先將數據填充至512比特的整數倍,並將填充後的數據進行分組,然後將每一分組劃分為16個32比特的子分組,該子分組經過特定算法計算後,輸出結果是4個32比特的分組數據,最後將這4個32比特的分組數據級聯,生成一個128比特的散列值,即最終計算的結果。
2. SHA系列算法
SHA(Secure Hash Algorithm,安全哈希算法)是美國國家標準技術研究所發布的國家標準,規定了SHA1、SHA224、SHA256、SHA384和SHA512單向哈希算法。
SHA1、SHA224和SHA256算法適用於長度不超過264比特的消息。SHA384和SHA512算法適用於長度不超過2128比特的消息。SHA系列算法主要適用於數字籤名標準(Digital Signature Standard,DSS)裡面定義的數字籤名算法(Digital Signature Algorithm,DSA)。
對於長度小於264比特的消息,SHA1算法會產生一個160比特的消息摘要。然而,SHA1算法已被證明不具備「強抗碰撞性」。
2005年,王小雲教授破解了SHA1算法,證明了160比特的SHA1算法只需要大約269次計算就可以找到碰撞。
為了提高安全性,美國國家標準與技術研究院(National Institute of Standards and Technology,NIST)陸續發布了SHA256、SHA384、SHA512以及SHA224算法,統稱為SHA2算法。
這些算法都是按照輸出哈希值的長度命名的,例如SHA256算法可將數據轉換成長度為256比特的哈希值。雖然這些算法的設計原理與SHA1算法相似,但是至今尚未出現針對SHA2算法的有效攻擊。
因此,比特幣在設計之初即選擇採用了當時被公認為最安全和最先進的SHA256算法,除了在生成比特幣地址的流程中有一個環節採用了RIPEMD160算法,其他需要做哈希運算的地方均採用了SHA256算法或雙重SHA256算法,例如計算區塊ID、計算交易ID、創建地址、PoW共識過程等。
3.SHA256算法
在比特幣和以太坊的區塊鏈系統中,SHA256算法是工作量證明算法的基礎,具體的工作量證明算法在後面的章節中詳細闡述。在比特幣系統中,工作量證明算法只計算一次SHA256算法,而在以太坊系統中,工作量證明算法則嵌套計算兩次SHA256算法。
常用的哈希算法的過程參數見下表:
內部狀態值的長度直接影響最終的輸出值的長度,隨著哈希算法不斷演進,內部狀態值的長度不斷增加,對應的輸出值的長度也在不斷增加。只有不斷增加輸出值的長度,才能在算法上增加破解的難度。
隨著對哈希算法不斷深入地研究,慢慢會找到一些更加低廉的破解方案,這也促使我們不斷改進哈希算法的內部細節。
我們已經發現了降低破解MD5、SHA1算法難度的方案,所以目前MD5算法與SHA1算法的安全性大大降低了,已經不再推薦使用,現在更多的是用在文件的校驗方面。
目前,SHA256算法還是比較安全的,但是也不排除在不遠的將來,我們會發現新的破解方案。