2026年9月14日 星期一

為什麼非要 12 碼密碼?密碼學演算法的殘酷真相

「密碼長度至少要 10 位數」、「必須包含大小寫字母與特殊符號」、「不能與前幾次重複」、「每 90 天強制更換一次」……

相信每個人的公司 MIS、金融 App 或雲端平台,都跳出過這種讓人抓狂的警告。很多人的直覺反應都是:「我都已經設了大小寫加特殊符號,到底還想怎樣?廠商是不是故意在找麻煩?」


第一章:為什麼各大系統,都在強迫你設定「10 碼以上的強密碼」?

「密碼長度至少要 10 位數」、「必須包含大小寫字母與特殊符號」、「不能與前幾次重複」、「每 90 天強制更換一次」……

相信每個人的公司 MIS、金融 App 或雲端平台,都跳出過這種讓人抓狂的警告。很多人的直覺反應都是:「我都已經設了大小寫加特殊符號,到底還想怎樣?廠商是不是故意在找麻煩?」


痛點在於,使用者被這些繁瑣的規則折磨得痛不欲生,最後乾脆把密碼寫在貼紙上、或是只在尾數改個數字——結果安全沒提升,體驗反而爛透了。

但廠商真的只是在搞你嗎?

不,這是因為在現代駭客的工具庫裡,你苦心積慮設的 8 碼「強密碼」,在他眼裡跟沒鎖門幾乎一模一樣。 只要系統資料庫一外洩,後台算力幾分鐘內就能把你精心組合的 8 碼字串徹底硬拆出來。


要逼退這種算力碾壓,各大系統只能痛下殺手,把門檻硬生生拉到 10 碼甚至 12 碼以上。

但更驚人的真相是:問題其實出在系統後台用的加密演算法上。

如果後端選錯了演算法,就算你設了 15 位數的超長密碼,依然擋不住現代 GPU 的暴烈硬破。

這場「使用者痛苦」與「駭客算力」之間的戰爭,到底是怎麼演變成今天這個局面的?我們得先從那些曾經被全人類信賴、最後卻慘遭破防的舊演算法說起。


第二章:舊時代的破防,從 MD5 到 SHA-1 的退役歷史

在討論現代密碼怎麼被硬破之前,我們必須先搞懂:為什麼以前用的加密演算法,通通被廢棄了?

早期的網路世界,大家最信任的兩個雜湊演算法叫做 MD5 與 SHA-1。

當時所有的網站登入、檔案下載校驗,甚至是金融簽章,背後通通靠它們在扛。大家的思維很簡單:雜湊(Hash)是單向函數,算得出來、解不回去,放進資料庫萬無一失。

但這兩大天王最後不是死在「算力太快」,而是死在「數學結構被硬生生破解」。


MD5 的猝死:王小雲團隊的震撼彈

對雜湊演算法來說,最致命的打擊叫做「碰撞(Collision)」——也就是找到兩個完全不同的輸入,算出來的雜湊值竟然一模一樣。

2004 年的美密會(Crypto)上,密碼學家王小雲教授發表了對 MD5 的高效碰撞破解法。

這不是理論上的幾百萬年,而是只要幾分鐘,甚至用普通電腦就能手動構造出兩份內容不同、但 MD5 完全相同的檔案。這意味著駭客可以隨意偽造憑證與軟體更新,MD5 瞬間宣告死亡。


SHA-1 的落幕:Google 的 SHAttered 致命一擊

MD5 倒下後,全世界緊急撤退到 SHA-1。

雖然王小雲團隊在 2005 年就提出了 SHA-1 的理論漏洞,但很多企業貪圖方便,依然硬撐著用了十幾年。

直到 2017 年,Google 與 CWI Amsterdam 共同發表了歷史性的 SHAttered 攻擊,直接砸下重金算力,生成了兩份內容完全不同、但 SHA-1 雜湊值一模一樣的 PDF 檔案。

這一擊,徹底把 SHA-1 釘上了歷史的棺材板,各大瀏覽器與作業系統隨即全面封殺 SHA-1。


避難所:SHA-256 登場

舊時代的防線全面崩潰後,全世界只剩下一條路:全面升級到更長、更複雜的 SHA-256(SHA-2 家族)。

