如何選擇一組高安全性的密碼?

04.20.2020  - 作者  在 安全性

根據 2017 年《華爾街日報》的一篇文章,前美國國家標準技術研究院(NIST)工程師 Bill Burr 對於其在 2003 年為該研究所撰寫的報告感到後悔。

然而,他有一個很好的理由。

您可能不知道這篇 NIST 是個什麼樣的報告,但這篇報告中的提出的建議可能對您來說是很熟悉的,如果確實是如此,您可能知道 Burr 為什麼對該篇報告廣為流傳而感到後悔。

2003 年的建議與如何擁有強大的密碼策略有關。他們提出了這樣的需求,密碼中應該要包含大寫和小寫字母,最低長度限制的數字和特殊字符,以及每 90 天需要變更一次密碼。

這些策略的結果使得密碼變得了無新意:用戶會在便條紙上寫下他的密碼,並黏貼在其螢幕上。他們通常會在他們舊密碼後方加上 1、2、3,4 等數字來 “變更” 成新密碼,或是寫出像是 I33t 的字詞,因為它的發音唸起來就像 ‘p@$$w0rd’。

Burr 告訴華爾街日報,他沒有被授予用戶數據的訪問權限,只能根據從 1980 年代 NIST 文檔中所傳承的最佳做法提出建議。這不僅是因為該建議與來自 2003 年 .com 的泡沫後的情況不太相同。主要問題是,他沒有辦法針對用戶的真實體驗來改變這種已廣為人知的智慧。

Burr 在 2017 年向《華爾街日報》認罪後不久,NIST 修改了這些建議,但是 “好的” 密碼建議的問題在於,它通常只專注於防禦單一威脅,即攻擊者可以訪問密碼文件,而且通常會忽略所有安全性中最弱的連結:用戶。

導致的結果是,有關密碼的建議混亂不清,這些建議常規性地被消化和檢視,其一般結果與 NIST 2003 年的建議相同 — 一種錯誤的安全感,它僅透過考慮密碼複雜性來平衡帳戶安全性。

不要誤會我們的意思。擁有複雜的密碼一樣是件重要的事。但是,全面性地考慮密碼組成的問題更是重要。在本文中,我們將研究常見的密碼建議,為什麼人們推薦它,以及它們有什麼樣的問題。

在此過程中,我們將嘗試提供那些 Burr 後悔無法在 2003 年為您提供的有關如何設計密碼的有用信息。

1. 使用特別的字符

為什麼這樣建議呢?

大多數關於密碼安全的方法是倚賴 ”熵” 的概念。這個看起來深奧的字其實原理相當簡單 – 熵是一種衡量密碼的不可預測性的方法。更具不可預測性又意味著,掌握密碼文件的人需要更長的時間去破解您的密碼。 熵的原理取決於您使用的字符和密碼的長度。

可以透過找出每個字符的熵來找到密碼的熵。如果您對數學感興趣,則字符的熵是所使用字符集中的字符數的對數 2,乘以密碼中的字符數。

如果這聽起來對您來說太複雜了,請不要擔心!重要的是其背後的理論,以及由這個原理衍生出來的建議。

八位密碼組合

字符集
字符數
組合數  
字典單詞 600,000 種組合
0-9 10 個字符 100,000,000 種組合
a-z 26 個字符 208,827,064,576 種組合
A-Z, a-z 52 個字符 53,459,728,531,456 種組合
A-Z, a-z, 0-9 62 個字符 218,340,105,584,896 種組合
所有允許可印刷之字符 72 個字符 1,853,020,188,851,840 種組合

上方圖表簡單地向您介紹了熵的概念。使用更大的字符集能夠產生出更多種可能的組合,也就是說,理論上來講,攻擊者必須嘗試更多組合才能破解您的密碼。

有什麼樣的問題呢?

對於 8 個字符組合的密碼,熵的計算會假設該密碼是隨機的,因此會在數字中包含任何特殊字符,或是大小寫字母,讓攻擊者像在大海撈針般,難以找出所有包含在內的字符。

然而,事實上人類的行為並不是隨機的。

