以最常見的網絡安全問題弱密碼這個話題而展開一下。
相信到目前為止,大部分企業所采用的一個最佳IT實踐必定是采用復雜密碼,不管是哪篇文章,哪本書籍,不管是CISSP還是CISP,要求用戶使用強密碼是必然存在的一個準則。而每次攻防演練中,用戶弱密碼或者缺省密碼往往成為了攻擊的最優解。
由弱口令導致的攻擊事件實令人心驚膽戰,弱密碼,空密碼,缺省密碼以及明文密碼等逐一被挖掘出來,涉及不乏有企業重要業務系統和核心基礎設施的賬號安全問題。為了解決這種問題,有些企業重刀下要求,要求員工使用12位甚至16位以上的密碼,設定密碼策略,必須符合大小寫,數字,特殊符號齊全的強密碼策略。我們今天就該問題進行一些討論。
美國國家標準與技術研究院(National Institute of Standards and Technology,NIST)發表了一篇文章,名為“Digital Identity Guidelines“挺有意思,大家有興趣的可以去看看原文,地址后面附上,這篇文章講了一些身份標識的使用準則,我這里簡單給大家講講。
這些準則為實施數字身份服務的聯邦機構提供技術要求,并不打算在此目的之外限制標準的制定或使用。這些準則的重點是對通過開放網絡與政府系統進行互動的主體進行認證,確定某位申請者是先前已被認證的用戶。
認證過程的結果可以由執行認證的系統在本地使用,也可以在聯合身份系統的其他地方宣稱。該文件定義了三個認證器保證級別中每個級別的技術要求。(AAL1,AAL2,AAL3,詳情見文內表格)該出版物取代了NIST特別出版物(SP)800-63-2的相應部分。

