笑中有淚的密碼政策,不要因為你常用的網站不在此列而沾沾自喜,這些由蠢蛋製作出來的東西幾乎無處不在。
如果你曾經讀過小弟多年前的舊作「怎樣管理密碼?」和「定期更改密碼的迷信」,應該知道密碼的長度,是構成密碼複雜性的最重要因素。其他因素包括大小寫英文字母、標點符號、不能包含帳號名稱、不能包含連續相同的字符等等,都是旁枝末節,結果很可能是強逼用戶創作一個連他們自己也無法記住,唯有用小紙片記錄下來的密碼。系統管理員當然自我感覺良好,但系統的安全性其實不增反減。
美國國家標準及科技局 (NIST, National Institute of Standard and Technology) 正在更新一份有關數碼身份的文件 (NIST SP 800-63-3),同樣指出密碼的長度,是唯一有用的密碼政策。以下是文件草稿中的相關段落(由 Google 翻譯,再經人手修正):
為了解決由此引起的安全問題,網上服務引入了一些規則來增加這些密碼的複雜性。其中最顯著的形式是組合規則,其要求用戶混合不同字符類型來建構密碼,例如至少一個數字,大寫字母和符號。然而,對破解密碼數據庫的分析顯示,這種規則的好處並不像最初想像的那樣顯著,但是對可用性和可記憶性的影響卻非常嚴重。
用戶自選密碼的複雜性通常使用信息理論概念中的「熵」來表示。雖然對於具有確定性分佈函數的數據,熵的值可以容易地計算出來,但是估計用戶自選密碼的熵是困難的,過去對此所做的努力並不特別準確。由於這個原因,在此提出了別於傳統,並且更簡單的方法,就是主要基於密碼長度的方法。
……
密碼長度是表徵密碼強度的主要因素。太短的密碼會導致暴力攻擊,以及使用字詞和常用的密碼進行字典攻擊。
……
應鼓勵用戶將密碼設置為自己想要的長度,只要不太過份就行。由於密碼散列值的大小與其長度無關,所以沒有理由不允許用戶使用冗長的密碼(或密碼短語)。過分長的密碼(例如達到數百萬字符)可能需要極多系統資源來計算散列值,所以有一定的限制是合理的。
這份文件也解釋了其他常見的密碼政策不一定對提高安全性有用:
如上所述,組合規則通常用於增加猜測用戶自選密碼的難度。然而研究表明,用戶以非常可預測的方式對組合規則的要求作出回應。例如,如果需要包括大寫字母和數字,用戶則可能選擇「Password1」,如果還需要符號,用戶將相對可能選擇「Password1!」。
當嘗試設置複雜的密碼卻被拒絕時,用戶也會感到不安。許多網上服務拒絕帶有空格和各種特殊字符的密碼。在某些情況下,不接受的特殊字符可能是努力避免像 SQL 注入攻擊之類的入侵。但是正確散列的密碼在任何情況下都不會被完整地發送到數據庫,因此這種預防措施是不必要的。用戶還應該可以包含空格字符以便使用短語密碼。然而,空格本身不會增加密碼的複雜性,並且可能引致可用性問題(例如,用戶不知道輸入了兩個空格而不是一個空格),因此在驗證之前刪除輸入的密碼中的空格可能是有益的。
這份文件尚在草擬階段,正接受公眾的意見,將來還可能有變動。很高興 NIST 這位老大哥指出了設置密碼的正確方向。
密碼的長度是安全性的黃金標準,其他的通通是廢話。在系統資源容許的情況下,應該讓用戶設置任意長度的密碼,不是 8 個字符,也不是 10 個、16 個、100 個,今天的電腦快得你不能相信,計算區區幾十 KB 甚至 MB 字符的散列值只是小菜一碟。
設置密碼只是管理密碼的第一步,跟着密碼如何安全地傳送到伺服器?如何儲存?如何驗證?如何重置?用戶那邊又怎樣記憶和管理密碼?這一大堆東西都是生死攸關的問題,複雜程度足夠寫一本小書,不可能在一篇文章中說得完,將來有機會再討論。