好的HASH算法有什麼特點?
注意HASH算法有很多,比如MD5、SHA-1、SHA-2等,再如BTC用的SHA-256和RIPEMD-160等。
至少有這麼兩個特點:
1、對於任意兩個不同的輸入,應該產生不同的輸出。(這叫抗碰撞)
2、正向計算很容易,反過來從輸出倒推輸入,就非常難,只能靠暴力猜。(這叫不可逆)
先看第一個特點:抗碰撞
一個好的HASH算法,對於任意兩個不同的輸入,應該產生不同的輸出。
事實證明,MD5、SHA-1不能算很好的HASH算法,因為王小雲院士等人,已經可以找到兩個不同的輸入,產生相同的HASH輸出。具體可以看看相關文章1、2。
如何形象理解這個特點呢?
首先,這個HASH算法的輸出必須要有一定的長度,如果長度不夠,肯定會有重複的。比如假設一個HASH算法,輸出只有1位,輸出不是0就是1,那是不是運行兩、三次,就能找到了不同輸入相同輸出了呢!如果輸出只有兩位,這個HASH的輸出就只有4種可能,00、01、10、11,那是不是運行四、五次,就能找到不同輸入相同輸出了呢!
所以MD5有128位這麼長,SHA-256有256位這麼長!
其次,要保障HASH值是非常隨機、非常均勻地落在整個輸出空間上。而且輸入有一點點的不同,輸出都會全然的不同。
這樣,就有了一種ID的效果,HASH就像是每個輸入各異的「指紋」。比如,你把1000萬份不同的文件都做了HASH,每份文件都獲得一個獨一無二的HASH值,就可以把這個當作是一個文件的ID。每個ID都指代了一個獨一無二的文件,如果再遇到ID相同的,就表明遇到相同的文件了。
再次,要能理解,輸出的空間是非常大的。
對於像RSA-256這樣的算法,其輸出位數為256位,那麼可能的值就會有10^78個(也即2^256個),這是多麼大的一個數呢?
全地球沙子的數量(不只是海灘上的,而是所有),有人估算過,大致是7*10^21個,還不到10^22個。
全宇宙星球的數量,也大致不過7*10^22個,還不到10^23個。
你給它兩個不同的輸入,它產生相同輸出的概率,比下面這個例子中的概率還要小得多:
你隨便在一個星球上選了一粒沙子,另外一個人,在完全不受你影響的情況下,也隨機在某個星球上隨機選了一粒沙子,結果你倆選擇了同一粒沙子!然後你倆還不約而同地選擇了這個沙子中的同一個原子!
現在看第二個特點:不可逆
一個好的HASH算法,要求正向計算很快,但反向幾乎不可能。
比如,我現在有一個BTC私鑰,形如:
5HvrDrdQ9EpJTcJHXuctU9vUjydzuZ1????????????????DCHa
為了保密,我把其中16個字符用?代替。
計算出這個私鑰的MD5值為:
630a0cec43d49095027b224ea0f2b317
那麼,請問,全世界的黑客,有沒有能力通過破解MD5,得到我這個私鑰呢?
答案是:按照現在的能力,不能。
黑客的做法,只能是,不斷嘗試這16個?號可能的組合,計算其MD5值,以期有一天能算出相同的MD5值。
但這種暴力猜解需要很長時間。(大致毛估一下,以目前的技術,如果全世界黑客聯合起來,擁有類比全球BTC挖礦那麼大的算力,那也至少要算5年。)
那麼,挖礦是在幹什麼
2021年6月13日18:09:30,BTC礦工們挖出一個HASH:
00000000000000000009813c8a3b95e3a75d878419547b7fe4dd71f9dc71da72
看看這個HASH多麼漂亮!它的前面有多少個0!
上面是用16進制表示的,所以,每個0其實是二進制的0000,所以上面那個HASH,前面是19*4=76個二進制的0!
這個HASH是一個區塊的HASH(嚴格的說,是這個區塊頭部的HASH)。
最近每10分鐘就出一個這麼漂亮的。
礦工們做了多少次HASH才做出這麼漂亮個HASH呢?
不知道,反正平均2^76次才會出現一個這樣的,你說做了多少次呢。
他們這麼費勁挖這個,圖啥呢?
圖這個區塊獎勵的BTC。
挖出這個區塊的礦工(可能是很多人一起挖的),得到了6.54164549個BTC,其中6.25個是系統獎勵的,剩下的是賺的手續費。
哦,我大致明白HASH了,區塊又是什麼?
現在給大家講講區塊鏈的老祖宗—BTC—的工作原理。
如果一遍看不懂,就看兩遍,兩遍看不懂,就大聲讀第三遍。
一般都能讀懂。
1、互聯網中若干個節點(節點就是計算機啦!)同時運行BTC軟件。這些軟件是開源的,誰都可以下載了來運行(本文說的節點是指全功能節點,全球目前大約有1000個左右)。
2、人們如果要發起BTC轉賬(也即交易),就讓某個節點在互聯網廣播轉賬信息,此交易很快傳遍全網每個節點。每個節點都會檢查它所收到的交易是否符合邏輯(比如有沒有那麼多錢來轉賬),如果不對,就會把這個交易拋棄掉。
轉賬就是:張三給李四發送1個BTC,王五給趙六發送0.1個BTC,諸如此類。差不多就是這個意思,每一筆轉賬也叫一個交易。
3、平均每隔一段時間(平均10分鐘),網內某個節點就會率先打包出一個區塊,區塊裏面含有這段時間的所有交易數據,這個區塊會廣播到全網,每個節點都會收到該區塊(大小在1M左右)。
3a:打包是有條件的,這個區塊的頭部的HASH值必須很好看。
3b:平均10分鐘才出一個,這是由挖礦難度導致的。難度是動態調整的,每兩周調整一次,調整使得全網平均每10分鐘才能挖出一個區塊。
在一個完全去中心化的網絡中,難度調整是如何做到的呢?方法是:每過2016個區塊,所有節點都會自發地調整難度(寫在代碼里了)。新的難度是由最近2016個區塊的花費時長與20160分鐘(兩周)比較後調整得出的。如果花費時間短於20160分鐘,就將難度調大一些,反之亦然則調小一些。難度可以簡單地理解為要求HASH值前面有多少個0。
3c:每個10分鐘內,世界上都會發生很多筆交易,這些交易都等着打包(最終只有打包在區塊里的交易才被人們承認)。每個試圖打包的礦工,把自己收到的、尚未打包的交易,放在區塊里(由於區塊大小的限制,平均一個區塊能裝大約2000多個交易),然後通過填充區塊中的隨機數區域,計算HASH,以期找到一個好看的HASH(符合難度就叫好看),找到了就叫打包成功(也就是挖礦成功),趕緊廣播出去。
3d:每次收到廣播來的區塊,各節點檢驗該區塊是否符合對區塊的要求(至少HASH要好看嘛!),如果符合,就把此塊保存下來,然後開始試圖出下一個塊(也即繼續挖礦),把已經收到但尚未打包的交易打包進入下一個要出的塊。
4、所有節點都在搶着打包,因為誰能正確打包誰就能得到BTC獎勵。
4a:每成功出一個區塊,打包者將會被獎勵若干個BTC。最早一開始是獎勵50個,每210000個區塊(大約4年)獎勵減半,所以後來是25個、12.5個、現在是6.25個,到2140年就會無幣可挖。
4b:事實上,礦工們除了可以得到系統的獎勵,還能得到區塊中的手續費。
5、每個節點收到區塊後,如果驗證無誤,就接受該區塊,將其附加到自己保存的區塊鏈上。
5a:由於每個節點都和其他節點不斷同步,所以每個節點(全功能節點)都保存着從第一個區塊到現在這個區塊的數據(目前已經產生將近70萬個區塊)。
5b:一個區塊的頭部,會含有本區塊體內全部交易的merkle根(其實也是一種HASH計算啦),如果區塊體內的某個交易被篡改,可以通過計算merkle根,和頭部的merkle根比較,從而發現篡改。
5c:一個區塊的頭部,還會含有上個區塊頭部的HASH值(可以簡稱為區塊的HASH)。這就可以校驗上個區塊是否完整、正確(因為任何數據差錯,都做不出好看的HASH了)。你可以從最新的區塊,一直追溯到創世區塊(第一個區塊),確保沒有任何數據被改動過。
5d:整個區塊鏈上,如果其中任何一個區塊,有任何一點點的篡改,都會導致這個區塊的HASH值不再是一個好看的HASH,也會導致其後區塊的HASH都不再好看,任何明眼人,都會知道數據不對了。而每個好看的HASH,都是全球若干礦工,使用若干礦機,花着若干電費,辛辛苦苦挖出來的。一個試圖篡改區塊的人或組織,沒有這麼強大的能力。
結語
現在,你是不是了解了HASH,了解了挖礦,了解了區塊鏈為什麼這麼能防篡改了呢!
我簡單總結一下:
HASH很容易計算,但反過來倒推就不容易;輸入有一點改變,輸出就會大變;對於一個好的HASH算法,不同的輸入,肯定會是不同的輸出,不用擔心碰撞;HASH值可以當作ID來看待;通過對比HASH,可以判斷輸入是否被人改了。
挖礦是為了給一個區塊找一個好看的HASH,也即前面若干位是0的HASH;不管有多少節點在挖礦,都能夠自動、簡單地調整難度,使得保證大約10分鐘才能找到一個好看的HASH;每個區塊都將自己那個好看的HASH,放在下一個區塊的頭部;每個全節點都記錄著所有區塊的數據,而且可以很方便的驗證所有區塊沒有被人改動過;如果有人想改歷史區塊里的數據,那要費老鼻子勁了!
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/273351.html
微信掃一掃
支付寶掃一掃