【區塊鏈與密碼學】第2-3講:區塊鏈基礎技術大剖析之哈希函數
導語
本課堂用通俗易懂的系列內容爲大家呈現區塊鏈與密碼學領域相關知識。這裡有知識也有故事,從感興趣到有樂趣,點寬課堂等你來學。
這個系列中的課程內容首先從比特幣着手進行入門介紹,再延伸至區塊鏈的相關技術原理與發展趨勢,然後深入淺出地依次介紹在區塊鏈中應用的各類密碼學技術。歡迎大家訂閱本公衆號,持續進行學習。
【本課堂內容全部選編自PlatON首席密碼學家、武漢大學國家網絡安全學院教授、博士生導師何德彪教授的《區塊鏈與密碼學》授課講義、教材及互聯網,版權歸屬其原作者所有,如有侵權請立即與我們聯繫,我們將及時處理。】
2.4.1
哈希函數
區塊鏈作爲一個誕生剛到十幾年的技術,的確算是一個新興的概念,但是它所用到的基礎技術全是當前非常成熟的技術。可以說是一個技術的“結晶體“。
區塊鏈的基礎技術如哈希運算、數字簽名、P2P網絡、共識算法以及智能合約等,在區塊鏈興起之前,很多技術已經在各種互聯網應用中被廣泛使用。
但這並不意味着區塊鏈就是一個新瓶裝舊酒的東西。就好比積木遊戲,雖然是一些簡單有限的木塊,但是組合過後,就能創造出一片新的世界。
同時,區塊鏈也並不是簡單的重複使用現有技術,例如共識算法、隱私保護在區塊鏈中已經有了很多的革新,智能合約也從一個簡單的理念變成了一個現實。
區塊鏈“去中心化”或“多中心”這種顛覆性的設計思想,結果其數據不可篡改、透明、可追溯、合約自動執行等強大能力,足以掀起一股新的技術風暴。
本節課主要探討這些技術的原理及在區塊鏈系統中的作用。首先從哈希函數說起。
什麼是哈希運算
哈希算法(Hash Algorithm)即散列算法的直接音譯。它的基本功能概括來說,就是把任意長度的輸入(例如文本等信息)通過一定的計算,生成一個固定長度的字符串,輸出的字符串稱爲該輸入的哈希值。在此以常用的SHA-256算法分別對一個簡短的句子和一段文字求哈希值來說明。
輸入:
This is a hash example!
哈希值:
17f2cf0bcbfbc11a8ab6b6883b03c721407da5c97
45d46a5fc53830d4749504a
我們在第一單元課程中對涉及哈希函數的公鑰與私鑰的的換算有細緻的講解,請看:
哈希運算的特性
一個優秀的哈希算法要具備正向快速、輸入敏感、逆向困難、強抗碰撞等特徵。
正向快速
正向即由輸入計算輸出的過程,對給定數據,可以在極短時間內快速得到哈希值。如當前常用的SHA256算法在普通計算機上一秒鐘能做2000萬次哈希運算。
輸入敏感
輸入信息發生任何微小變化,哪怕僅僅是一個字符的更改,重新生成的哈希值與原哈希值也會有天壤之別。同時完全無法通過對比新舊哈希值的差異推測數據內容發生了什麼變化。
因此,通過哈希值可以很容易地驗證兩個文件內容是否相同。該特性廣泛應用於錯誤校驗。在網絡傳輸中,發送方在發送數據的同時,發送該內容的哈希值。
接收方收到數據後,只需要將數據再次進行哈希運算,對比輸出與接收的哈希值,就可以判斷數據是否損壞。
逆向困難
要求無法在較短時間內根據哈希值計算出原始輸入信息。該特性是哈希算法安全性的基礎,也因此是現代密碼學的重要組成。哈希算法在密碼學中的應用很多,此處僅以哈希密碼舉例進行說明。
當前生活離不開各種賬戶和密碼,但並不是每個人都有爲每個賬戶單獨設置密碼的好習慣,爲了記憶方便,很多人的多個賬戶均採用同一套密碼。
如果這些密碼原封不動地保存在數據庫中,一旦數據泄露,則該用戶所有其他賬戶的密碼都可能暴露,造成極大風險。所以在後臺數據庫僅保存密碼的哈希值,每次登錄時,計算用戶輸入的密碼的哈希值,並將計算得到的哈希值與數據庫中保存的哈希值進行比對。
強抗碰撞性
即不同的輸入很難可以產生相同的哈希輸出。當然,由於哈希算法輸出位數是有限的,即哈希輸出數量是有限的,而輸入卻是無限的,所以不存在永遠不發生碰撞的哈希算法。
但是哈希算法仍然被廣泛使用,只要算法保證發生碰撞的概率夠小,通過暴力枚舉獲取哈希值對應輸入的概率就更小,代價也相應更大。只要能保證破解的代價足夠大,那麼破解就沒有意義。
就像我們購買雙色球時,雖然我們可以通過購買所有組合保證一定中獎,但是付出的代價遠大於收益。優秀的哈希算法即需要保證找到碰撞輸入的代價遠大於收益。
區塊鏈科普之哈希函數的應用
哈希函數在區塊鏈之前,就已經得到了廣泛應用,以下爲一些常見的應用場景:
消息認證碼
使用單向散列函數可以構造消息認證碼。消息認證碼是將“發送者和接收者之間的共享密鑰”和“消息,進行混合後計算出的散列值。使用消息認證碼可以檢測並防止通信過程中的錯誤、篡改以及僞裝。
數字簽名
在進行數字簽名時也會使用單向散列函數。數字簽名是現實社會中的簽名(sign)和蓋章這樣的行爲在數字世界中的實現。數字簽名的處理過程非常耗時,因此一般不會對整個消息內容直接施加數字簽名,而是先通過單向散列函數計算出消息的散列值,然後再對這個散列值施加數字簽名。
僞隨機數生成器
使用單向散列函數可以構造僞隨機數生成器。密碼技術中所使用的隨機數需要具備“事實上不可能根據過去的隨機數列預測未來的隨機數列”這樣的性質。爲了保證不可預測性,可以利用單向散列函數的單向性。
一次性口令
使用單向散列函數可以構造一次性口令(one-time password)。一次性口令經常被用於服務器對客戶端的合法性認證。在這種方式中,通過使用單向散列函數可以保證口令只在通信鏈路上傳送一次(one-time),因此即使竊聽者竊取了口令,也無法使用。
本內容來自用戶“wilsonyx”的總結
防篡改是哈希的功勞?
每個區塊頭包含了上一個區塊數據的哈希值,這些哈希層層嵌套,最終將所有區塊串聯起來,形成區塊鏈。
區塊鏈裡包含了自該鏈誕生以來發生的所有交易,因此,要篡改一筆交易,意味着它之後的所有區塊的父區塊哈希全部要篡改一遍,這需要進行大量的運算。
如果想要篡改數據,必須靠僞造交易鏈實現,即保證在正確的區塊產生之前能快速地運算出僞造的區塊。同時在以比特幣爲代表的區塊鏈系統要求連續產生一定數量的區塊之後,交易纔會得到確認,即需要保證連續僞造多個區塊。
只要網絡中節點足夠多,連續僞造的區塊運算速度都超過其他節點幾乎是不可能實現的。
另一種可行的篡改區塊鏈的方式是,某一利益方擁有全網超過50%的算力,利用區塊鏈中少數服從多數的特點,篡改歷史交易。
然而在區塊鏈網絡中,只要有足夠多的節點參與,控制網絡中50%的算力也是不可能做到的。如果某一利益方擁有了全網超過50%的算力,它就已經成爲既得利益者,從收益角度來看,維護會比破壞價值更大,因此肯定會更堅定地維護區塊鏈網絡的穩定性。
可以實現內容改變快速檢測的一種樹
除上述防篡改特性,基於哈希算法組裝出的默克爾樹也在區塊鏈中發揮了重要作用。默克爾樹本質上是一種哈希樹,1979年瑞夫·默克爾申請了該專利,故此得名。
前面已經介紹了哈希算法,在區塊中默克爾樹就是當前區塊所有交易信息的一個哈希值。但是這個哈希值並不是直接將所有交易內容計算得到的哈希,而是一個哈希二叉樹。
首先對每筆交易計算哈希值;然後進行兩兩分組,對這兩個哈希值再計算得到一個新的哈希值,兩個舊的哈希值就作爲新哈希值的葉子節,如果哈希值數量爲單數,則對最後一哈希值再次計算哈希值即可;
然後重複上述計算,直至最後只剩一個哈希值,作爲默克爾樹的根,最終形成一個二叉樹的結構。在區塊鏈中,我們只需要保留對自己有用的交易信息,刪除或者在其他設備備份其餘交易信息。
如果需要驗證交易內容,只需驗證默克爾樹即可。若根哈希驗證不通過,則驗證兩個葉子節點,再驗證其中哈希驗證不通過的節點的葉子節點,最終可以準確識別被篡改的交易。
有關於哈希函數就講到這裡啦,下節課我們將解析區塊鏈基礎技術之數字簽名,和我們日常的簽名有什麼不一樣呢?下節課揭曉!
同學們可以關注點寬學園公衆號,持續學習哦。我們下節課見啦。
【區塊鏈與密碼學】課堂回顧:
關注點寬學園,每週持續更新區塊鏈系列課程,小寬帶你進入區塊鏈世界。
FOLLOW US
© DigQuant
點擊“閱讀原文”,登錄官網www.digquant.com,一起解鎖更多金融科技姿勢:涵蓋 Python 、 金融基礎 、 量化投資 、 區塊鏈 、 大數據 、 人工智能 。 Dig More, Learn More!