1 選擇產生什麼
密碼是一串字元:短、強,而且是你會放進密碼管理器裡的東西。密碼短語是從詞表裡隨機挑出來的一串詞:敲起來長一些,但好記得多,也念得出口,正好用在那幾個必須你自己從腦子裡敲出來的秘密上,比如密碼管理器自己的密碼、膝上型電腦的密碼、手機的恢復碼。
2 設定
長度 長度勝過其他一切。往一個 94 個字元的字符集裡多加一個字元,比任何關於必須包含哪些字元的規則都值錢。
用哪些符號 就是這些:。空格、兩種引號、反引號和反斜槓在兩組裡都被特意排除了。它們和別的字元一樣隨機,但把一個本來好好的密碼變成一張工單的,往往就是它們。
每一類至少一個字元 給那個非要不可的登入表單用的。它讓密碼更弱而不是更強,因為它把原本可能出現的一部分密碼排除掉了。下面的讀數已經把這一點減掉了。
不要容易看混的字元 去掉 I l 1 | 和 O 0,適合那種要從螢幕上讀出來、再敲到別處去的密碼。多加一兩個字元的長度來補上這個代價。
詞數 四個詞是那張有名的圖,放到今天已經低於值得用的水平。要緊的東西,六個詞是合理的下限;守著其他所有密碼的那一個,用七個。
詞表 長表是每個詞擲六次骰子,也就是 12.9 位元。短表是四次,10.3 位元,裡面每個詞都不超過五個字母,而且沒有哪個詞是另一個詞的開頭。要在電視遙控器上敲、或者從手機螢幕上讀的密碼短語,就用這一張。
詞與詞之間 這裡面只有隨機數字真的加了點東西,因為它在每個接縫處都是一次新的抽取,而不是一條規則。其餘幾個看的是你要貼進去的那個框收不收,空格最好讀,也最容易被弄壞。
大寫 這三個都不增加強度:當前用的是哪一個,誰都能從這個頁面上讀出來,攻擊者不需要去猜。它放在這裡,是給那種非要一個大寫字母的表單用的。
結尾加一個符號 還是給那個較勁的表單用的。數字是一次真正的抽取,值 3.3 位元;符號是從八個裡抽的,值 3 位元。
3 帶走
或者一次產生好幾個 下載的這份清單是一個純文字檔案,內容由這個頁面從你螢幕上已有的東西寫出來。儲存它的是你的瀏覽器,存到的是你自己的硬碟,沒有任何東西會把它送到別處去。話雖如此,硬碟上一個裝滿密碼的檔案仍然是一個裝滿密碼的檔案:把它們挪進密碼管理器,然後把檔案刪掉。
已經沒有東西可抽了。回到第 2 步,至少把一類字元重新開啟。
位元的熵
攻擊者要想確定找得到它,得把 種可能性都走一遍。
這個估計假定了什麼
假定攻擊者偷走了存放你密碼的那個檔案,正在自己的機器上以每秒一千億次的速度往上撞。那大概相當於用一機架顯示卡去撞一個快速雜湊,而洩露事件裡反覆出現的正是這種雜湊。如果對面是一個挑得對的口令雜湊,bcrypt 或者 Argon2,同樣的機器每秒只能做幾千次,上面每一個答案都會難上大約 25 位元。如果對面是一個每秒只回應十次的登入表單,那這些答案一個都夠不著。
這個數字是特意取悲觀那一頭的,而且是要確定猜中所需的次數;平均一次攻擊在一半的地方就找到答案,上面的估計用的正是這一半。
這裡什麼都不記
這個頁面產生的東西從不儲存、從不列出、從不傳送。沒有歷史記錄要清,是因為壓根就沒有在記:重新整理一下頁面,它給你看過的每一個密碼就都沒了,連它自己記憶體裡的那份也沒了。副本只有你自己留下的那些,也就是剪貼簿,還有你要了的話那個文字檔案。