‘P@$Sw0rD’ 以及 ‘Q)%Fk6xF’ 這兩組密碼都是所有允許可印刷之字符的 1,853,020,188,851,840 種可能的組合之一。但是 ‘P@$Sw0rD’ 比 ‘Q)%Fk6xF’ 更有可能成為某人的真實密碼。為什麼呢?因為 ‘Q)%Fk6xF’ 並不好記憶。從理論上來看,您可以建立一個助記符設備,或是寫一首歌,如果您真的需要這樣才可以記住該密碼,但事實上您很可能沒有時間這樣做。

這也是為什麼,當您專注在密碼的複雜性上時,’P@$Sw0rD’ 更有可能成為您設定的密碼。更糟糕的是,’P@$Sw0rD’ 是歷史上最流行的密碼之一,為 ‘password’ 的變體,因此攻擊者在破解密碼時更有可能先嘗試這組密碼。

‘Q)%Fk6xF’ 是一組安全的密碼,但是很難記憶。如果這組密碼是要使用在工作上,可能對您來說並不是那麼重要,但對您的老闆來說卻是相當重要,然後您可能為了要記下這組密碼就把它寫在便條紙上,並把這張便條紙留在您辦公桌上。這樣的行為實際上也缺乏安全性。

換句話說,使用具有 ”複雜性” 的密碼不見得對您有力,因為

  1. 密碼本身只是一個容易被破解的密碼的變體,而且
  2. 你記不起這組密碼!

結語

如果可以,請務必在密碼中使用特殊字符、數字,或大小寫字母。但是,請勿使用像是 l33t 這類型的密碼,把 O 替換為 0,將 A 替換為 @ 或 4 等等。這只會給您帶來具有安全性的錯覺,但實際上卻沒有任何安全性可言。

此外,請不要設定您無法記憶的密碼!如果您需要把密碼寫在便條紙上,或是每次都需要重新設定您的密碼,那麼一組複雜的密碼並無法提供您任何幫助。

那密碼金鑰呢?

密碼金鑰是一個應用程式,它可讓您為多個帳戶生成和儲存複雜以及完全隨機的密碼。我們建議您可以使用一個!現在某些瀏覽器上已內置此項功能。

這是可以擁有許多高熵密碼的最佳方法,您可以輕鬆取得這些密碼,而且不需要在每次登入時重置您的密碼。

但儲存密碼時請務必注意。密碼金鑰 – 例如電子郵件地址 – 會有單點故障的問題。密碼金鑰公司投入大量資源以確保密碼被安全地儲存,但是仍可能會有漏洞!也許將所有雞蛋都放在同一個籃子裡對您來說最合適,但在這種情況下,請記住 – 您所有的雞蛋都在同一個籃子裡。

2. 設置一組長的密碼

為什麼這樣建議呢?

另一種增加密碼強度的方法是加長密碼的長度,因此增加密碼長度是您會聽到的另一種常見的建議。

10 個字符密碼的可能組合

字符集 字符數 組合數  
0-9 10 個字符 10,000,000,000 種組合
a-z 26 個字符 141,167,095,653,376 種組合
A-Z, a-z 52 個字符 ~144,555,105,949,057,000 種組合
A-Z, a-z, 0-9 62 個字符 ~839,299,365,868,340,200 種組合
所有允許可印刷之字符 72 個字符 ~3,743,906,242,624,487,000 種組合

您可以看到,只要在 8 個字符的密碼中再添加兩個字符,就能夠產生更多種的組合。一組由 72 個可使用字符組成的 20 個字符的密碼即為 14,016,833,953,562,610,000,000,000,000,000,000,000 種組合中的其中一個組合。

當然,與前面所述的相同評論仍然適用於這樣 – 如果您在實際上無法記住這組密碼的話,它就相對沒那麼有用了。

儘管如此,在基本上,您的密碼越長越複雜,它的熵就越高,攻擊者要破解密碼所花費的時間也就越長。

有什麼樣的問題呢?

然而,所有的這些都是假設:

  1. 攻擊者有權限取得密碼文件
  2. 帳戶供應商已適當地對密碼文件進行單向雜湊處理
  3. 帳戶供應商已妥善地加密密碼文件

讓我們來分解一下:

首先,攻擊者必須取得密碼文件的訪問權限。為此,他們必須透過某種攻擊來破壞儲存密碼文件的系統。

接著,如果帳戶的供應商沒有適當地對密碼文件進行單向雜湊處理,就意味著該密碼文件只是以純文本或明文形式儲存。

