揭秘區(qū)塊鏈的核心技術(shù)之「哈希與加密算法 」
大家都知道,區(qū)塊鏈的關(guān)鍵技術(shù)組成主要為:P2P網(wǎng)絡(luò)協(xié)議、共識機(jī)制、密碼學(xué)技術(shù)、賬戶與存儲模型。而這些技術(shù)中,又以 密碼學(xué)與共識機(jī)制 這兩點(diǎn)為最核心。那么今天我們來詳細(xì)的聊一聊密碼學(xué),看一看密碼學(xué)技術(shù)是如何在區(qū)塊鏈中應(yīng)用的。
首先,我們需知道區(qū)塊鏈中用到的密碼學(xué)算法有哪些?其實(shí)就兩大類:
- 哈希算法
- 非對稱加密算法
一、區(qū)塊鏈中的哈希算法
哈希算法是區(qū)塊鏈中用的最多的一種算法,它被廣泛的使用在構(gòu)建區(qū)塊和確認(rèn)交易的完整性上。
它是一類數(shù)學(xué)函數(shù)算法,又被稱為散列算法,需具備三個基本特性:
- 其輸入可為任意大小的字符串
- 它產(chǎn)生固定大小的輸出
- 它能進(jìn)行有效計算,也就是能在合理的時間內(nèi)就能算出輸出值
如果要求哈希算法達(dá)到密碼學(xué)安全的話,我們還要求它具備以下三個附加特性:
1.碰撞阻力:
是指對于兩個不同的輸入,必須產(chǎn)生兩個不同的輸出。如果對于兩個不同的輸入產(chǎn)生了相同的輸出,那么就說明不具備碰撞阻力,或是弱碰撞阻力。
2.隱秘性:
也被稱為不可逆性,是指 y = HASH(x)中,通過輸入值x,可以計算出輸出值y,但是無法通過y值去反推計算出x值。為了保證不可逆,就得讓x的取值來自一個非常廣泛的集合,使之很難通過計算反推出x值。
3.謎題友好:
這個特性可以理解為,謎題是公平友好的,例如算法中 y = HASH(x),如果已知y值,想去得到x值,那就必須暴力枚舉,不斷的嘗試才能做到,并且沒有比這更好的辦法,沒有捷徑。
哈希算法有很多,比特幣主要使用的哈希算法是 SHA-256 算法。
除此之外,還有其他一些哈希算法也很流行,例如 MD5、SHA-1、SHA-2(SHA-224、SHA-256、SHA-384、SHA-512)、SHA-3 等,其中 MD5、SHA-1 已被證明了不具備 強(qiáng)碰撞阻力,安全性不夠高,因此市場上不再推薦使用。
我們以比特幣為例,來看一下哈希算法的具體應(yīng)用:
在比特幣中,使用哈希算法把交易生成數(shù)據(jù)摘要,當(dāng)前區(qū)塊里面包含上一個區(qū)塊的哈希值,后面一個區(qū)塊又包含當(dāng)前區(qū)塊的哈希值,就這樣一個接一個的連接起來,形成一個哈希指針鏈表,如下圖:
上面只是示意圖,那么在實(shí)際比特幣系統(tǒng)中,每個區(qū)塊包含哪些內(nèi)容呢:
重點(diǎn)關(guān)注一下上圖中的:
- Prev Block:記錄簽一個區(qū)塊的hash地址,32字節(jié)
- Merkle Root:是一個記錄當(dāng)前塊內(nèi)的所有交易信息的數(shù)據(jù)摘要hash值,32字節(jié)
- Nonce:一個隨機(jī)值,需要通過這個隨機(jī)值去找到滿足某個條件的hash值(挖礦),4字節(jié)
上面只是解釋了幾個重點(diǎn)的字段,其它字段通過字面應(yīng)該容易理解就不一一解釋了。
這所有的字段一起就組成了 block header(區(qū)塊頭),然后需要對 block header 進(jìn)行2次hash計算,計算完成的值就是當(dāng)前比特幣區(qū)塊的hash值。因為比特幣系統(tǒng)要求計算出來的這個hash值滿足一定的條件(小于某個數(shù)值),因此需要我們不斷的遍歷Nonce值去計算新的hash值以滿足要求,只有找到了滿足要求的hash值,那么這就是一個合法區(qū)塊了(這一系列動作也叫作挖礦)
python 示例: SHA-256(SHA-256 (Block Header)
我們再看一下上面的另一個重要字段: Merkle tree 字段。
Merkle tree 被稱為 默克爾樹,它也是哈希算法的一個重要應(yīng)用。
它其實(shí)是一個用哈希指針建立的二叉樹或多叉樹。
Merkle tree 如圖:
其樹的頂端叫做 默克爾根(Merkle Root),Merkle Root 也是一個hash值,它是怎么計算出來的呢?
比特幣中對每一筆交易做一個hash計算,然后把每2個交易的hash再進(jìn)行合并做hash,如圖中的 交易A的hash值是 H(A),交易B的hash值是H(B),再對這2個交易合并hash后就是H(hA|hb),就這樣一直往上合并計算,算到最后的根部就是 Merkle Root 了。
在比特幣和以太坊中都是使用的默克爾樹結(jié)構(gòu),但是以太坊為了實(shí)現(xiàn)更多復(fù)雜的功能,所以有三個默克爾樹。
至此,區(qū)塊鏈中的哈希算法應(yīng)用就介紹完了,接下來我們看一下非對稱加密算法。
二、區(qū)塊鏈中的非對稱加密算法
區(qū)塊鏈中有一個很關(guān)鍵的點(diǎn)就是賬戶問題,但比特幣中是沒有賬戶概念的,那大家是怎么進(jìn)行轉(zhuǎn)賬交易的呢?
這里就得先介紹區(qū)塊鏈中的非對稱加密技術(shù)了。
非對稱加密技術(shù)有很多種,如:RSA、ECC、ECDSA 等,比特幣中是使用的 ECDSA 算法。
ECDSA 是美國政府的標(biāo)準(zhǔn),是利用了橢圓曲線的升級版,這個算法經(jīng)過了數(shù)年的細(xì)致密碼分析,被廣泛認(rèn)為是安全可靠的。
所謂非對稱加密是指我們在對數(shù)據(jù)進(jìn)行加密和解密的時候,需使用2個不同的密鑰。比如,我們可以用A密鑰將數(shù)據(jù)進(jìn)行加密,然后用B密鑰來解密,相反,也可以用B來加密,然后使用A來解密。那么如果我想給某個人傳遞信息,那我可以先用A加密后,將密文傳給她,她拿到密文之后,用手上的B密鑰去解開。這2個密鑰,一個被成為公鑰、一個是私鑰。
在比特幣中,每個用戶都有一對密鑰(公鑰和私鑰),比特幣系統(tǒng)中是使用用戶的公鑰作為交易賬戶的。
我們先看下圖:
在圖中可以看到,在第一筆交易記錄中,是 用戶U0 來發(fā)起的交易,要將代幣支付給 用戶U1,是怎么實(shí)現(xiàn)的呢?
- 首先 用戶U0 寫好交易信息:data(明文,例如:用戶U0轉(zhuǎn)賬100元給用戶U1)
- 用戶U0 使用哈希算法將交易信息進(jìn)行計算,得出 H = hash(data),然后再使用自己的私鑰對 H 進(jìn)行簽名,即 S(H),這一步其實(shí)是為了防止交易信息被篡改用的
- 然后基于區(qū)塊鏈網(wǎng)絡(luò),將 簽名S(H) 和 交易信息data 傳遞給 用戶U1
- 用戶U1 使用 用戶U0 的公鑰 來對 S(H) 解密,就得到了交易信息的哈希值 H
- 同時,用戶U1 還使用哈希算法對 交易信息data 進(jìn)行計算,得出 H2 = hash(data)
- 對比上面2個哈希值,如果 H1==H2,則交易合法。說明 用戶U0 在發(fā)起交易的時候確實(shí)擁有真實(shí)的私鑰,有權(quán)發(fā)起自己賬戶的交易
- 網(wǎng)絡(luò)中每一個節(jié)點(diǎn)都可以參與上述的驗證步驟。
這個示例,就是比特幣中一次交易的簽名流程,即將 哈希算法與非對稱算法結(jié)合在一起用于了比特幣交易的數(shù)字簽名。
除此之外,比特幣中,公私鑰的生成、比特幣地址的生成也是由非對稱加密算法來保證的。
以上,就是區(qū)塊鏈體系中,核心技術(shù)之哈希算法與加密算法的應(yīng)用情況,歡迎一起交流。