3.1 雜湊演算法
雜湊演算法在區塊鏈系統中的應用很廣泛:比特幣使用雜湊演算法通過公鑰計算出了錢包地址、區塊頭以及交易事務的雜湊值,梅克爾樹結構本身就是一棵雜湊樹,就連 挖礦演算法都是使用的雜湊值難度匹配;以太坊中的挖礦計算也使用了雜湊演算法,其中的梅克爾–帕特里夏樹同樣也是一棵雜湊樹;其他的區塊鏈系統也都會多多少少 使用到各種雜湊演算法,因此可以說雜湊演算法貫穿到區塊鏈系統的方方面面。
3.1.1 什麼是雜湊計算
密碼學上的雜湊計算方法一般需要具有以下的性質:
·函式的輸入可以是任意長的字串;
·函式的輸出是固定長度的;
·函式的計算過程是有效率的。
這個說法比較學術化,說白了,就是通過一個方法將一段任意輸入的字串計算出一個固定長度的值,相當於計算出一個 身份證號。通過雜湊演算法計算出的結果,是無法再通過一個演算法還原出原始資料的,即是單向的,因此適合用於一些身份驗證的場合,同時由於雜湊值能夠起到一個 類似於身份證號的作用,因此也可以用於判斷資料的完整性,哪怕資料發生微小的變化,重新計算後的雜湊值都會與之前的不一樣。
一般來說,為了保證雜湊函式在密碼學上的安全性,必須滿足以下3個條件。
1)抗衝突(collision-resistance)。簡單來說,雜湊函式抗衝突指的是不同的輸入不能產生相 同的輸出。這就好像到電影院買票看電影,對於付出真金白銀買了電影票的人,他們的座位號不能是一樣的。?同時必須說明的是,抗衝突並不是說不會有衝突,只 不過找到有衝突的兩個輸入的代價很大,不可承受。這就好像暴力破解一個有效期為20年的密碼,整個破解過程長達30年,雖然最後密碼被破解了,但是由於密 碼有效期過了,所以也就失去了意義。
2)資訊隱藏(information hiding)。這個特性是指如果知道了雜湊函式的輸出,不可能逆向推匯出輸入。這在密碼學很好理解:即使敵人截獲了公開通道(比如無線電波),獲取了傳送的雜湊資訊,敵人也不可能根據這段資訊還原出明文。
3)可隱匿性(puzzle friendly)。如果有人希望雜湊函式的輸出是一個特定的值(意味著有人事先知道了雜湊函式的輸出結果),只要輸入的部分足夠隨機,在足夠合理的時間 內都將不可能破解。這個特性主要是為了對付偽造和仿製。近來某位當紅歌星的演唱會門票超貴,10000元一張。這就催生了假票行當:偽造個人演唱會的門 票。這裡門票是公開的,大家都知道長什麼樣,用什麼材質,這相當於已知雜湊函式的輸出。可隱匿特性就是要做假票的明明知道輸出長什麼樣,但不知道使用何種 “原料”和“工藝”造出一模一樣的票來。
由於雜湊演算法的輸出值是固定的,而原始資料的長度卻是多種多樣的,這就註定了在理論上存在不同的原始資料卻輸出同一種雜湊值的可能,這種情況在原始資料的 數量極其龐大的時候就會出現。比如,郵件系統的抗垃圾郵件演算法,我們一般會對每一個郵件地址計算一個雜湊值,儲存為過濾庫,可是全世界的郵件地址何其多, 而且什麼樣格式都有,這個時候會對郵件地址進行多種雜湊計算,將計算出來的多個值聯合起來判斷是否存在某個郵件地址,這也是布隆過濾器的基本原理,在位元 幣中就使用了布隆過濾器使SPV節點可以快速檢索並返回相關資料。
3.1.2 雜湊演算法的種類
密碼學中常用的雜湊演算法有MD5、SHA1、SHA2、SHA256、SHA512、SHA3、RIPEMD160,下面簡單介紹一下。
·MD5(Message Digest Algorithm5)。MD5是輸入不定長度資訊,輸出固定長度128bits的演算法。經過程式流程,生成4個32位資料,最後聯合起來成為一個 128bits雜湊。基本方式為求餘、取餘、調整長度、與連結變數進行迴圈運算,得出結果。MD5演算法曾被廣泛使用,然而目前該演算法已被證明是一種不安全 的演算法。王曉雲教授已經於2004年破解了MD5演算法。
·SHA1。SHA1在許多安全協議中廣為使用,包括TLS和SSL。2017年2月,Google宣佈已攻破了SHA1,並準備在其Chrome瀏覽器產品中逐漸降低SHA1證書的安全指數,逐步停止對使用SHA1雜湊演算法證書的支援。
·SHA2。這是SHA演算法家族的第二代,支援了更長的摘要資訊輸出,主要有SHA224、SHA256、SHA384和SHA512,數字字尾表示它們生成的雜湊摘要結果長度。
·SHA3。看名稱就知道,這是SHA演算法家族的第三代,之前名為Keccak演算法,SHA3並不是要取代SHA2,因為目前SHA2並沒有出現明顯的弱點。
·RIPEMD-160(RACE Integrity Primitives Evaluation Message Digest160)RIPEMD160是一個160位加密雜湊函式。它旨在替代128位雜湊函式MD4、MD5和RIPEMD-128。
事實上,除了以上的演算法,雜湊演算法還有很多種,有一些是不太講究加密特性的,比如在負載均衡領域常用的一致性雜湊演算法,目的只是將伺服器地址快速地計算出一個摘要值,而不是加密,因此會使用一些其他的快速雜湊演算法。
3.1.3 區塊鏈中的雜湊演算法
1.區塊雜湊
所謂區塊雜湊就是對區塊頭進行雜湊計算,得出某個區塊的雜湊值,用這個雜湊值可以唯一確定某一個區塊,相當於給區 塊設定了一個身份證號,而區塊與區塊之間就是通過這個身份證號進行串聯,從而形成了一個區塊鏈的結構。這樣的結構也是區塊鏈資料難以篡改的技術基礎之一。 比如,一共有100個區塊,如果要更改10號區塊的資料,則11號就不能與10號連線,區塊鏈就會斷開,這樣等於篡改無效了,而如果篡改了11號,就接著 要篡改12號,以此類推,幾乎就是牽一髮動全身。如果區塊鏈很長,那麼要想更改之前的歷史資料幾乎就是不可能的了。從這個角度來看,雜湊值相當於一個指 針,傳統的指標提供了一種獲取資訊的方法,而雜湊指標則提供了一種檢驗資訊是否被改編的方法,如果資訊被篡改,那麼其雜湊值和雜湊指標的值必定是不等的。
2.梅克爾樹
我們在第1章簡單介紹過梅克爾樹,梅克爾樹在不同的區塊鏈系統中有不同的細節,但本質是一樣的,我們就以比特幣中 的梅克爾樹來說明。比特幣中的梅克爾樹稱為二叉梅克爾樹,每一個區塊都有自己的梅克爾樹,是通過將區塊中的交易事務雜湊值兩兩結對計算出新的雜湊值,然後 雜湊值再兩兩結對進行雜湊計算,遞迴迴圈,直到計算出最後一個根雜湊值,這樣的一棵樹也稱為雜湊樹。梅克爾樹既能用於校驗區塊資料的完整性,也能對SPV 錢包進行支付驗證。
舉一個生活中常見的例子,當我們簽訂一份n頁的合同時,通常都會在每頁合同上蓋章,只不過每一頁上的章都是一樣 的,這就給作弊留下了空間。如果我們稍微改變一下做法,給每一頁合同蓋一個數字印章,並且每一頁上的數字印章是前一頁數字印章和本頁內容一起使用雜湊演算法 生成的雜湊值。例如:
1)合同第一頁的數字印章是本頁內容的雜湊值,即第一頁數字印章=Hash(第一頁內容)。
2)合同第二頁的數字印章是第一頁的數字印章及第二頁內容加在一起後再雜湊的值,第二頁數字印章=Hash(第一頁的數字印章+第二頁內容)。
3)合同第三頁的數字印章是第二頁的數字印章及第三頁內容加在一起後再雜湊後的值,即第三頁數字印章=Hash(第二頁的數字印章+第三頁內容)。
4)上述過程以此類推。
這樣對第一頁合同的篡改必然使其雜湊值和第一頁上的數字印章不符,且其後的2,3,4,5,…,n頁也是如此;對第二頁合同的篡改必然使其雜湊值和第二頁上的數字印章不符,且其後的3,4,5,…,n頁也是如此。
從上面的例子,我們可以發現梅克爾樹的優勢:
1)我們能知道資訊是否被篡改;
2)我們還能知道是第幾頁或者第幾塊的資訊被篡改了。
為了便於理解,我們看下梅克爾樹的典型架構,如下圖所示。
我們看到,首先這是一個樹結構,在底部有4個雜湊值,假設某個區塊中一共有4條交易事務,那麼每條交易事務都計算一個雜湊值,分別對應這裡的Hash1到 Hash4,然後再兩兩結對,再次計算雜湊值,以此類推,直到計算出最後一個雜湊值,也就是根雜湊。這樣的一棵樹結構就稱為梅克爾樹(merkle tree),而這個根雜湊就是梅克爾根(merkle root)。我們再來看一個示意圖:
可以看到,每一個區塊都是具有一棵梅克爾樹結構的,同時可以發現,梅克爾樹中的每一個節點都是一個雜湊值,因此也可以稱之為雜湊樹,而比特幣中的梅克爾樹是通過交易事務的雜湊值兩兩雜湊計算而成,所以這樣梅克爾樹稱為二叉梅克爾樹,那麼這樣的樹結構有什麼作用呢?
比特幣是分散式的網路結構,當一個節點需要同步自己的區塊鏈賬本資料時,並沒有一個明確的伺服器來下載,而是通過 與其他的節點進行通訊實現的。在下載區塊資料的時候,難免會有部分資料會損壞,對於這些一條條的交易事務,如何去校驗有沒有問題呢?這個時候,梅克爾樹就 能發揮作用了,由於雜湊演算法的特點,只要參與計算的資料發生一點點的變更,計算出的雜湊值就會改變。我們以第一個示意圖來說明,假設A通過B來同步區塊數 據,同步完成後,發現計算出的梅克爾根與B不一致,也就是有資料發生了損壞,此時先比較Hash12和Hash34哪個不一致,假如是Hash12不一 致,則再比較Hash1和Hash2哪個不一致,如果是Hash2不一致,則只要重新下載交易事務2就行了。重新下載後,再計算出Hash12並與 Hash34共同計算出新的梅克爾根比較,如果一致,則說明資料完整。我們發現,通過梅克爾樹,可以很快找到出問題的資料塊,而且本來一大塊的區塊資料可 以被切分成小塊處理。
來源:我是碼農,轉載請保留出處和連結!
本文連結:http://www.54manong.com/?id=104
相關文章
- 雜湊技術【雜湊表】查詢演算法 PHP 版演算法PHP
- 淺析雜湊演算法演算法
- 雜湊查詢演算法演算法
- 雜湊演算法簡介演算法
- Hash,雜湊,雜湊?
- 22 | 雜湊演算法(下):雜湊演算法在分散式系統中有哪些應用?演算法分散式
- 七夕也要學起來,雜湊雜湊雜湊!
- 【六褘-Java】雜湊演算法記憶體圖;set集合低層採用雜湊表儲存元素;雜湊演算法的流程Java演算法記憶體
- 【資料結構與演算法學習】雜湊表(Hash Table,雜湊表)資料結構演算法
- 你知道雜湊演算法,但你知道一致性雜湊嗎?演算法
- MD5雜湊加密演算法加密演算法
- 查詢演算法及雜湊表演算法
- 雜湊
- 什麼是雜湊演算法?雜湊競猜遊戲開發原理詳解演算法遊戲開發
- 【尋跡#3】 雜湊與雜湊表
- js 雜湊雜湊值的模組JS
- 雜湊表(雜湊表)原理詳解
- 雜湊表
- 雜湊碰撞
- 字串雜湊字串
- 樹雜湊
- 2024.3.26 雜湊
- 雜湊索引索引
- 演算法與資料結構——雜湊表演算法資料結構
- 雜湊對映用法及演算法例題演算法
- RIPEMD演算法:多功能雜湊演算法的瑰寶演算法
- 演算法與資料結構——雜湊衝突演算法資料結構
- ACM金牌選手講解LeetCode演算法《雜湊》ACMLeetCode演算法
- 資料結構和演算法-雜湊表 (HashTable)資料結構演算法
- 識別雜湊演算法型別hash-identifier演算法型別IDE
- 【演算法】雜湊表法四部曲演算法
- 什麼是安全雜湊演算法SHA256?演算法
- 安全的雜湊
- 異或雜湊
- 雜湊衝突
- 6.7雜湊表
- 關於雜湊
- 字串雜湊表字串