舉個例子來看,在去年,Facebook 被舉報其密碼以明文形式儲存(而非單向雜湊處理)。如果攻擊者取得密碼文件的訪問權限,無論您的密碼設置的多長或多複雜,您只有一個選擇:盡快變更您的密碼。

單向雜湊指的是使用特定算法對密碼進行加擾的特定過程,因此,如果密碼文件遭到破壞,密碼本身也不會被洩漏。

但是單向雜湊處理還是對這些額外添加的字符所增加的安全性有一定的影響。

其中一種熱門的雜湊函數稱為 bcrypt。 它特別能抵抗暴力攻擊,因此可以延長攻擊者破解密碼所需的時間。 但是,這也對密碼的強度設置了上限。

具體來說,該限制為 50-72 個字節,當超過此限制時,您的密碼將會被截斷,也就是說,密碼長度為 72 個字符的密碼將被 bcrypt 雜湊處理,與密碼長度為 73,84 或 104 個字符的密碼也一樣。

最後,雜湊處理的密碼需要被加密。

預先計算的雜湊函數表的存在 – 稱為 ”彩虹表” – 意味著雜湊函數的單一存在是不夠的。

這就是為什麼需要加密的原因。透過加密處理,網站將其它隨機字符串添加至雜湊密碼中,以破解破壞雜湊函數的工作。

基於這樣的方式,如果密碼文件遭到破壞,密碼將會更難被破解。但也就表示,如果密碼遭到破壞,它仍然是不安全的。因此,請不要繼續使用儲存在洩露的密碼文件中的密碼!

結語

您可以使用有史以來,最長最複雜的密碼,但是使用該密碼的網站是否沒有對密碼進行雜湊或加密處理都沒有關係。即使如此,根據您的供應商所使用的雜湊函數,實際可以使用的時間長度也可能存在著限制。

再一次,請不要使用已經洩漏的密碼!

您可以透過 “我被騙了嗎” [https://haveibeenpwned.com/] 這類型的網站,確認您的密碼是否已經被洩漏。

然而,在沒有發生任何違規的情形下,更改您的密碼僅代表設定了一組您不記得的密碼,並且若在每次登入時都必須重置您的密碼,那樣的話並不比您可以記住的密碼更安全。

這將我們帶到下一章節:

3. 選擇一組有記憶性的密碼

為什麼這樣建議呢?

在這裡,開始要考慮到擁有受密碼保護的帳戶的用戶體驗。對於密碼複雜度的關注而衍生出一些建議,這些建議忽略了用戶最重要的一個面向:用戶是否能夠記住自己的密碼。

研究顯示,平均用戶每週會花費 12 分鐘,或每年 11 個小時來輸入或重置密碼。在工作環境中,將該花費時間乘以所有員工,實際上的成本就會相對增加。

創建一個具有很大熵的密碼是有可能的,然而,若要不使其變得如此奇怪,您則需要一個助記符設備來協助您記住它。

嘗試混搭三種不相關的單詞,且每個單詞的長度都要超過五個字母,像是 ‘FaithfulHighwayPrinter’。您只需要記得這三個詞,這三個詞越怪越好,如此一來,密碼破解者非得嘗試數百萬次才有可能猜中您的密碼。’p@$$w0rd1!’ 這種密碼相對來說較不好記,但對密碼破解者來說卻是非常容易猜中。

您可以使用一種稱為 Diceware 的軟體去生成一組真正的隨機單詞集。

您可以在 Diceware 上擲五次骰子 (或一次擲出五個骰子),即可生成一個單詞。您可以從 Diceware 列表中找到該單詞,該列表提供了易於記憶的隨機單詞列表。

您甚至可以使用 D-20 和幻想詞列表!)

如果這對您來說不夠安全,您可以考慮另一個選項,研究人員開發一種技術,該技術被稱作 ‘mindhashes’,它幫助您開發自己的人工算法以創建無法往後推敲的密碼。

例如,讓我們從上方輸入我們的 3 字密碼 – “FaithfulHighwayPrinter”。 現在,選擇一個 “萬用字元” 的字母 – 我們說 z。最後是大寫字母,數字,符號組合。那就是您的 “特殊字符串”。我們將使用 $O2。

要使用此密碼去生成一組密碼,請用要使用該密碼的那個網站的名稱。
然後,您可以在您的 3 字密碼中找到該網站名稱中的每個字母,並選擇有相同諧音的單字。如果您選擇的字母沒有在您的三個單詞,請輸入萬用字元。 然後再加上您的特殊字符串。

