繁體中文(台灣)
  • password-cracking
  • rainbow-table-attack
  • hashing

你的密碼是怎麼被破解的?如何提升密碼安全性?

在本文中,我們介紹了幾種經典的密碼破解方法,以及這些方法背後的原理。針對這些概念,我們提供了從密碼管理者和帳號持有者角度出發的增強密碼安全性的做法。

Darcy Ye
Darcy Ye
Developer

我們經常看到一些知名應用程式的用戶密碼洩露的新聞。你可能會覺得,既然你不用那個特定的應用程式,這些事件與你無關,但現實情況並非如此。

最近,Twitter 上也有消息指出 AI 方法可以大大加速破解密碼的速度。因此,我們想了解其背後的複雜性,看看我們如何提高密碼的安全性。

PassGAN Twitter

密碼如何被破解?

一般來說,帳號密碼通常會使用各種雜湊算法處理,然後儲存在資料庫中。你可以參考我們之前的博客以更好地了解密碼哈希。不幸的是,一些服務提供商缺乏常識,將密碼以明文形式儲存在資料庫中。如果數據洩露,這種做法可能會造成更大的損害。

通過儲存哈希密碼,即使是資料庫管理員也無法訪問你的原始密碼,從而大大提高了安全性。當驗證輸入密碼的正確性時,會使用相同的哈希算法來處理輸入的密碼。然後將生成的哈希與資料庫中儲存的值進行比較。如果兩個哈希值匹配,則認為輸入的密碼正確。

簡單來說,密碼破解涉及生成符合允許密碼規則的字符串。然後使用前述方法不斷檢查這些字符串,最終發現正確的明文密碼。

常見的密碼破解方法

在本節中,我們將簡要介紹三種常見的破解密碼方法。

暴力攻擊

暴力攻擊通常列舉所有允許的密碼規則的可能性,並嘗試逐一嘗試。

例如,手機可以設置一個4位數的數字密碼。暴力攻擊將從000000010002、...,一直到9999逐一嘗試所有可能性。

暴力攻擊非常耗時,因為嘗試次數太多。假設密碼長度為 $L$,每個密碼位可能的字符數是 $n$,那麼暴力攻擊需要嘗試的可能性數量就是 $n^L$,這是一個很大的數字。

許多密碼要求組合數字、大寫和小寫字母以及特殊字符,目的是增加 $n$,從而大大增加可能性,提高破解密碼的難度。

字典攻擊

字典攻擊使用字典中的單詞,通常結合空格、數字、特殊符號和其他元素,形成各種密碼組合。然後使用這些組合嘗試密碼匹配。

許多人選擇使用有明確意義的句子作為密碼,以便於記憶。字典攻擊被證明是破解具有這些特性的密碼的有效方法。

彩虹表攻擊

彩虹表是一個預先計算的明文密碼到其相應哈希值的映射。通過直接將資料庫中儲存的哈希值與彩虹表中的哈希值進行比較,任何找到的匹配可以用來查找並直接檢索相應的明文密碼。

如果哈希值已被預先計算(並記錄在彩虹表中),彩虹表提供立即訪問明文密碼的優勢。然而,重要的是要注意,如果哈希值沒有被預先計算(因此不在表中),則無法使用彩虹表。

除了上面描述的方法外,還有許多其他技術未在此涵蓋。通常,這些方法的組合被用來涵蓋所有可能的密碼並加速破解過程。

如何加速密碼破解?

在上一節中,我們簡要介紹了幾種經典的密碼破解方法。從中我們可以總結一些提高密碼破解速度或成功率的思路。

要破解一個密碼,通常涉及兩個步驟:

  1. 確定密碼的搜索空間(生成可能的密碼)
  2. 使用哈希算法生成前一步中獲得的可能密碼的哈希,並將它們與要破解的密碼的哈希進行比較

