繁體中文(香港)
  • 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 已實施了上述許多優秀做法以保護用戶賬戶的安全。這使得用戶能夠安心使用各種應用程式,而不用擔心賬戶丟失,同時也讓線上服務提供者能夠用最小的努力來確保用戶數據安全,從而專注於他們的核心業務活動。