Thursday, September 4, 2014

大密碼時代 (中)

一般網站蒐集到密碼後, 通常都會先利用某些複雜的運算式來算出一串編碼, 比方說

p@ssword 這個密碼經過 SHA-1 計算會變成
36e618512a68721f032470bb0891adef3362cfa9
然後網站再把編碼儲存起來, 並且把原來的密碼丟棄. 這種編碼一般來說是"不可逆"的, 也就是說沒有辦法從編碼反推回去原本密碼.

等下次你登入的時候, 網站會再做同樣的運算, 並且把這次算過的編碼跟你註冊時存的編碼做比對, 如果一致就代表密碼正確, 反之代表密碼錯誤. 這也就是為什麼忘記密碼的時候網站就算想直接告訴你密碼也沒辦法, 因為他們也不知道, 他們只知道計算過的編碼.

所以, 絕大部分網站的密碼被盜時, 都是這種編碼過的資料, 乍看似乎很安全, 因為盜走資料庫的人也不知道真正密碼是甚麼. 如果你這麼想那麼就錯了.

盜走密碼的人, 要破解密碼主要是用"猜"的, 最笨的方法就是窮舉法. 假定密碼只有一個小寫英文字母的話, 那麼駭客最多只要試
26^1 (26 的 1 次方)
就猜出來了. 兩個小寫英文字母的話就是26^2 = 676 次,
三個則是 26^3 = 17576,
以此類推. 如果加上大寫英文字母還有數字的話, 一個字元的密碼最多猜
26+26+10 = 62 次 (小寫 26, 大寫 26, 數字 0~9),
兩個字元變成 62^2 = 3844,
三個字元變成 238328.

以現在一般網站都要求至少五字元以上的密碼為例, 就是最多有 62^5 = 916,132,832 種組合, 九億多分之一耶! 這樣不是很安全嗎?

 並沒有.

以 SHA-1 這種演算法來說, 駭客只要花大概兩百塊美金左右的硬體設備就可以在 1/15 秒全部算完五個字元密碼的全部排列組合, 這還是慢的, 如果你的密碼是全數字, 就算有十幾個數字也是直接秒殺.

用 2012 年的資料, 當時的紀錄一秒可以跑完三千五百億個 NTML 編碼, 換算是大約十五億個 SHA-1 編碼, 也就是說就算你的密碼是八個字元, 大概一個小時左右就可以猜出來.

更糟糕的是, 駭客並沒有那麼笨一個一個算, 他們會先去拿所謂的"字典檔"來猜,這個字典檔裏面包含了一般常用的單字或是密碼, 所以像是 12345, password, Password 這種類型的密碼馬上就會被猜中. 上一篇有提到 RockYou 這個網站有三千萬個沒加密過的密碼被偷, 你最好祈禱你的密碼沒有在這三千萬密碼裡面, 因為這些密碼肯定早就被加到他們的字典檔裡了. 當然, 一個夠格的駭客字典檔裡絕對不只有三千萬個排列組合.

一小時算出八個字元的速度其實還不夠快, 駭客們還用一種工具叫做"Rainbow Table", 基本上你可以想像這是個對照表, 駭客們事先算出某個密碼的編碼, 然後拿偷過來的編碼直接去對照, 連算都不用算. Linked-In 幾百萬密碼被快速破解, 除了他們是用這種簡單的 SHA-1 編碼以外, 不安全的編碼方式很容易用 Rainbow Table 直接找出原本密碼.

下一篇我們會來討論好的密碼該怎麼設計.

No comments:

Post a Comment