這篇我們要先介紹比特幣使用到的密碼學技術(shù):Hash(哈希)。hash是什么,有點類似「洗牌」把牌洗亂的概念,只是洗的不是牌,而是一筆數(shù)據(jù),這個「洗」的過程是經(jīng)過嚴謹定義的,且產(chǎn)生的結(jié)果會是固定長度的。常見的hash算法有MD5、RIPEMD-160、SHA1、SHA256等,不同hash算法「洗」的過程都不同,產(chǎn)生出來hash值長度也不同,像是MD5不管喂進去的數(shù)據(jù)多大,最終都會產(chǎn)生128 bits的結(jié)果,而SHA256產(chǎn)生的hash值則會是256 bits。一個好的hash算法通常需要具備以下這些特性:
1.輸入任意長度的數(shù)據(jù),產(chǎn)生的hash值是固定長度的
2.取得hash值的計算過程是快速的
3.輸入的數(shù)據(jù)有任何一點改變,產(chǎn)生的hash值會有很大的差異
4.具有單向性,可輕易輸入數(shù)據(jù)取得hash值,但無法從hash值得知原始數(shù)據(jù)的內(nèi)容
hash可以拿來做什么呢?假如今天阿牛在下班前打了一份500頁的重要文件,因為文件很重要不能帶離公司,那隔天他上班時如何得知是否有人趁晚上潛入公司偷改他的文件,有一個很簡單的作法,就是取得整份文件的hash值,比如說用SHA256取得一個256bits的hash值,然后記在紙上或其他地方,隔天到公司時,只要對這份文件取得hash值,然后跟昨天下班前得到那個256bits的hash值比對,如果兩者有差異,表示有人偷改這份文件,阿牛就要再仔細檢查這份文件,如果兩者一樣,表示文件沒有被修改過,阿牛可以安心的繼續(xù)編輯他的文件。
再回來看為什么一個好的hash值需要上述的四點呢?
1.固定長度:因為結(jié)果是固定長度的,阿牛可以知道要準備多大張的紙來抄,而不會有時長有時短,也不方便比對。若是程序來說,設計者可以事先規(guī)劃多大的空間放置hash值,不用擔心Overflow的問題
2.快速得到結(jié)果:雖然輸入的數(shù)據(jù)越大,計算hash的時間會相對增加,不過整體的過程還是不需要太復雜的計算,因此即便阿牛的文件是500頁,也可以快速的得到hash值
3.任何改變產(chǎn)生的結(jié)果都截然不同:阿牛的整份500頁文件即便有人多加了一個空格,隔天阿牛也可以明顯的知道hash值不一樣了,而第三個特性還有一個重要的原因,就是不能讓原始數(shù)據(jù)與hash值可以看出什么關(guān)聯(lián)性,因此即便是原始數(shù)據(jù)有任何一點改變,結(jié)果都是截然不同的
4.具有單向性:假如今天阿牛不小心將紙條掉落在電梯里,被其他人撿走也不會擔心重要文件的信息會外流,因為無法從hash值回推原始數(shù)據(jù)的內(nèi)容
hash應用非常廣泛,比如說網(wǎng)站登入時會先將密碼轉(zhuǎn)成hash值,若有人擷取到信息,密碼也不會外流。有些軟件也會提供hash值,使用者下載后可以將檔案hash比對,就能知道下載的軟件是否有被竄改。而數(shù)位簽章也是使用hash來減少需要加密的數(shù)據(jù)。不過有些hash算法像是MD5、SHA1已經(jīng)不建議使用了。
那么hash值與比特幣有什么關(guān)系呢?比特幣所謂的「挖礦」,其實就是不斷的計算hash
直到找到合法的hash值,這個合法的hash值就是我們上一篇說的「幸運草」。我們在第一篇文章里說到區(qū)塊鏈的特性之一「難以竄改」就是利用hash值一筆一筆串接下去產(chǎn)生「鏈」的概念,其中任何數(shù)據(jù)被竄改,會讓原本合法的hash值變成不合法,導致「鏈」斷掉下一篇我們就來講比特幣的「區(qū)塊」有哪些數(shù)據(jù),「挖礦」是怎么計算hash值的,并將「區(qū)塊」連成「區(qū)塊鏈」。