從區塊鏈的結構來看,後一區塊裡保存了前一區塊的哈希,這保證了區塊鏈上的每一個區塊都不能被任何人進行篡改。
對於區塊鏈,大家有沒有想到,這樣的結構其實有個非常大的漏洞,這個漏洞很可能會導致整個區塊鏈的技術和架構都沒有任何意義,這個漏洞到底是什麼呢?就是區塊鏈的哈希算法。
大家知道,哈希就是一串數字的縮寫,我們看3007區塊可以縮寫為765677這串數字,正向的計算也就是從3007區塊數據進行的哈希運算是沒有問題的,3007區塊是和765677相對應的。但如果,我們反向計算,也就是說我們可以算出還有什麼樣的哈希也是765677,這會不會帶來什麼問題?
這一定會帶來問題的,如果我們能反向的計算,還有什麼區塊的哈希是765677的話,我們可以拿一個假的3007區塊去替換真的3007區塊,替換之後不管別人如何驗證,這個假的都是真的,因為這個區塊的哈希就是765677也就是記錄在3008區塊裡的前一區塊哈希數字,這是不是很可怕?
我們再進一步來看,大家知道計算機裡所有數據都是以數字來儲存的,我們假定3007區塊的數據被儲存為了區塊下面的一串數字,比如有一種叫「後6位」的哈希算法,大家看,這串數字的後6位被當成3007區塊的哈希,當然,這是一個非常簡單的哈希算法,在這裡僅作說明。
我們用「後6位」算法就可以得到3007區塊的哈希就是最後6位765677,這裡問題來了,我們是可以反向計算的,就是我們能猜到還有什麼數據的哈希值也是765677,看下圖,比如上面幾串數字的哈希值也是765677,對比原數據,這些數據藍色的部分被改動過了,但是這個數據的哈希值也是765677。
這樣的話,豈不是可以隨意的去改變數據,篡改區塊的內容而別人無法通過哈希算法去驗證數據的真偽的?所以呢,有必要介紹一下區塊鏈最常用的哈希算法:SHA256。
SHA256是將任何一個數據計算成一個256(2的8次方、32位元組)位的一串數字。這種哈希算法的最大好處就是它無法反算,就是說我們知道左邊這串數據可以算出右邊這個數值(右邊這個數據就是左邊這個數據的哈希),但是沒法反算就是無法推算出還有什麼樣的數據可以得到右邊這個哈希數值。
除此以外,SHA256算法還有一個巨大的優勢就是,你不論改動了原數據裡面的任何一個數,比如圖中的紅色數據被改動,再算出的哈希數據與原來的哈希是完全不同的數值,不是一點區別而是完全不一樣。
我們稱哈希(hash)為散列函數,這是哈希的學名。為什麼叫它散列函數呢?就是這種函數的特點是兩個長得非常一樣的數據,僅有幾位或者1位不同,但經過SHA哈希算法計算之後得出的哈希值是完全不一樣的。所以我們稱哈希位散列函數。
不可反算的哈希算法比如SHA哈希算法,在區塊鏈中還有一些與SHA類似的哈希算法都有一個「不可反算」的本質特徵。事實上,不可反算的算法是加密通信、密碼學、區塊鏈、數字貨幣的基石之一。