生活中越來越多的網站需要密碼
而越來越多的網站對密碼的要求越來越變態。
能記在腦袋中的密碼才安全
因為密碼越來越複雜,複雜到越來越記不住
因為普遍認為:越複雜的密碼越安全。
結果越複雜的密碼越記不住,然後就會想辦法抄下來。
抄下來就有風險。
抄在簿本上的人已經算很有安全意識了,只是他們真的記不住。管很多系統的人哪一個不是拿了一本密碼簿在手上,重要性甚至超過大門的鑰匙。沒帶或是弄丟可不是小事,甚至會丟了工作。
有些人比較聰明,直接把密碼存在電腦裡(甚至是雲端),要的時候上網查?
咦?這不是更不安全嗎?
有些人做成一堆便利貼貼在設備旁邊、寫在白板上,或是壓在桌墊下。上有政策下有對策,誰叫你要那麼「安全」?!
明眼人都知道這根本就是本末倒置的現象,畢竟人對字符數量的記憶是有限的,正常人對於字符的記憶並不長,如果加上了更多的規則後,能記住的長度就更短了。
舉例而言,在這個網站中[1],測試對數字(僅有數字)的記憶程度做了統計:
這測驗產出一個隨機數字,給予幾秒鐘時間記憶後,立刻考你出現的是什麼數字。平均數落在7個,經過訓練或有記憶技巧的人可以多一點,但峰值也不過是9個。
簡單的來說,密碼要求的字元越多,肯定會超出人腦記憶的極限,到時就得用紙筆記下來,那是必然的事。
好的密碼一定要能記得住
是不是工程師在設計密碼輸入的時候都會喜歡要求使用者設定一個複雜的密碼?就像至少要8個字元、要有大小寫數字和特殊符號才行。
事實上,很多工程師並不喜歡太複雜的密碼;相反的,工程師反而喜歡簡單的東西。但是為什麼最後的結果反而密碼要求越來越複雜?
很多情況都是因為上層的資安政策所導致,他們的長官或是業主要求他們限制了使用者密碼的規則。
工程師基本上都是無辜的,畢竟越複雜的規則工程師就要寫越多的程式碼,多累人啊。
密碼並不是越複雜越好
因為人腦容易記不住,把密碼變得很複雜只會讓忘記的情況越常發生。
相反的,人腦對於有意義的句子更容易記得住,例如下面這兩種密碼:
!abcD1234
this is a book
哪一種比較容易讓你記得住?
這兩種密碼似乎都不難記,第一個「!abcD1234」雖然不是句子,但是數字和英文字母間有一種規律,人腦容易記住有規律的事物,也許和記憶的本質有關,記憶不單單只是資料的存放,在存放的過程還有理解和歸檔的隱藏過程。
而第二個「this is a book」是一個非常簡單陳述的句子,相信只要上過初中的人都會,毫無疑問的,句子是人人都能記得住,用這當密碼肯定不容易忘。
越複雜的密碼越安全?
從上面的例子來看,兩個看起來不難記的密碼,到底哪一個比較安全?
先就規則來說,第一個符合所有條件:要有長度至少八碼+大寫英文+小寫英文+數字+特殊符號 所組成:
!abcD1234
而第二個只符合長度至少八碼+小寫英文+特殊符號這三個規則:
this is a book
因此基本上大部分的系統都會把他拒於門外。
但是哪一個比較安全呢?我們交由一個測密碼的網站檢查你的密碼強度有多少[3]
分別來做密碼強度檢測:
由數據來看,符合所有規則的密碼!abcD1234,竟然得到的結果是「Very Weak」,破解只需要0.46s
而第2個密碼,感覺上不是很安全而且大家都知道的句子,竟然是「Strong」破解要長達2個月。
事實上,密碼是只要夠長就安全。相對的越複雜只會讓人家越記不住。
再舉一個例子,例如在過去某些專家教大家的密碼設定方式:把英文的i代換成數字1,把英文的O代換成為數字0,再把英文部分換成大寫,或把i換成驚嘆號之類密法:
原本 ibook
一個變大寫 Ibook, iBook ibOok iboOk, ibooK 破解只需 0.11~0,27秒
換成0 ib00k 0.11秒 並不會變得更難破解。
對現代電腦來說,數字或符號都是一樣的意義。
從數學來看,組成8個字的密碼複雜度是:
使用 a-z
26^8= 208827064576 (1)
使用 a-zA-Z
52^8= 53459728531456 (256)
使用 a-zA-Z0-9
62^8= 218340105584896 (1046)
使用a-zA-Z0-9 +20個特殊符號
82^8= 2044140858654976 (9789)
括號裡的數字是假設只用a-z若破解所需時間是1單位,使用更多字符時的耗時。
可以看出,如果使用a-zA-Z0-9 +20個特殊符號總共82個字符設定的8個字符的密碼,組合比起使用a-z 26個字符的密碼組合為9789倍。
雖然組合數看起來很驚人,但以現在電腦的超高速運算來說,還是能在有限的時間算完。
感覺上是用的字符種類越多越安全?事實上,這會增加記憶的難度。
假設我們只用26個小寫英文字符來作密碼 a-z,就會不安全嗎?
因此我分別列舉不同的密碼長度,來看看組合的數量變化:
使用 8碼
26^8= 208827064576 (1)
使用 9碼
26^9= 5429503678976 (26)
使用 10碼
26^10= 141167095653376 (676)
使用 11碼
26^11= 3670344486987776 (17576)
使用 12碼
26^12= 95428956661682176 (456976)
上面可以看出,光使用英文小寫字母組成的密碼,使用11碼長度的話,組合數就超過a-zA-Z0-9 +20個特殊符號長度8碼的密碼2倍之多
更別說如果我若使用a-z +空白' '和句點'.'28個字符來組成密碼的話(一個短句會用到的字符)
使用 a-z
26^8= 208827064576 (1)
使用a-zA-Z0-9 +20個特殊符號共82個字符 8碼
82^8= 2044140858654976 (9789)
使用 a-z 11碼
26^11= 3670344486987776 (17576)
使用 a-z空白和句點 11碼
28^11= 8293509467471872 (39715)
所以,就算連 "this is a book" 這麼簡單的句子組成的密碼,竟然是很難破解的密碼。
對電腦對現代電腦的運算力來說,就算你用了82個字符,長度在8碼以內,都能在幾個小時~到數天之內就破解。
上圖:看似平凡無奇的密碼,只不過句子後面加了一個點,竟然破解要長達4年。
結論
1. 請程式設計者和資安專家有點同理心和常識,不要因為規則讓使用者一直記不住密碼。
2. 密碼設定的規則要長,但是不要複雜。
例如規定至少11個字元即可,不限定要幾個大小寫幾個數字或幾個特殊符號。
3. 密碼可接受長度要增加,例如可接受長達20~30個字元的密碼。
4. 使用26個字符組成長度11的密碼比使用82個字符長度為8的密碼更難破解。
參考資料
[1] https://humanbenchmark.com/tests/number-memory
[2] Gardiner JM, Java RI https://www.ncbi.nlm.nih.gov/pmc/articles/PMC3515440/#pone.0051067-Zviran1
[3] https://www.my1login.com/resources/password-strength-test/