​我們在談到區塊鏈的時候,經常會聽到關於哈希、哈希值、哈希算法這些詞。很多人都認為哈希就是區塊鏈上的安全保障,但是嚴格來說,哈希並不是一種加密算法。因為加密總是相對於解密而言,哈希其實是一種單向密碼體制,即它是一個從明文到密文的不可逆的映射,只有加密過程,沒有解密過程。在聊哈希算法之前我們先來聊聊什麼是哈希。

什麼是哈希/ Hash

哈希又稱作“散列”,是一種數學計算機程序,它接收任何一組任意長度的輸入信息,通過哈希算法變換成固定長度的數據指紋輸出形式,如字母和數字的組合,該輸出就是“哈希值”。

總體而言,哈希算法可理解為一種消息摘要算法,將消息或數據壓縮變小並擁有固定格式。由於其單向運算具有一定的不可逆性,哈希算法已成為加密算法中一個構成部分,但完整的加密機制不能僅依賴哈希算法。

關於不可逆,簡單理解就像1+4=5和2+3=5一樣,即便你知道結果是5,仍得不出輸入的是什麼數字。

(圖源網絡,侵刪)

常見哈希算法

目前常見的Hash 算法包括國際上的Message Digest( MD) 系列和Secure Hash Algorithm( SHA) 系列算法,以及國內的SM3 算法。

其中,SHA 256 是SHA 系列算法之一,由美國國安局設計、美國國家標準與技術研究院發布的一套哈希算法,由於其摘要長度為256bits,故稱SHA 256。 SHA 256也是保護數字信息的最安全的方法之一。

例如計算

“hello blockchain world, this is yeasy@github”的SHA-256 Hash值,

得到的結果將

“db8305d71a9f2f90a3e118a9b49a4c3 81d2b80 cf7bcef8193 0f30ab1832a3 c90”。

對於某個文件,無需查看原始內容,只要其SHA-256 Hash 計算後結果相同,則說明該文件內容極大概率就是一樣的。

哈希算法的作用又是什麼呢?

看似深奧的數學函數,哈希算法其實跟我們的生活息息相關。

比如早期,我們在傳輸信息時,由於信道不安全可能會出現信息錯亂,那麼接收方如何有效判斷信息的一致性,來回多次傳送確認是效率極低的一種方式。如果利用哈希算法則可很好地解決這一難題。當A在發出信息時,可對原文進行哈希運算,並將運算出來的哈希值附在文本之後用來校驗。這樣B在收到信息後,可對原文同樣進行哈希運算,通過對比哈希值來判斷傳送和接收信息的一致性。

哈希算法也是區塊鏈中用的最多的一種算法,它被廣泛的使用在構建區塊和確認交易的完整性上。例如在比特幣中,使用哈希算法把交易生成數據摘要,當前區塊裡麵包含上一個區塊的哈希值,後面一個區塊又包含當前區塊的哈希值,就這樣一個接一個的連接起來,形成一個不可逆向篡改的鍊錶。

哈希算法的特徵

除了快速對比內容外, Hash思想也經常被應用到基於內容的編址或命名算法中。一個優秀的Hash 算法, 將能滿足:

正向快速:給定原文和Hash 算法,在有限時間和有限資源內能計算得到Hash 值;

逆向困難:給定Hash 值,在有限時間內無法(基本不可能)逆推出原文,這也是哈希安全性的基礎;

輸入敏感:原始輸入信息發生任何改變,新產生的Hash 值都應該發生很大變化;

避免碰撞:很難找到兩段內容不同的明文,使得它們的Hash 值一致(即發生碰撞)。

可以看出,哈希算法因能快速驗證、並防止數據或交易在傳遞過程中被篡改,在網絡數據和區塊鏈技術應用中有著重大作用,也是理解區塊鍊為何具備安全可信特徵的重要因素。