密碼是如何被破解的?
帳號被攻破的方式很少像電影裡演的那樣。實際上,密碼透過三種途徑之一被獲取。被破解:透過逐個嘗試候選密碼得出,通常針對從某個服務竊取的密碼雜湊資料庫。被竊取:在假冒頁面上被輸入,或被惡意軟體複製。或者被重複使用:攻擊者從以前的洩漏中拿到密碼,到其他服務上嘗試,指望主人在那裡也用過它。這種區別很重要,因為每種途徑要靠不同的手段應對。本文逐一介紹主要方法,並說明針對每一種什麼有效。
資料洩漏中的重複使用密碼
每年都有服務遭到入侵,其使用者資料庫被出售或公開傳播。攻擊者從一次洩漏中取出電子郵件和密碼的組合,自動拿到銀行、信箱服務商、網路商店和社群網路上嘗試——這種攻擊稱為撞庫(credential stuffing)。它完全不涉及猜測,而且奏效的原因很簡單:人們會重複使用密碼。如果到處都是同一個密碼,即使是強密碼在這裡也幫不上忙。
有效對策:每個帳號使用不同的密碼,這樣一個服務的洩漏不會打開其他任何東西。
網路釣魚
釣魚頁面是真實登入頁面的副本,位於一個略有不同的網址上,人們透過電子郵件或口吻緊急的訊息裡的連結到達那裡:帳號被凍結、包裹、帳單。您在那裡輸入的任何內容都會直接到達攻擊者手中。密碼的長度和隨機性在這裡毫無作用,因為是您自己輸入的。
有效對策:透過自己的書籤打開網站,而不是點連結。使用密碼管理器:它只會在儲存密碼時的網址上提供填寫,因此如果它沒有提供已儲存的密碼,手動輸入之前先檢查網址。並開啟雙重認證,這樣僅憑被盜的密碼不足以登入。不過,一次性驗證碼也可能像密碼一樣被釣走。通行密鑰和 FIDO2 安全金鑰則不會以這種方式被釣走,因為它們只回應真實的網站——NIST 把這種區別稱為抗釣魚性。
惡意軟體
被稱為資訊竊取程式(infostealer)的程式會複製瀏覽器中儲存的密碼以及工作階段 Cookie,並在執行後幾秒鐘內傳送出去,而鍵盤記錄器(keylogger)會記錄輸入的內容。被盜的工作階段 Cookie 可以讓攻擊者進入一個已經登入的帳號,既不需要密碼,也不需要第二因素。這類程式通常隨盜版軟體、虛假更新和電子郵件附件而來。
有效對策:只從官方來源安裝軟體,保持系統和瀏覽器更新,把意料之外的附件視為危險——但這些都不是保證。如果設備已被感染,請在另一台確認乾淨的設備上操作:更改密碼,使用各服務的「登出所有工作階段」選項,並檢查備援信箱、手機號碼和雙重認證設定是否仍屬於您。在重新登入受感染的設備之前,先把它清理乾淨。
在登入表單上猜測
直接在網站上嘗試密碼很慢:設計良好的服務在幾次錯誤嘗試後會延遲、鎖定或要求驗證碼。這讓反覆攻擊單個帳號效率低下,因此常見的做法恰恰相反:拿少數幾個最常見的密碼——123456、password、qwerty123——去嘗試數百萬個帳號,這稱為密碼噴灑(password spraying)。定向猜測用個人資訊以同樣的方式進行:孩子和寵物的名字、生日、喜歡的球隊,這些在社群媒體上都很容易找到。
有效對策:任何既不常見、也不是由您的個人資訊構成的密碼——參見如何建立強密碼。
離線破解被盜的雜湊
設計合格的服務不會以可讀的形式儲存密碼。它儲存的是雜湊——單向函數的輸出,無法據此反算出密碼。這樣的資料庫洩漏後,攻擊者會測試可能的密碼:在自己的硬體上計算候選密碼的雜湊並比對結果。沒有登入表單拖慢他們,速度取決於服務選用的雜湊函數及其設定。對於 MD5 這樣快速而過時的函數,一張現代顯示卡每秒可以測試數百億個候選。專為儲存密碼設計的函數——Argon2id,或舊系統中的 bcrypt——刻意放慢速度,把這一速率降低許多個數量級,這正是當前的建議點名推薦它們的原因。
字典攻擊
候選密碼並不是隨機的。破解工具先從以往洩漏中的真實密碼清單以及單字和名字字典開始,再套用模仿人類習慣的規則:首字母大寫、末尾加年份或驚嘆號、用相似的符號替換字母。像 Summer2024! 這樣的密碼看起來複雜,卻是最先被嘗試的候選之一。加鹽(salting)——在計算雜湊前給每個密碼加上一個唯一的隨機值——能阻止攻擊者使用被稱為彩虹表(rainbow table)的預計算表,也能防止一次性破解所有相同的密碼,但它並不能讓可預測的密碼變得不那麼可預測。
暴力破解
字典用完之後,剩下的就是嘗試每一種組合,而對於隨機產生的密碼,決定結果的是長度。舉個例子:假設使用快速雜湊,密碼的每個字元都從 94 個可列印 ASCII 字元(不含空格)中獨立、等機率地選取。這樣的 8 位密碼約有 6 × 1015 個;以每秒一百億次猜測計算,全部試完約需一週,平均在一半時間內就能找到正確的密碼。對於 12 位,在同樣的硬體上全部試完約需 1.5 百萬年,而 16 位所需的時間已無法作任何有意義的比較。這就是支持長隨機密碼的全部理由:字典對它們幾乎沒有用處,在上述假設下,嘗試所有組合也不實際。我們的強密碼產生器在您的瀏覽器中產生這樣的密碼,並以位元顯示每個密碼的熵估計。
有效對策:一個足夠長、不帶任何人為規律的密碼,在實踐中也就是產生的密碼。您無法控制服務如何儲存您的密碼,所以要做最壞的打算,選擇即使以快速雜湊函數儲存也能抵禦猜測的密碼。
偷看與索要
最古老的方法不需要任何技術。密碼被人從背後偷看到,從螢幕上的便利貼上讀到,或在視訊通話共用螢幕時被看到;或者攻擊者乾脆冒充技術支援人員或同事直接索要——這就是所謂的社交工程。任何正規服務都不會透過電話、電子郵件或即時通訊軟體向您索要密碼。
有效對策:永遠不要把密碼說給或傳給任何人,也不要把它放在別人能看到的地方。
總結
不同的攻擊要靠不同的習慣應對,其中三個習慣能完成大部分工作:每個帳號使用唯一的密碼,由產生器產生而不是自己編,再加上雙重認證——或者在服務支援時用通行密鑰代替密碼。它們並不能涵蓋一切——例如被盜的工作階段——所以上文關於惡意軟體的建議同樣重要。更多文章收錄在密碼資料中。