至今為止,SHA-256 在數學結構上依然毫無瑕疵,世界上沒有任何一個人能找出它的數學碰撞。


按理說,故事到這裡應該完美落幕了對吧?

但誰也沒想到,SHA-256 雖然防住了數學家的腦袋,卻被硬體工程師的「GPU 算力」撕開了一道致命破口……



第三章:彩虹表與「加鹽」技術的攻防戰

SHA-256 在數學結構上雖然無懈可擊,但在實際保護密碼時,卻遇到了一個極其尷尬的致命傷:它是確定性的(Deterministic)。

只要輸入的字串一模一樣,算出來的 SHA-256 哈希值就永遠固定。

例如密碼 123456,它的 SHA-256 永遠是那一串固定的十六進位字串。

這個特性,讓駭客根本不需要去研究怎麼「破解」演算法,他們直接玩起了一場簡單粗暴的遊戲——預先算好對應表(Lookup Table)。


駭客的捷徑:彩虹表攻擊(Rainbow Table)

駭客把全球最常用的幾百萬組密碼、甚至字典裡的每一個單字,預先用 SHA-256 全部算過一遍,把「明文密碼」與「哈希值」做成一張巨大的對照資料庫,這就是著名的彩虹表。

當駭客拖庫(Dump)拿到你的資料庫時,他根本不用費心去解密:

只要拿資料庫裡的哈希值去彩虹表裡搜尋,一秒鐘就能查出你的原始密碼是 admin888 還是 Password。

資料庫裡防禦力極高的 SHA-256,在彩虹表面前直接形同虛設。


防禦者的反擊:加鹽技術(Salting)

為了解決查表問題,工程界引入了一個極其聰明的機制——「加鹽(Salting)」。

做法很簡單:當使用者設定密碼時,系統隨機生成一串獨一無二的亂碼(Salt),把它附載在密碼後面,再拿去算 SHA-256。

雜湊結果 = SHA-256(密碼+鹽值)


加了這道「鹽」之後,產生了兩個關鍵改變:

同密碼不同雜湊: 就算全公司有 50 個人的密碼都設 123456,因為每個人的鹽值不同,算出來的哈希值完全不同。

彩虹表徹底廢棄: 駭客預先花費幾年時間建立的兆級彩虹表,因為沒有加上你這個帳號專屬的亂碼,搜尋直接失效。


「加鹽」成功擊退了彩虹表,逼得駭客只能放棄預先建表的捷徑,回歸最原始的道路:針對每一個帳號,用算力進行即時的暴力破解(Brute Force)。

防禦者以為贏下了這一仗,但沒想到,SHA-256 身上那個為了速度而生的高效設計,反而成為了暴力硬破面前最大的破綻……


第四章:算力浩劫!為什麼 8 碼加鹽密碼依然會被 GPU 暴力硬破?

加鹽技術雖然廢掉了預先算好的彩虹表,但它擋不住最原始、最殘暴的手段——拿算力硬推(Brute Force)。

這時候,SHA-256 身上一個原本是優點的特性,變成了最致命的破綻:它算得太快了。


SHA-256 本身是設計給檔案校驗、網路封包用的『通用雜湊演算法』,目標是追求極致速度;它從來就不是設計來保護密碼的。 拿追求速度的通用演算法來存密碼,天生就是個架構錯置。


顯卡算力升級:駭客的「數列計算機」

在現代暴力破解工具面前,駭客用的不是普通的 CPU,而是由多張高階顯卡(如 RTX 4090)組成的算力陣列。

GPU 具備數千個平行計算核心,天生就是為了做這種重複且龐大的雜湊運算而生。一張頂級 GPU,每秒鐘就能算出數百億次(GH/s)的 SHA-256 哈希值。

即便系統加了鹽,強迫駭客必須即時試錯,但在這種暴力的算力面前,試錯成本被降到了近乎為零。


8 碼密碼的算力浩劫

我們來看一道簡單的數學題。

假設你設了一個被視為「強密碼」的 8 碼組合,裡面包含大小寫字母、數字與特殊符號(可用的字元集約 95 種):

總組合數: 約 6,600 兆種組合。

聽起來是個天文數字對吧?但在現代 GPU 算力陣列面前,這 6,600 兆種組合可能在數分鐘至數小時內就被完全列舉完畢。