上述提到的字典攻擊和彩虹表攻擊分別對這兩個步驟進行優化:

  • 字典攻擊縮小了密碼的搜索空間。建立在假設「用戶傾向於使用具有實際意義的詞語組合作為密碼」的基礎上,像 zzzz 這樣的詞語不包含在字典中,這意味著它們不會被嘗試作為潛在密碼。這種做法類似於預先排除不正確的答案。類似於解答選擇題,儘管你無法確定正確選項,但你可以辨別哪個選項顯然是錯誤的。通過排除這些明顯不正確的選項,你在剩下選擇間猜對的機會得以提高。
  • 彩虹表攻擊加速了哈希算法的執行時間。對於精通數據結構的人來說,查找是一個 $O(1)$-複雜度的操作,沒有任何操作可以在時間複雜度上比 $O(1)$ 更簡單。相對而言,常用的哈希算法如 MD5 和 SHA 的時間複雜度是 $O(n)$,這比 $O(1)$ 慢得多。

在實際中,優化密碼破解過程也從上述兩個角度著手。值得一提的是,由於字串哈希算法的 $O(n)$ 時間複雜度的優化空間相對較小,因此更多的考量是在改善硬件或計算方法上,這裡不再贅述。

那麼,AI 如何幫助破解密碼呢?

在整個密碼破解的過程中,AI 的角色是從暴露的明文密碼中學習某些模式和構造方法。隨後,AI 可以模擬這些密碼構造模式來生成一批潛在的密碼。接下來,AI 可以使用雜湊算法或甚至專用硬件來執行密碼破解。

事實上,相比其他密碼破解工具,PassGAN 的殺手優勢在於它能夠「以最快速度猜出最有可能的密碼」,這就是我們上面提到的「縮小可能的密碼搜索空間」的想法。

Password Guessing Prob

如何讓密碼更安全?

我們將從兩個角度說明如何保護密碼。這裡我們僅從密碼本身開始,不討論其他方法來確保帳戶安全,例如多因素驗證(MFA)等。

從身份服務提供商的角度

作為身份服務的提供者,他們負有保護所有用戶密碼安全的責任。這裡有幾種可以實行的方案來增強用戶密碼的安全性:

  1. 避免以明文形式存儲密碼: 雖然這似乎是常識,但一些服務提供商仍將密碼以明文形式儲存於其資料庫中。使用哈希值來存儲密碼增加了安全性;即便資料庫被入侵,駭客仍需要相當大的努力來破解這些哈希密碼。

  2. 對用於密碼驗證的 API 介面施加速率限制: 讓我們重溫一下前面所述的密碼破解過程。過程中一個關鍵步驟是「驗證」密碼是否正確。由於密碼是交給身份服務提供商託管的,他們是唯一能夠提供密碼驗證API的實體。通過限制訪問這個 API 的頻率,我們可以阻止駭客快速嘗試各種密碼,即使他們擁有高可能性的密碼猜測。

  3. 強制使用更複雜的密碼組合: 例如如先前所述,給定長度內的更大字符種類貢獻於更高的複雜性。此外,採用前述類似的AI技術使在提交之前對密碼安全性進行評估,若密碼被認為較弱,用戶可以被提示選擇更強的選擇。

從用戶的角度

作為帳戶和相關數字資產的所有者,用戶需要對確保其帳戶密碼的安全性負最大責任。

  1. 避免在不同網站上使用相同密碼: 許多駭客在獲取某些網站的密碼後,將嘗試使用那些帳戶憑證訪問其他網站。如果不同服務的多個帳戶共享相同的密碼,可能會有失去帳戶和信息洩露的風險。

  2. 儘可能選擇純隨機密碼: 此方法有助於防止使用大多數人採用的常見密碼模式(如前所述,使用英文句子),從而使駭客難以「縮小密碼搜索空間」,增加密碼的複雜程度。

作為身份服務的基礎設施提供者,Logto 已經實施了上述許多最佳實踐以保障用戶帳戶安全性。這使得用戶可以安心地使用各種應用程式,不必擔心帳戶丟失,同時也讓在線服務提供商可以以最小的努力來確保用戶數據安全,從而專注於他們的核心業務活動。