雜湊函數(Hash Function)是一種數學運算,它能把任意長度的資料——一句話、一份文件、一段影片——轉換成一段固定長度的字串,這段字串就稱為「雜湊值」、「摘要」或「指紋」。不論你輸入的是一個字還是一部一百 GB 的電影,輸出的長度都一樣。
舉個例子,把「hello」這個字丟進 SHA-256 演算法,會得到:
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
這串 64 個十六進位字元,就是「hello」的 SHA-256 雜湊值。只要輸入內容完全一樣,任何人在任何電腦上算出來的結果都會一模一樣;但只要改動一個字母,整串雜湊值就會徹底不同。
很多人會把雜湊和加密搞混,這是兩件不同的事。加密是為了之後能解回原文,所以是可逆的;雜湊則是刻意設計成「算得出去、推不回來」的單向過程。後面的特性章節會說明這點,也可以參考雜湊 vs 加密那篇專文。
一個合格的雜湊函數,必須同時具備以下四個特性。理解這四點,等於理解了雜湊的本質。
不管輸入多大,輸出長度永遠固定。這個長度由演算法決定,跟內容多寡無關:
因為每 4 個位元剛好對應一個十六進位字元,所以位元數除以 4 就是字元數。這個特性讓雜湊值很適合當索引、當比對的依據——長度可預期,存起來、傳出去都方便。
從輸入算出雜湊值很容易,但想從雜湊值反推回原始輸入,在計算上是不可行的。這不是因為資料被藏起來了,而是因為雜湊過程會「壓縮並破壞」原始資訊——把任意大小的資料塞進固定長度,必然會丟失資訊,沒辦法還原。這也是為什麼雜湊適合用來保護密碼:就算資料庫外洩,攻擊者拿到的也只是雜湊值,不是密碼本身。
輸入只要有一丁點改變,輸出就會大幅變化,理論上約有一半的位元會翻轉。這個現象稱為「雪崩效應」(Avalanche Effect)。例如:
d077f244def8a70e5ea758bd8352fcd8fa3ebd6742c360b2d9652b7f78d9bd7d只是把開頭字母改成大寫,兩串雜湊值卻毫無相似之處。雪崩效應讓人無法從「兩個雜湊值有點像」去猜測「兩個輸入也有點像」,這對安全性至關重要。
同樣的輸入,永遠得到同樣的輸出。雜湊函數沒有隨機成分,今天算和明年算結果都一樣。正因如此,你才能用雜湊值來驗證一份檔案有沒有被改過——把下載回來的檔案重新算一次雜湊,跟官方公布的比對,相同就代表完整無誤。
你不需要懂背後的數學也能使用雜湊,但了解大致流程有助於建立直覺。以 SHA-256 為例,運算大致分成幾個階段:
關鍵在於這些運算經過精心設計,使得過程容易往前算、卻幾乎不可能往回推,同時放大任何微小的輸入差異——這就實現了前面說的單向性與雪崩效應。
市面上常見的雜湊演算法可以分成幾代,安全性與用途各有不同:
| 演算法 | 輸出長度 | 字元數 | 現況 |
|---|---|---|---|
| MD5 | 128 位元 | 32 | 已被攻破,僅供非安全校驗 |
| SHA-1 | 160 位元 | 40 | 已被攻破,正逐步淘汰 |
| SHA-256 | 256 位元 | 64 | 主流,目前安全 |
| SHA-512 | 512 位元 | 128 | 安全,64 位元系統上更快 |
1992 年問世,曾經是最普及的雜湊演算法。但研究人員早在 2004 年就找出了實際可行的「碰撞」——也就是兩份不同的資料卻產生相同的 MD5 值,如今用一般電腦幾秒鐘就能造出碰撞。因此 MD5 絕不能用於數位簽章、密碼或任何防竄改用途,現在它只適合拿來做沒有惡意對手的快速校驗,例如檢查檔案傳輸有沒有意外損壞。
1995 年由美國 NSA 設計,比 MD5 安全,曾廣泛用於 TLS 憑證與 Git。但 2017 年 Google 公布了名為 SHADetected/SHAttered 的實際碰撞攻擊,證明 SHA-1 也已不再安全。主流瀏覽器與憑證機構都已停止信任 SHA-1 簽章。
SHA-2 是目前的主力,SHA-256 與 SHA-512 是其中最常用的兩個成員,差別主要在輸出長度與內部運算的位元寬度。SHA-256 是現今最常見的選擇,廣泛用於 TLS、軟體簽章、區塊鏈等場景;SHA-512 安全強度更高,在 64 位元處理器上甚至可能比 SHA-256 更快。截至目前,SHA-2 家族尚無已知的實際碰撞攻擊。
雜湊的應用遍布資訊系統的各個角落:
選擇原則其實很直接:
想立刻動手算算看?打開工具輸入任意文字,就能同時得到 MD5、SHA-1、SHA-256、SHA-512 四種結果,也能上傳檔案計算 checksum。
立即使用雜湊值產生器