密碼學基礎課
現代密碼學的基石——雜湊函數的「雪崩效應」
雜湊函數(hash function,中國大陸常譯作「哈希」,也稱散列函數)就像一台「資料絞肉機」:不管丟進去什麼——一個字、一部小說、一整顆硬碟——出來的都是固定長度的一串「指紋」。SHA-256 的輸出永遠是 256 位元,也就是 64 個十六進位字元。它有兩個讓密碼學家離不開的性格。
性格一:單向——絞成肉餡,變不回豬
從輸入算雜湊值,一眨眼;從雜湊值倒推輸入,沒有捷徑,只能一個一個猜。這就是單向性(抗原像)。同時,要找到兩個不同輸入卻算出同一個雜湊值,也幾乎不可能(抗碰撞)。
性格二:雪崩——改一個字母,面目全非
好的雜湊函數,輸入只要動一個位元,輸出就會有大約一半的位元跟著翻轉,看起來像換了一個毫不相干的亂數。這叫雪崩效應:山頂滾下一顆小石子,山腳下是整片雪崩。
來看真實數據(已用 sha256sum 核對):
password123 →
ef92b778bafe771e89245b89ecbc08a44a4e166c06659911881f383d4473e94f
Password123 →
008c70392e3abfbd0fa47bbc2ed96aa99bd49e159727fcba0f2e6abeb3a9d601
兩個輸入只差一個字母的大小寫——在 ASCII 裡,p(0x70)和 P(0x50)只差1 個位元。但兩個雜湊值的 256 位元中有 117 位元不同(約 45.7%),64 個字元中有 61 個對不上。雜湊值「長得像不像」,完全不會透露輸入像不像。
這跟你的密碼有什麼關係?
可靠的網站不會儲存你的密碼原文,只存它的雜湊值。你登入時,系統把你輸入的密碼再算一次雜湊,跟資料庫裡的比對:一樣就放行。就算資料庫被偷,駭客拿到的也只是一堆「指紋」,沒辦法直接倒推出密碼。
不過光用 SHA-256 還不夠:
- 加鹽(salt):替每位使用者配一段隨機字串,和密碼拼在一起再雜湊。這樣兩個人都用
password123,存下來的雜湊值也不同,攻擊者預先算好的「彩虹表」就失效了。 - 慢雜湊:SHA-256 太快了,顯示卡一秒能猜幾十億次。專門存密碼要用刻意設計得又慢又吃記憶體的演算法,例如 bcrypt、scrypt、Argon2,讓每猜一次都要付出代價。
但再好的雜湊也救不了白密碼:password123 在外洩字典裡排得很前面,攻擊者第一批就會試它。所以,請用灰密碼。
動手試試:親眼看雪崩
提示:試著只改一個字母、加一個空格,看看有多少位元翻轉。計算全部在你的瀏覽器裡以 Web Crypto 完成,不會上傳。
課堂小結:雜湊是單向的資料指紋;輸入改一點,輸出變一半(雪崩效應)。網站只存加鹽的慢雜湊,不存明文密碼。
思考題:如果雜湊沒有雪崩效應,改一個字母只變一兩個字元,攻擊者能利用這點做什麼?
思考題:如果雜湊沒有雪崩效應,改一個字母只變一兩個字元,攻擊者能利用這點做什麼?