在做權限驗證的時候,有一個觀念你一定要先搞懂——雜湊(Hash)。
為什麼這麼重要?因為不管你之後要做密碼驗證、Token 驗證、OTP 還是 JWT,通通都會碰到它。
如果你搞不清楚雜湊是什麼、能幹嘛、不能幹嘛,後面在實作的時候很容易搞混,然後就會踩到一堆坑。
這篇文章會用最白話的方式,讓你徹底搞懂雜湊到底在幹嘛。
雜湊是什麼?
從字面上來理解
「雜湊」這兩個字拆開來看:
- 雜:很雜、很亂
- 湊:湊在一起
合起來的意思就是:把東西打散、攪亂、湊在一起,變成一個全新的東西。
英文叫做 Hash,有時候你也會看到有人直接音譯成「哈希」,像是「哈希表」、「哈希函式」,指的都是同一件事。
實際上怎麼運作?
假設你有一份資料,不管是一段文字、一張圖片、還是一個檔案都可以。
你把這份資料丟進一個叫做 Hash Function(雜湊函式) 的東西,它就會輸出一個全新的值,這個值就叫做雜湊值。
你的資料 ──→ Hash Function ──→ 雜湊值就這麼簡單。
雜湊最重要的特性:回不去了
單向的,不能逆轉
雜湊最最最重要的特性就是:它是單向的。
什麼意思?就是你的資料經過雜湊之後,會變得完全認不出來,而且沒辦法從雜湊值推回原本的資料。
打個比方:
- 你把一顆蘋果丟進果汁機 → 變成蘋果汁
- 你沒辦法把蘋果汁變回一顆完整的蘋果
雜湊就是這樣,是個不可逆的過程。
這在權限驗證上有什麼用?
這個特性超級重要!
比如說你在做會員登入功能,使用者設定了密碼 abc123。你不會直接把 abc123 存進資料庫(這樣太危險了),而是把它雜湊過後再存。
之後使用者登入的時候,你就把他輸入的密碼再雜湊一次,然後比對兩個雜湊值是不是一樣。
這樣就算資料庫被偷了,小偷拿到的也只是一堆雜湊值,他沒辦法知道原本的密碼是什麼。
常見的雜湊方式
市面上有很多不同的 Hash Function,常見的有:
- MD5:比較舊,算是比較簡單的
- SHA-256:目前很常用,比較安全
- SHA-512:更複雜,安全性更高
越複雜越難破解
你用的 Hash Function 越複雜,產生出來的雜湊值就越難被看出原本是什麼,也就越難被還原。
可以這樣想像:
- 簡單的雜湊 = 馬賽克打得很薄,有心人還是看得出來
- 複雜的雜湊 = 馬賽克打得超厚,根本看不出原本是什麼
雜湊真的完全沒辦法破解嗎?
理論上不行,但有人用偷吃步
雖然說雜湊是單向的、不能逆轉,但還是有人想出一些偷吃步的方法。
最有名的就是查表法,其中最知名的叫做彩虹表(Rainbow Table)。
彩虹表是什麼?
因為 Hash Function 是固定的數學公式,所以:
A經過某個 Hash Function 永遠會變成XXXB經過同一個 Hash Function 永遠會變成OOO
既然規則是固定的,那有心人就可以事先把大量常見的資料都雜湊過一遍,建立一張超大的對照表。
| 原本的值 | 雜湊後的值 |
|---|---|
| password | 5f4dcc3b… |
| 123456 | e10adc39… |
| admin | 21232f29… |
| … | … |
這張表可能有幾億筆資料。
當他拿到你的雜湊值,只要去這張表裡面找,找到一樣的雜湊值,就可以反推出原本的資料是什麼。
所以太簡單的雜湊很危險
像 MD5 因為算法比較簡單,現在網路上已經有超級大的彩虹表可以查。你用 MD5 雜湊過的東西,很可能一查就被破解了。
這也是為什麼現在做權限驗證的時候,會建議用更複雜的 Hash Function,或是搭配其他技術(像是加鹽)來增加破解難度。
重點整理
來幫大家複習一下今天講的重點:
- 雜湊就是把資料打亂,變成一個新的值
- 雜湊是單向的,沒辦法從雜湊值推回原本的資料
- Hash Function 越複雜越安全,像 MD5 太簡單已經不夠用了
- 彩虹表是一種偷吃步,事先建好對照表來查
- 在做密碼驗證、Token、OTP、JWT 等等的時候,都會用到雜湊的觀念
最後
搞懂雜湊是做權限驗證的第一步。之後我們還會聊到編碼(Encode)和加密(Encrypt),這三個東西很容易搞混,但它們是完全不同的東西。
先把雜湊搞懂,後面學其他的就會輕鬆很多囉!