正如對于雙胞胎而言,他們各自的指紋也是獨一無二的,哈希函數(shù)的設(shè)計使得它也具有同樣的特性:即使是非常微小的輸入值差別,哈希函數(shù)的運算結(jié)果也會有非常巨大的差異。除此以外,哈希函數(shù)沒有任何啟發(fā)式算法,輸入和輸出的關(guān)系看起來是完全隨機的,例如給一個確定的輸出結(jié)果,要求對應(yīng)的輸入值應(yīng)該是多少,或者是要求輸出結(jié)果小于某個值,問一個符合條件的輸入值應(yīng)該是多少,這些問題的求解沒有什么技巧和方法可循,只能通過不斷地進行嘗試,嘗試的次數(shù)越多,越有可能找到答案。
我們可以利用哈希函數(shù)的這些特性實現(xiàn)很多功能。例如數(shù)據(jù)保護:將數(shù)據(jù)的內(nèi)容和數(shù)據(jù)的哈希值一起發(fā)送,接收者對接收到的數(shù)據(jù)進行哈希運算,對比即可知道數(shù)據(jù)是否被篡改。再比如,網(wǎng)站在進行用戶登錄時,可以在數(shù)據(jù)庫里存儲用戶密碼的哈希值,與用戶輸入的密碼的哈希值進行比對來驗證身份,好處是如果數(shù)據(jù)庫泄露,黑客也不能通過這些哈希值來反推出用戶的密碼,相對來說比較安全。
值得注意的是,哈希函數(shù)的輸入集合是無限的,而由于輸出長度固定,輸出的所有可能集合是有限的,根據(jù)鴿籠原理:n+1個元素放到n個集合中去,其中必定有一個集合里至少有兩個元素。所以兩個不同的輸入值有相同的哈希值理論上是一定存在的,但是好在這樣的事情發(fā)生的概率非常小,而且哈希函數(shù)也在不斷改進,SHA1函數(shù)就曾經(jīng)被密碼分析人員發(fā)現(xiàn)了有效的攻擊方法,目前比特幣在內(nèi)的系統(tǒng)采用了更先進的SHA2系列算法,比特幣多年的良好運行表明至少到目前為止SHA256算法經(jīng)受了檢驗。此外,連續(xù)多次使用哈希函數(shù)也是一種更加安全的選擇。
哈希函數(shù)在比特幣中有多處運用,可以說扮演了非常關(guān)鍵的角色。
1. 對交易信息進行壓縮和驗證
由于區(qū)塊鏈要處理的交易信息內(nèi)容龐大,將每個塊內(nèi)的所有數(shù)據(jù)直接以序列的方式存儲將會非常低效且耗時,但是利用哈希函數(shù)可以對信息進行壓縮和驗證。使用Merkle樹可以很快驗證某筆交易是否屬于某個區(qū)塊,它的簡化示意圖如下,對于打包到一個區(qū)塊的所有交易,首先將它們劃分為幾個部分,如下圖中的交易信息1、交易信息2……并計算出對應(yīng)的哈希值1、哈希值2… …之后兩兩結(jié)合進行哈希運算,最終得到這個Merkle樹的根哈希值。如果某一筆交易信息記錄的數(shù)據(jù)有變化,那么最終算出來的Merkle根哈希值也會不一樣。
那么為什么要使用這樣的算法,而不是直接將所有的交易信息串成一個大塊并且算出它的哈希值呢?原因在于這樣的二叉樹結(jié)構(gòu)可以允許僅僅進行少量數(shù)據(jù)的驗證,同時如果交易的數(shù)據(jù)信息有誤也可以快速定位至出錯的位置。
2. 用于工作量證明,形成共識
為什么都說區(qū)塊鏈?zhǔn)遣豢纱鄹牡哪?首先考慮一個如下的簡單的哈希鏈:每次打包時包含上一個區(qū)塊的哈希值和這個區(qū)塊的相關(guān)信息,如果某一個塊的信息被篡改了,往后所有塊的哈希值都會有變化,其他人也會注意到這個變化。但是這樣設(shè)計的問題在于任何人都可以修改某一個區(qū)塊上的信息,重新計算剩余鏈條的所有信息,并且聲稱這才是正確的鏈。
比特幣設(shè)計的精妙之處在于,它使得要實現(xiàn)這樣的過程需要付出昂貴的成本。它采用工作量證明的共識機制,大家爭相證明自己完成了一定的工作量,最先完成的獲得記賬權(quán)。而工作量指的就是要求找到一個隨機數(shù),使得它加上一個給定的字符串后計算得到的哈希值小于某個值。在比特幣中,這個給定的字符串包含了版本號、上一個區(qū)塊的哈希值、以Merkle根哈希值存放的交易信息,時間戳、難度值的信息。
礦工找到符合要求的隨機數(shù),既“合法”宣告了自己的記賬權(quán),也通過哈希函數(shù)完成了對交易信息的編碼,并以一種不可篡改的方式存儲。如果有人試圖想更改交易信息,他必須運氣特別好,能夠快速且成功地找到往后鏈條的每個區(qū)塊的正確的隨機數(shù),使得他篡改信息后的鏈條成為當(dāng)前最長的鏈條,這樣的情況理論上的確可能發(fā)生,但是在算力有限的情況下,概率比較小。
3 用于生成比特幣錢包地址
在比特幣的交易中,大家都能看到的信息如下圖,左上角是交易號碼,綠色箭頭連接的兩個字母和數(shù)字組成的字符串是比特幣地址,表明比特幣在兩個地址之間有了轉(zhuǎn)移。而這個地址的生成是由錢包的公鑰經(jīng)過哈希函數(shù)轉(zhuǎn)換而成的。其中公鑰是由隨機數(shù)字構(gòu)成的私鑰通過非對稱加密形成的。交易時公鑰和比特幣地址都需要公開發(fā)布,來使區(qū)塊鏈系統(tǒng)驗證付款交易的有效性。
在這里哈希函數(shù)扮演的角色相當(dāng)巧妙:量子計算機可以很容易從公鑰反推出私鑰,但是量子計算機在面對哈希算法時則難以找出擁有同一個哈希值的兩個不同輸入值,可以說中本聰?shù)倪@個設(shè)計使得通過一些操作可以讓比特幣有可能抵御量子計算機的威脅:比如每個比特幣地址都只用一次,每次付款轉(zhuǎn)賬到別人的地址和自己的找零地址中。
由上可見,中本聰通過巧妙的設(shè)計很好地利用了哈希函數(shù)的特性,并最終形成了一個良好運轉(zhuǎn)的系統(tǒng),這當(dāng)中牽扯到了多種交叉學(xué)科,也啟示我們在技術(shù)創(chuàng)新時需要抽象出一件事物的本質(zhì),注意與其他領(lǐng)域相互融合。隨著技術(shù)的進步,新的哈希函數(shù)也在不斷地被設(shè)計出來,并接受著大家的檢驗,哈希函數(shù)的發(fā)展可以說是“道高一尺,魔高一丈,愈進愈阻,永無止息”。
請微信搜索“哈希研究院”,這是一個聚焦區(qū)塊鏈底層技術(shù)與應(yīng)用場景探究的研究型平臺,旨在為區(qū)塊鏈技術(shù)的普及做出推動性貢獻,全方位服務(wù)哈希未來公司的發(fā)展與應(yīng)用前景。
哈希未來愿景是開創(chuàng)可信數(shù)字時代。我們希望通過努力,在未來逐步實現(xiàn)安全可信的資產(chǎn)數(shù)字化。而實現(xiàn)這個目標(biāo),需要以區(qū)塊鏈技術(shù)為支撐,哈希未來借助區(qū)塊鏈實現(xiàn)資產(chǎn)確權(quán),向大眾普及了區(qū)塊鏈的知識與技術(shù)。