區塊鏈密碼學——哈希函數

區塊鏈密碼學——哈希函數

密碼學是區塊鏈以及一切網絡安全相關產業的基礎,而密碼學中的哈希函數又被普遍運用到區塊鏈中。

密碼學是區塊鏈以及一切網絡安全相關產業的基礎,而密碼學中的哈希函數又被普遍運用到區塊鏈中。拿比特幣來說,其錢包地址是哈希數值,挖礦是哈希計算,這就是為什麼要學點哈希函數。通過理解哈希函數,能間接的理解為什麼強大的密碼學基礎可以給比特幣投資人以信心,在沒有政府背書的比特幣世界,仍然願意投資比特幣,歸根結底其信心是建立在對密碼學的信心之上。

哈希函數主要特性

哈希算法並不是一個特定的算法而是一類算法的統稱。哈希算法也叫散列算法,一般來說滿足這樣的關係:f(data)=key,輸入任意長度的data數據,經過哈希算法處理後輸出一個定長的數據key。

輸入data可以是任意長度的字符串,比如LbitaG7yT6bPb

無論輸入多少字符串,都會輸出固定長度字符串的key,如這樣一個34位的比特幣錢包地址3Cbq7aT1tY8kMxWLbitaG7yT6bPbKChq64

能進行有效計算。給定合理的輸入,在合理時間內能算出合理的結果。一個長度的輸入是一秒內算出來,一萬個長度的輸入也能一秒內算出來,而不是算上一年才出結果。

這三個特性定義了一般哈希函數。

哈希函數附加特性

碰撞阻力(collision-resistance)

什麼是碰撞?對於函數H(),H(x) = H(y), x≠y, x和y算出來一樣的值,那麼x和y就碰撞了。兩個人穿了一樣的衣服,撞衫了。

碰撞阻力就是找不到這樣一個y,使y≠x 但是H(x) = H(y),這種情況我們就說哈希函數H()具有碰撞阻力。

具有碰撞阻力並不能說明真的找不到這樣一個y,只要可能的輸入足夠多,早晚會找到這樣一個y,只是時間問題。對於一個256位輸出的哈希函數來說,最壞的情況是你需要進行2256+1次哈希函數計算,平均次數為2128次(生日悖論,僅通過檢驗可能輸出數量的平方根次數,便大體能找到碰撞),如果一臺電腦每秒計算10000個哈希值,計算2128個哈希值需要花1027多年時間,簡直是天文數字,就算從地球誕生那天開始算到現在也還遠遠不夠用。

我們日常生活中遇到下載軟件的情況,會發現注重安全的網站會負責的放上信息摘要(message digest)。這個信息摘要就是哈希函數計算的輸出值。軟件下載到本地,用同一個哈希函數如MD5計算此文件生成的輸出值即摘要,和網站提供的摘要對比,如一致則說明文件在傳輸過程中完整可靠,沒有損壞或被篡改。這就是對碰撞阻力特性的重要應用。

隱秘性(hiding)

回頭看一下這個函數f(data)=key,輸入任意長度的data數據,經過哈希算法處理後輸出一個定長的數據key。

同時這個過程是不可逆的,無法由key逆推出data。不可逆,data可以被藏的好好的沒人能猜出來,即隱秘性。

隱秘性的好處在於只有持有data的人才能使用這個獨一無二的key。

解題友好(puzzle-friendliness)

如果對於任意n位輸出值y,假設k選擇高階最小熵分佈,如果無法在比2n小很多時間內找到H(k||x)=y中x值,那麼H哈希函數謎題友好。

一個搜索謎題包含如下內容:

哈希函數H

謎題ID

目標集合Y

求x滿足如H(id ll x)∈Y

集合Y的值越多謎題就越容易解答,id與Y共同決定了解決上述數學問題的難度,因為id和Y的範圍都可人為控制,這樣就可控制挖礦的難度。

哈希表

哈希表這種數據結構就是以哈希函數為基礎創建的。

這裡引用知乎的答案,通過一個生動的比喻來講述什麼是哈希表:

via:什麼是哈希表和哈希算法?

比如這裡有一萬首歌,給你一首新的歌X,要求你確認這首歌是否在那一萬首歌之內。

無疑,將一萬首歌一個一個比對非常慢。但如果存在一種方式,能將一萬首歌的每首數據濃縮到一個數字(稱為哈希碼)中,於是得到一萬個數字,那麼用同樣的算法計算新的歌X的編碼,看看歌X的編碼是否在之前那一萬個數字中,就能知道歌X是否在那一萬首歌中。

作為例子,如果要你組織那一萬首歌,一個簡單的哈希算法就是讓歌曲所佔硬盤的字節數作為哈希碼。這樣的話,你可以讓一萬首歌“按照大小排序”,然後遇到一首新的歌,只要看看新的歌的字節數是否和已有的一萬首歌中的某一首的字節數相同,就知道新的歌是否在那一萬首歌之內了。

當然這個簡單的哈希算法很容易出現兩者同樣大小的歌曲,這就是發送了碰撞。而好的哈希算法發生碰撞的幾率非常小。


分享到:


相關文章: