近期喜獲一批新鮮算力,我開始想些有的沒的,其中有個想做很久的實驗 - 用 GPU 暴力破解密碼,終於有機會實際來玩一下。

相關議題之前討論過很多次,老讀者們應該都不陌生:

嚴格來說雜湊暴力破解本質是個數學問題,按計算機便知道結果,並不需要真的用實驗驗證,但腦海一直有個聲音跟我說:「這個實驗你必須做,人生才不會有遺憾!」,好哦,既然有緣摸到 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 <path_of_hash_file> ?a?a?a?a?a?a

實測之前先算一下數學,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 等大廠的服務或認證機制,非不得已別自己寫,哈。


Comments

# by Richie

好像限制試錯次數就好了。

# by 阿賢

不能排除某新手忘了加錯誤嘗試次數限制🤭

# by diberium

限制了試錯次數,但 user table 被 dump

# by Matt

這適合拿來破解可以無限次數的加密檔案,例如有密碼的壓縮檔或是PDF檔。

# by m

現在的程式不都是有錯誤幾次就鎖定帳號。 GPU 遇到這情況會有用嗎?

# by 村哥

樓上,這邊的測試等於是以 hash 已經洩漏為前提,這跟你允許密碼試錯幾次沒有關係。

# by zeno

難怪RTX5090賣那麼貴 (誤

# by test

印象有試3次鎖住 15分鐘後解鎖

# by Kayson

跟錯幾次無關,是密碼的hash被拿來破解,回頭再用正確的密碼登入,這樣就不會錯了

# by m

那適合用來解開 zip , rar 之類的壓縮檔密碼嗎?

# by Lik

問題是,如何可以取得密碼的hash值?這已經入侵到資料庫裡面了吧?

# by Jeffrey

to Lik, 資料庫、檔案、備份檔、記憶體都可能洩漏 Hash,至於如何取得是惡意駭客或紅隊的事,不在本篇的討論範圍。

Post a comment