使用上面所述的方式,對於 Gandi 帳戶,我們可以生成出這樣的密碼:

g > FaithfulHighwayPrinter > FaithfulHighwayPrinter > h
a > FaithfulHighwayPrinter > FaithfulHighwayPrinter > t
n > FaithfulHighwayPrinter > FaithfulHighwayPrinter > t
d > FaithfulHighwayPrinter > (letter not present, wildcard) -> z
i > FaithfulHighwayPrinter > FaithfulHighwayPrinter > t

加上我們的雜湊函數,我們會得到:httzt$O2

雖然這並不容易記住,但您不需要特別記住它,只需要計算它。研究表示,在學習曲線之後,用戶發現使用這種 “mindhash” 的方式變得越來越容易

有什麼樣的問題呢?

同樣地,這歸結於實際用戶的行為。研究人員發現,在野外,人們傾向於選擇密碼短語 (另一個生成密碼的方式),這些通行短語像是 “三隻狗之夜” 或 “抽獎” 之類的常用短語,有時候也可能是運動隊伍的名字

此外,密碼破解者會嘗試找出單詞組合,從而使這些密碼短語相對的增加。

至於 “mindhashes” 是一個非常有趣的想法,但是理解起來很複雜,執行起來更繁瑣。當用戶還在選擇 “12345” 這類密碼的時候,我們真的可以期望他們開始喜歡學習 “mindhash” 而不是生成隨機的密碼嗎?

關鍵是,密碼是基於讓人容易記住的方式而產生的。人們重複使用密碼,在密碼中加入數字,在各個帳戶之間共享密碼,或與其他人共享密碼。這不是人們的壞習慣,這就是一般人的行為。

不要只依賴密碼

密碼永遠都不會完善的。它們是在 1960 年代被發明的,目的是防止電腦工程師之間相互進行惡作劇,而且惡作劇者幾乎立刻就知道要如何竊取密碼文件。

即使在那時候,密碼也沒有被認為是在像充滿陌生人的複雜網路上提供安全性的一種方式。

正如工程師 Bill Burr 對 NIST 在 2003 年時提出的建議一樣,密碼安全性通常集中在對強壯的密碼的需求 – 一組長又複雜,而且難以破解,但卻又容易記得的密碼。但這僅解決了一種可能的攻擊途徑,卻忽略了人的天性。

密碼也是您線上帳戶較為薄弱的環節,攻擊者可以透過許多其他攻擊媒介進入您的帳戶。您可能會被偽裝成您信任的網路釣魚電子郵件誘騙,交出您極長,複雜但容易記憶的密碼,或者您的電腦在您無意中下載或安裝惡意軟體時被安裝追蹤器。有人甚至可以透過偵聽的方式,連結到未加密的網站伺服器以獲取密碼。

同樣地,責任也落在了帳戶供應商身上。已經洩露的密碼 – 即使它們具有較高的熵 – 也不應再被使用。您可以避免重複使用已經洩漏的密碼,並透過限制共享密碼的數量來降低多個帳戶受到解密的風險。

最重要的一點是 – 您的密碼不應該成為敏感帳戶的唯一防線。

我們之前討論過兩種安全功能,一種是雙重驗證法(2FA),另一個則是通用第二要素(U2F)。通用第二要素為有價值的資產提供相當重要的安全保護。使用 U2F 作為硬體的安全保護也是更安全的作法。

密碼是一種安全解決方案,其設計用於大多數人都能完全找到的環境,不同於人們當前使用的環境。

其他常用到身份驗證的系統也是如此,例如信用卡、ATM 的 PIN 碼,駕照號和社會保險號。這些常用驗證碼中的任何一個的熵都相當的低。這些系統的安全性不依賴強壯的密碼 – 4 位的 PIN 密碼可以很容易地被破解 – 與新技術一樣,它依賴於仔細而持久的詐欺檢測。

雖然您可以提出一組特定的建議,但是密碼的未來不僅限於密碼,有了其它驗證因素,像是 2FA、U2F、單一登入,和生物辨識,但也有更聰明的作法,可以透過提供帳戶的廠商,來確保用戶數據的安全性和可訪問性,並檢測出具有詐欺企圖的帳戶。