只要你的密碼停留在 8 碼,無論你加了多少個 @、# 或 $,在算力碾壓面前都只是多撐幾分鐘的差別。


12 碼的指數級防線

這就是為什麼各大廠商開始強迫你使用 10 碼甚至 12 碼以上 的密碼。因為組合數公式是:

總組合數 = C^L

密碼長度 L 是指數。

長度每增加 1 位,組合數直接乘以 95 倍。

8 碼複雜密碼: 數分鐘至數小時內硬破。

10 碼複雜密碼: 破解時間拉長到數天至數週。

12 碼複雜密碼: 組合數飆升至約 "5,400 億個兆" 種可能 (約 5.4 乘以 10 的 23 次方),破解時間直接飆到數百年!(即便面對大型算力叢集,攻擊成本也極其高昂)。


把長度拉到 12 碼,破解時間直接跨越人類壽命,在算力經濟學上讓駭客徹底放棄。

但是,問題真的只要「把密碼設長」就解決了嗎?

現實情況是,使用者終究是人,長密碼帶來了另一個致命問題:記不住、寫在貼紙上,或是把同一組強密碼拿去註冊各大網站。

這就引出了另一個讓所有人抓狂的系統規定:「既然 12 碼已經要算幾百年,為什麼系統還要每 90 天強迫我換密碼,而且還不准用舊的?」


第五章:既然拉長密碼就安全,為何還要強迫「定期更換且不能重複」?

「密碼長度至少要 10 位數」解決了算力硬破的問題,但隨之而來的,卻是使用者把同一組強密碼拿去登入各種大小網站。

這正是各大企業 MIS 與雲端平台最害怕的死穴——背後防範的根本不是「算力硬破」,而是「現實世界裡的各種意外洩漏」。


1. 撞庫攻擊(Credential Stuffing):你安全,但別家網站不安全

絕大多數使用者再怎麼被宣導,依然會把同一組強密碼拿去註冊不同的網站。

假設你在公司設了一組極度安全的 12 碼強密碼,但你同時把這組密碼拿去註冊了一個防禦力極差的小型購物網站。

一旦那個網站被拖庫(Dump)資料庫外洩,駭客根本不需要花幾百年去硬算 SHA-256,他直接拿著這組明文帳密,去嘗試登入你的 Google、微軟或公司 VPN。這就是資安上最常見的「撞庫攻擊」。

強迫定期更換密碼,能強行切斷過期外洩密碼的生命週期,確保就算你在別的地方洩漏了密碼,這組密碼在重要系統上的「有效期限」也是有限的。


2. 緩慢拖庫與側邊洩漏:駭客也在偷偷「分期付款」

在真實的資安攻防中,資料庫外洩往往不是當天發現的。平均來說,企業資料庫被駭客暗中竊取到被發現,往往隔了數月甚至半年以上。

如果駭客取得了一份「加鹽的 SHA-256 哈希資料庫」,雖然你的 10 碼或 12 碼密碼需要算一陣子,但駭客可以在自己的算力農場裡慢慢跑、分期付款地算。


當系統強制 90 天更換一次密碼時:

駭客花了 60 天終於算出了你的舊密碼,當他興高采烈準備登入時,發現你早在 30 天前就把密碼換掉了。

定期更換密碼的本質,就是在跟駭客的「算力進度條」賽跑,讓外洩的靜態資料庫快速失效。


3. 防範「不能重複」:堵死懶人的數字遊戲

如果不限制「不能重複」,99% 的使用者在被強迫換密碼時,只會做一件事:把尾數的 1 改成 2,三個月後再改回 1。

這種規則上的小聰明,在駭客的字典攻擊(Dictionary Attack)面前完全透明。駭客在暴力破解時,會優先對你上一期外洩的舊密碼進行變形推導(例如加減尾數數字、切換大小寫)。

如果系統不禁止使用前幾次的舊密碼,定期更換的機制就完全失去意義。


治標不治本的無奈

話說回來,連資安權威機構 NIST(美國國家標準技術研究所)近年都開始承認:過於頻繁地強迫更換密碼,反而會逼使用者設出更爛、更容易被預測的密碼。

