- 區塊鏈浪潮:連接技術與應用
- 賈英昊 江澤武等編著
- 7字
- 2019-09-16 15:06:44
第5章 哈希函數
5.1 哈希函數的特性
哈希函數是指一類數學運算過程,它接受任意大小的輸入值,經過運算后可以給出一個確定的固定長度的輸出值,這個輸出值可以作為這個輸入值的數字指紋。正如對于雙胞胎而言,他們各自的指紋也是獨一無二的,哈希函數的設計使得它也具有同樣的特性:即使是非常微小的輸入值差別,哈希函數的運算結果也會有非常巨大的差異。除此以外,哈希函數沒有任何啟發式算法,輸入和輸出的關系看起來是完全隨機的,例如給一個確定的輸出結果,要求對應的輸入值應該是多少,或者是要求輸出結果小于某個值,問一個符合條件的輸入值應該是多少,這些問題的求解沒有什么技巧和方法可循,只能通過不斷地進行嘗試,嘗試的次數越多,越有可能找到答案。
人們可以利用哈希函數的這些特性實現很多功能。例如數據保護:將數據的內容和數據的哈希值一起發送,接收者對接收到的數據進行哈希運算,對比即可知道數據是否被篡改。再比如,網站在進行用戶登錄時,可以在數據庫里存儲用戶密碼的哈希值,與用戶輸入的密碼的哈希值進行比對來驗證身份,好處是如果數據庫泄露,黑客也不能通過這些哈希值來反推出用戶的密碼,相對來說比較安全。
值得注意的是,哈希函數的輸入集合是無限的,而由于輸出長度固定,輸出的所有可能的集合是有限的,根據鴿籠原理:n+1個元素放到n個集合中去,其中必定有一個集合里至少有兩個元素。所以兩個不同的輸入值有相同的哈希值理論上是一定存在的,但這樣的事情發生的概率非常小,而且哈希函數也在不斷改進的過程中,SHA1函數就曾經被密碼分析人員發現了有效的攻擊方法,此后如比特幣在內的系統采用了更先進的SHA2系列算法,比特幣多年的良好運行,表明SHA256算法經受了時間的檢驗。此外,連續多次使用哈希函數也是一種更加安全的選擇。
哈希函數在比特幣中有多處運用,可以說扮演了非常關鍵的角色。