我們在談到區(qū)塊鏈的時候,經(jīng)常會聽到關(guān)于哈希、哈希值、哈希算法這些詞。很多人都認(rèn)為哈希就是區(qū)塊鏈上的安全保障,但是嚴(yán)格來說,哈希并不是一種加密算法。因為加密總是相對于解密而言,哈希其實是一種單向密碼體制,即它是一個從明文到密文的不可逆的映射,只有加密過程,沒有解密過程。在聊哈希算法之前我們先來聊聊什么是哈希。
什么是哈希/Hash
哈希又稱作“散列”,是一種數(shù)學(xué)計算機(jī)程序,它接收任何一組任意長度的輸入信息,通過哈希算法變換成固定長度的數(shù)據(jù)指紋輸出形式,如字母和數(shù)字的組合,該輸出就是“哈希值”。
總體而言,哈希算法可理解為一種消息摘要算法,將消息或數(shù)據(jù)壓縮變小并擁有固定格式。由于其單向運(yùn)算具有一定的不可逆性,哈希算法已成為加密算法中一個構(gòu)成部分,但完整的加密機(jī)制不能僅依賴哈希算法。
關(guān)于不可逆,簡單理解就像1+4=5和2+3=5一樣,即便你知道結(jié)果是5,仍得不出輸入的是什么數(shù)字。
(圖源網(wǎng)絡(luò),侵刪)
常見哈希算法
目前常見的Hash算法包括國際上的Message Digest(MD)系列和Secure Hash Algorithm(SHA)系列算法,以及國內(nèi)的SM3算法。
其中,SHA 256是SHA系列算法之一,由美國國安局設(shè)計、美國國家標(biāo)準(zhǔn)與技術(shù)研究院發(fā)布的一套哈希算法,由于其摘要長度為256bits,故稱SHA 256。SHA 256也是保護(hù)數(shù)字信息的最安全的方法之一。
例如計算
“hello blockchain world,this is yeasy github”的SHA-256 Hash值,
得到的結(jié)果將是
“db8305d71a9f2f90a3e118a9b49a4c381d2b80cf7bcef81930f30ab1832a3c90”。
對于某個文件,無需查看原始內(nèi)容,只要其SHA-256 Hash計算后結(jié)果相同,則說明該文件內(nèi)容極大概率就是一樣的。
哈希算法的作用又是什么呢?
看似深奧的數(shù)學(xué)函數(shù),哈希算法其實跟我們的生活息息相關(guān)。
比如早期,我們在傳輸信息時,由于信道不安全可能會出現(xiàn)信息錯亂,那么接收方如何有效判斷信息的一致性,來回多次傳送確認(rèn)是效率極低的一種方式。如果利用哈希算法則可很好地解決這一難題。當(dāng)A在發(fā)出信息時,可對原文進(jìn)行哈希運(yùn)算,并將運(yùn)算出來的哈希值附在文本之后用來校驗。這樣B在收到信息后,可對原文同樣進(jìn)行哈希運(yùn)算,通過對比哈希值來判斷傳送和接收信息的一致性。
哈希算法也是區(qū)塊鏈中用的最多的一種算法,它被廣泛的使用在構(gòu)建區(qū)塊和確認(rèn)交易的完整性上。例如在比特幣中,使用哈希算法把交易生成數(shù)據(jù)摘要,當(dāng)前區(qū)塊里面包含上一個區(qū)塊的哈希值,后面一個區(qū)塊又包含當(dāng)前區(qū)塊的哈希值,就這樣一個接一個的連接起來,形成一個不可逆向篡改的鏈表。
哈希算法的特征
除了快速對比內(nèi)容外,Hash思想也經(jīng)常被應(yīng)用到基于內(nèi)容的編址或命名算法中。一個優(yōu)秀的Hash算法,將能滿足:
正向快速:給定原文和Hash算法,在有限時間和有限資源內(nèi)能計算得到Hash值;
逆向困難:給定Hash值,在有限時間內(nèi)無法(基本不可能)逆推出原文,這也是哈希安全性的基礎(chǔ);
輸入敏感:原始輸入信息發(fā)生任何改變,新產(chǎn)生的Hash值都應(yīng)該發(fā)生很大變化;
避免碰撞:很難找到兩段內(nèi)容不同的明文,使得它們的Hash值一致(即發(fā)生碰撞)。
可以看出,哈希算法因能快速驗證、并防止數(shù)據(jù)或交易在傳遞過程中被篡改,在網(wǎng)絡(luò)數(shù)據(jù)和區(qū)塊鏈技術(shù)應(yīng)用中有著重大作用,也是理解區(qū)塊鏈為何具備安全可信特征的重要因素。