Hash的應(yīng)用非常廣泛,從對比工具到提升查詢效率的算法等等,本文主要講Hash函數(shù)在密碼學里的一些應(yīng)用。
Hash的定義
密碼學哈希算法是一種特殊的函數(shù),它接收任意長度的輸入數(shù)據(jù)(稱為“消息”),并將其轉(zhuǎn)換(或“壓縮”)成一個固定長度的、看似隨機的字符串(稱為“哈希值”、“摘要”或“指紋”)。
你可以把它想象成一個高度安全且高效的“數(shù)字指紋生成器”。無論你輸入的是整本百科全書還是僅僅一個字母,它都會輸出一個固定長度(例如SHA-256是256位,即64個十六進制字符)的唯一摘要。
核心公式:
哈希值 = HashFunction(消息)
例如:
HashFunction("Hello World")
->
a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146
Hash的特性
三個特性:
-
確定性
相同的輸入消息一定會產(chǎn)生完全相同的輸出哈希值。
這是最基本的要求,否則無法進行驗證。 -
高效性
計算任何長度消息的哈希值都應(yīng)該非常快速(在現(xiàn)代硬件上)。
無論是1KB的文件還是1TB的文件,計算其哈希值的時間應(yīng)該是線性的且可接受的。 -
抗碰撞
極其困難(在計算上不可行)找到兩個不同的輸入消息,使得它們的哈希值相同。
Hash的計算原理
在數(shù)學上,單向函數(shù)是滿足以下兩個條件的函數(shù) ( f ):
- 正向計算容易:給定任何輸入 ( x ),計算$ ( y = f(x) ) $是高效的。
- 逆向計算困難:給定一個輸出結(jié)果 ( y ),想要找到任何一個輸入$ ( x' ) 使得 ( f(x') = y ) $ 是計算上不可行的(需要耗費資源巨大)。
一個簡單的類比(但不是完美的哈希):
想象一個函數(shù) $ ( f(a, b) = a \times b )$。
- 正向計算:計算 $ ( 13 \times 17 = 221 )$ 非常快。
- 逆向計算:如果我只告訴你結(jié)果是 $ ( 221 )$,讓你找出是哪兩個質(zhì)數(shù)相乘得到的,這就困難得多(你需要進行質(zhì)因數(shù)分解)。
哈希函數(shù)就是利用了這種數(shù)學上的不對稱性:計算容易,反轉(zhuǎn)極難。現(xiàn)代哈希算法的“反轉(zhuǎn)”困難度建立在諸如模運算、位運算、邏輯函數(shù)等數(shù)學操作混合的復雜性之上,其安全性可歸約到一些著名的數(shù)學難題(如尋找碰撞)。
浙公網(wǎng)安備 33010602011771號