近期喜獲一批新鮮算力,我開始想些有的沒的,其中有個想做很久的實驗 - 用 GPU 暴力破解密碼,終於有機會實際來玩一下。
相關議題之前討論過很多次,老讀者們應該都不陌生:
密碼要怎麼儲存才安全?該加多少鹽?-科普角度 試玩 SHA256 密碼雜湊暴力破解 計算不同密碼長度與複雜度所需暴力破解時間 閒聊 - 15 位高強度密碼錯了嗎?2025 年密碼該怎麼管? 嚴格來說雜湊暴力破解本質是個數學問題,按計算機便知道結果,並不需要真的用實驗驗證,但腦海一直有個聲音跟我說:「這個實驗你必須做,人生才不會有遺憾!」,好哦,既然有緣摸到 5080,就來試試唄。
純好玩,沒必要浪費電跟消耗硬體,我決定挑個能在幾分鐘內算完的新手級題目,簡單體驗就好。
假設我有個六位複雜密碼,"P@s$3D",依 NIST 最新版的密碼安全指南,密碼最少要有八碼,換言之,若不足八碼就算混合大小寫加了符號,還是有可能不安全(當然,安全與否也跟儲存密碼用的雜湊演算法有關)。
我們將六位密碼"P@s$3D"分別用豆腐做的 MD5、已被嫌不安全的 SHA1,以及當今安全標準 SHA256 (註:但用在密碼雜湊不算安全)分別計算雜湊值:
# echo -n 'P@s$3D' | md5sum
7157682e4b27953b800ff9e69396c148 -
# echo -n 'P@s$3D' | sha1sum
698dfea42e0a2f195edeacbb35d081d04c40da8e -
# echo -n 'P@s$3D' | sha256sum
498068909a074984f8c07a476187474afdaa51fc931f17878714787cdb77b15d -
講到雜湊暴力破解工具,某推 Hashcat,它支援 GPU 運算,破解效率足以輾壓一般程式。Hashcat 的常用參數如下:
-m:指定 Hash 類型,如 MD5 -m 0、SHA1 -m 100,SHA2-256 -m 1400... (Hashcat 支援雜湊種類多達數百種 清單) -a:指定破解模式,如字典 -a 0、組合 -a 1、Mask 暴力破解 -a 3 --show:僅顯示已破解的密碼 -b:基準測試 (Benchmark),測試硬體效能 -O:限制密碼長度 (加速運算) -1 -2 -3:自訂字元集 -r:載入規則檔 所謂 Mask 暴力破解是定義每一位可用的字元,例如:?u?l?l?l?d?d?d?d 代表第一位大寫加三位小寫後接四位數字。Mask 符號定義如下:
?u: 大寫字母 ?l: 小寫字母 ?d: 數字 ?s: 符號 ?h: 0-9, a-f ?H: 0-9, A-F ?a: 大寫字母、小寫字母、數字、與符號 ?b: 0x00-0xff 因此若要用 Hashcat 破解上述含大小寫與符號六位密碼的 MD5/SHA1/SHA256 雜湊,指令可寫成 hashcat -O -m <0 或 100 或 1400> -a 3
實測之前先算一下數學,Hashcat 的 ?a 包含 0-9、a-z、A-Z 以及 32 種 ASCII 符號,10 + 26 + 26 + 33 = 95 個字元,956 = 735,091,890,625,共七億 3509 萬種可能組合。不同演算法依複雜度計算速度不一,每秒能計算的次數愈多,破解速度愈快。
先從 MD5 開始,豆腐一拍就碎,五秒便被攻破!
SHA1 也只頂住 16 秒,很快也不支倒地。
六碼實在太短,就算用 SHA256 也扛不住太久,在 35 秒後失守。
由所需時間來看,SHA1 的破解時間是 MD5 的三倍,SHA256 是 MD5 的七倍。
Hashcat 有個 Benchmark 功能,可以測試不同雜湊演算法的每秒執行次數。
依評測結果,MD5 為 96676.9 MH/s、SHA1 為 29982.4 MH/s、SHA2-256 為 12119.7 MH/s,MD5 是 SHA1 的三倍、是 SHA256 的 8 倍,這與破解所需時間長度相反,比例大致相符。
所以,若密碼只有六位,就算混用大小寫數字加符號,單純用 MD5/SHA1/SHA256 雜湊,5080 只需不到 30 秒通通能輕鬆破解。
面對這種情況,我們直覺想到的做法是增加密碼位數,當混用大小寫數字加符號,增加到 7 碼,平均破解時間會是 6 碼的 95 倍,到 8 碼則是 9025 倍,但 8 碼即使用了 SHA256,頂多也只能再撐個幾天,依然危在旦夕,這就是為什麼 15 碼只用大小寫的長密碼也比加了一堆符號的短密碼更安全的原因。(延伸閱讀:15 位高強度密碼錯了嗎?)
增加密碼長度會增加使用者的負擔與操作不便,但其實有另一個更有效率的切入點 - 改用密碼專用的雜湊演算法,例如:PBKDF2、Script、Bcrypt、Argon2... 等。
依據 Hashcat 的效能評測數字:
Argon2: 795 H/s scrypt: 4645 H/s PBKDF2-SHA256: 246.6 kH/s PBKDF2 比 SHA256 慢約 5 萬倍,Scrypt 比 SHA256 慢 260 萬倍,Argon2 比 SHA256 慢 1500 萬倍,改用這些雜湊演算法,破解所需時間馬上增加數萬到數千萬倍。
但身為開發者,面對密碼雜湊議題,我的信念還是「閃開,讓專業的來」是王道,帳號密碼優先考慮用微軟、Google 等大廠的服務或認證機制,非不得已別自己寫,哈。