這篇文章噼里啪啦地講了一大堆,我們主要看5.1.1.2 Memorized Secret Verifiers,中文不太好翻譯,但意思應該容易理解,我直譯了一下,密碼驗證器,文中指出幾點:
密碼長度需為8位以上,并允許最大長度為64位的可見字符(參考RFC20標準)
PIN碼必須是6位以上
密碼必須無任何“提示”信息,且不應提示任何特殊類型的信息,比如“你家的第一只寵物貓的名字是什么?”
在處理新增或變更密碼請求時,將根據如下列表且不限于如下列表進行驗證并排除該密碼的變更請求
被列名的已知弱密碼,比如qwerty
常見字典詞,比如password等
重復的或連續的字符,比如aaaaaa,1234,abcd等
特定背景的詞,比如服務的名稱,用戶名,以及其他衍生品
應向用戶提供指導,如密碼強度表,幫助用戶選擇一個容易記的強密碼
應施行密碼錯誤鎖定策略
應允許使用粘貼選項,這是為了方便使用密碼管理器進行密碼粘貼,密碼管理器在許多情況下增加了用戶選擇更強密碼的可能性
應允許用戶在輸入密碼的時候短暫顯示每個輸入的字符,以驗證正確的輸入,尤其適用于移動設備。一系列的點或星號輸入經常導致密碼輸入錯誤,而在最后使用View查看輸入的密碼卻又會帶來其他風險
不應該對該密碼強加其他組合規則(例如,要求不同字符類型的混合或禁止連續重復字符)
服務存儲密碼必須保證能對抗高強度的離線破解,必須采用適當的單向密鑰加密函數并采用加鹽散列提供,其中鹽值必須為至少32位長度
請求密碼時必須使用經過批準的加密和認證的受保護通道,以避免竊聽和中間人攻擊
使用多因素認證,并規定了軟硬件單、多因素認證的標準
盡管從可用性和安全性的角度來看,密碼的使用普遍令人沮喪,但它們仍然是一種廣泛使用的身份驗證形式。然而,在日常生活中,我們需要記憶的密碼太多,線下的,線上的,社交的,企業的,各種各樣的都需要密碼,所以我們往往選擇容易被猜中的密碼,或者弱密碼。
為了解決由此產生的安全問題,各種在線服務均已經出臺了一些規則,以增加這些密碼的復雜性。其中最值得注意的是密碼組合規則,它要求用戶選擇使用混合字符類型(例如至少一個數字、大寫字母和符號)構造的密碼。然而,對被破解的密碼數據庫的分析顯示,盡管對可用性和可記憶性的影響非常嚴重,但此類規則的好處并不像最初認為的那么重大。
用戶選擇密碼的復雜性經常使用信息論中的熵概念來表征。雖然對于具有確定性分布函數的數據,熵值可以很容易地計算出來,但是對用戶選擇的密碼的熵值進行估計是困難的,而且過去的努力并不是特別準確。出于這個原因,本文提出了一種不同的、稍微簡單一些的方法,主要基于密碼長度。
許多與使用密碼相關的攻擊不受密碼復雜度和長度的影響。鍵盤記錄器、網絡釣魚和社會工程攻擊對冗長、復雜的密碼和簡單的密碼同樣有效。這些攻擊不在本文討論的范圍之內。
口令長度是描述口令強度的主要因素。太短的密碼會導致暴力攻擊以及使用單詞和常用密碼的字典攻擊。
所需的最小密碼長度在很大程度上取決于所處理的威脅模型。通過限制允許的登錄嘗試的速率,可以減輕攻擊者試圖通過猜測密碼登錄的在線攻擊。為了防止攻擊者(或老打錯字的)通過多次錯誤的猜測,輕易地對用戶實施拒絕服務攻擊,密碼需要足夠復雜,以便在多次錯誤嘗試后不會出現速率限制,但確需要實施限制當發現有成功猜測的情況。
當攻擊者通過數據庫漏洞獲得一個或多個散列密碼時,有時可能發生離線攻擊。攻擊者確定一個或多個用戶密碼的能力取決于密碼的存儲方式。通常,密碼是用一個隨機值和散列處理的,最好使用一種計算代價昂貴的算法。即使有了這些措施,目前攻擊者每秒計算數十億哈希的能力,而且沒有速率限制,這要求抵御此類離線攻擊的密碼比預計只能抵御在線攻擊的密碼要復雜幾個數量級。
應該鼓勵用戶在合理范圍內設置自己想要的密碼長度。由于哈希密碼的大小與它的長度無關,如果用戶希望的話,沒有理由不允許使用冗長的密碼(或短語)。但過長的密碼(長度可能為兆字節)可能需要過多的散列處理時間,因此有一些限制是合理的。
如上所述,密碼的組合規則通常用于試圖增加猜測用戶選擇的密碼的難度。然而,研究表明,用戶以非常可預測的方式響應組合規則強加的需求。例如,一個用戶可能選擇了“password”作為他們的密碼,如果要求包含大寫字母和數字,那么相對來說,他可能會選擇“Password1”,或者“Password1!”如果還需要一個符號的話,我想這點很多人都干過。
當用戶創建的復雜密碼的嘗試被拒絕時,用戶一般會說“靠,這都不行,真煩“?許多應用拒絕使用空格和各種特殊字符的密碼。在某些情況下,不接受特殊字符可能是為了避免依賴于這些字符的SQL注入之類的攻擊。但在任何情況下,正確散列的密碼都不會完好無損地發送到數據庫,因此這種預防措施是不必要的。用戶還應該能夠包括空格字符,以允許使用短語。然而,空格本身并沒有增加密碼的復雜性,而且可能引入可用性問題(例如,未被發現使用兩個空格而不是一個),所以在驗證之前刪除輸入的密碼中重復的空格可能是有益的。
用戶的密碼選擇非常容易預測,所以攻擊者很可能猜測過去成功使用過的密碼。這些密碼包括字典中的單詞和以前的密碼,比如“Password1!”。出于這個原因,建議將用戶選擇的密碼與不可接受的密碼的“黑名單”進行比較。這個列表應該包括來自以前的入侵泄露過的密碼、字典詞匯和用戶可能選擇的特定詞匯(如服務本身的名稱)。由于用戶對密碼的選擇也將受最小長度要求的約束,因此該字典只需要包含滿足該要求的條目。
高度復雜的密碼引入了一個新的潛在的弱點:太復雜,記不住。而且更有可能被以不安全的方式記錄下來,比如寫到紙上,或者用Excel記錄。雖然這些做法不一定容易受到攻擊,但從統計學上講,一些記錄此類秘密的方法將會受到攻擊。反過來講,這也是一個不需要太長或太復雜的密碼的另外一種考慮。
文中還提到6位數的隨機生成的PIN碼已經足夠強壯,可以作為密碼使用的一個考慮。
如果對密碼的長度和復雜度要求超過了這里推薦的程度,將顯著增加密碼記憶的難度,并降低用戶的易用性。因此,用戶經常以適得其反的方式繞過這些限制。此外,其他的密碼緩解措施,如黑名單、安全散列存儲和速率限制,在防止現代暴力攻擊方面更有效。因此,當密碼驗證框架完善,對該類密碼而言,其實并不需要附加復雜性要求。