但為什麼各大企業依然不敢廢除這個規定?

因為只要我們後台還在用 SHA-256 這類算力可被硬推的演算法、只要使用者依然會跨站重複使用密碼,強迫更換就是最後一道無奈的保險。

那麼,要徹底解開這個死結,後端架構到底該怎麼做,才能從根本上打壓 GPU 算力?



第六章:故意「變慢」的演算法與 Argon2 記憶體防線

逼使用者把密碼拉到 12 碼、強迫每 90 天更換一次,說到底都是在「懲罰使用者」來補償密碼機制的先天不足。

要從根本解決這個死結,密碼學家開始逆向思考:

既然 SHA-256 太快是導致暴力破解門檻過低的主因,那我們為什麼不設計一種「故意變慢」的演算法?

對於合法使用者來說,登入驗證時多花 0.1 秒(100 毫秒)完全無感;但對於需要進行幾百億次試錯的駭客來說,單次計算時間增加 1,000 倍,暴力破解的時間就會從「幾分鐘」直接暴增到「幾千年」。


這種專為密碼保護設計的演算法,稱為 密碼雜湊函數(Password Hashing Functions)。


第一代進化:PBKDF2(拉長時間的 Key Stretching)

PBKDF2 的思路非常直接:既然單次 SHA-256太快,那就把它放在迴圈裡重複執行幾十萬次!

當使用者輸入密碼時,系統會先加鹽,然後透過 HMAC-SHA256 進行如 600,000 次的重複疊代運算才輸出結果。

這直接將駭客的算力試錯成本翻了 60 萬倍,成功大幅提高了暴力硬破的難度。


第二代進化:bcrypt(可調式的成本參數)

PBKDF2 雖然變慢了,但其疊代次數是固定的。隨著摩爾定律推進、GPU 越來越快,原本安全的疊代次數幾年後又會變得不夠快。

bcrypt 引進了 Work Factor(工作因子/成本參數) 的概念。

開發者可以隨硬體算力提升,自由調整成本參數(例如設定為 12)。每增加 1,所需的計算時間就直接翻倍。只要市場上的 GPU 變快了,後端只需把參數加 1,就能瞬間抵銷硬體的算力升級。


終極解法:Argon2(記憶體硬性封鎖,廢掉 GPU/ASIC)

不管是 PBKDF2 還是 bcrypt,都面臨一個共通問題:它們主要消耗的是 CPU/GPU 的算力。

駭客可以用專門開模打造的 ASIC 晶片,或者利用顯卡上數千個平行核心,大規模同時開跑幾千組密碼測試。

為了徹底打破這個優勢,贏得 2015 年密碼哈希競賽(PHC)冠軍的 Argon2(現代最佳實踐)引進了革命性的防線:強制佔用大量記憶體(RAM)。

原理: Argon2 在計算哈希值的過程中,被設計成必須填滿並頻繁存取一段特定的 RAM(例如每個運算線程強制佔用 64 MB 記憶體)。


結果: GPU 與 ASIC 晶片雖然算力超強,但它們晶片內部的超高速記憶體空間非常微小。當 Argon2 強制要求大容量記憶體時,GPU 的平行運算優勢會瞬間崩潰,硬破成本飆升到駭客無法承受的程度。


總結:從密碼長度到後端架構的全面轉變

回頭看這整場「密碼與算力」的對抗史:

MD5 / SHA-1: 因數學結構缺陷,產生碰撞而被淘汰。

SHA-256 + 加鹽: 擊退了彩虹表,但因「計算太快」,讓 8 碼密碼在 GPU 算力面前形同虛設。

10~12 碼強密碼 + 定期更換: 依靠組合數爆炸與時間差,防範暴力硬破與意外外洩。

Argon2 / bcrypt: 從後端架構將演算法「故意變慢、吃爆記憶體」,徹底瓦解硬體算力硬破的根基。


作為系統架構師或開發者,最根本的資安邏輯不該只是把壓力丟給使用者去設超長密碼,而是在後端全面採用 Argon2id 或 bcrypt 這類專用密碼雜湊演算法。


這才是真正將駭客阻絕於門外、同時解放使用者的終極之道。


觀看完整影音解說:https://youtu.be/N79n2mYBJd0



沒有留言:

張貼留言