你以為你的密碼很安全嗎?md5加密的破解方式

md5演算法因為其「不可逆(即加密過的編碼資料無法反解回原始資料」的加密特性,加上速度快,加密結果長度長,成為了密碼加密最常使用的方式之一。

尤其是在使用者密碼的加密上面,由於PHP跟Mysql本身都內建md5加密函數,所以將使用者的密碼資料經過md5演算法加密過後(不管是用PHP或是Mysql來完成),再存進使用者資料表中,就可以保證密碼在資料庫中部以明碼儲存。

為什麼資料庫中的密碼資料不應該用明碼來儲存?主要的原因是考量到兩個安全性:

  1. 保證資料外洩後,機密的密碼資料不會被盜取。
  2. 確保系統開發人員不會直接取得使用者的機密資料。

所以md5成為了系統開發人員的首選。但是隨著時間過去,md5演算法不再完美無缺。

因為md5演算法雖然再難以破解,再難以還原為原來的密碼,但是由於其單向一對一的特性,也就是說,一個明碼只會被轉為一種暗碼,只要利用字典暴力破解的方式,隨著時間累積,一些比較脆弱的密碼還是有很容易被破解的機會。

GData就是一個儲存md5字典的一個網路服務,只要從介面輸入md5的編碼結果,他就會利用md5字典反解出原來的密碼,比如以下的幾個例子:

  • e10adc3949ba59abbe56e057f20f883e的反解結果:123456(連續數字)
  • 8b265b8d3371f3586418ff434662d3ff的反解結果:19800214(跟日期有關的數字,這個是我的生日)
  • a76637b62ea99acda12f5859313f539a的反解結果:interesting(有意義的英文單字)
  • f337771c9ad2c03894f5758143695008的反解結果:interesting1(有意義的英文單字加上簡短的數字)
  • 472d46cb829018f9dbd65fb8479a49bb的反解結果:Jason(人名或是姓氏)
  • 1c63129ae9db9c60c3e8aa94d3e00495的反解結果:1qaz2wsx(乍看之下是很好的密碼,因為它混和了數字加上英文字母,但實際上從鍵盤輸入的觀點來看,它其實是相鄰的按鍵組合。

以上的這些例子,在在的都告訴我們,經過md5加密的密碼並不能完全信任,尤其是當使用者的密碼過於簡單的時候,即使一般駭客不容易取得資料庫的內容,但是別忘了,系統管理者跟DBA都可對這些密碼資料都了若指掌。

但是,這難道沒有解決的方法嗎?

其實有幾個方法可以加強md5 hash的安全性,第一種方法叫做「Salt」。簡單來說,就是在原始的的明碼要加密成md5編碼之前,先用一個不規則且符合密碼強度的字串拼在原來的明碼之前或之後,如果需要的話,前後都可以加上,比如說我原來的密碼是play1234,這個是很容易被反解出來的密碼,但是如果我在play1234的前面跟後面都各加上一些字串,讓play1234成為更複雜的密碼,像是「js7n!ysplay12347vhdym」,然後再用md5編碼,就不用擔心這個md5編碼過後的字串會在短期之內被還原為原始的明碼。而要進行比較的話,只要把使用者的輸入字串重新拼上這些冗餘字串(Salt),就可以和資料庫所儲存的密碼資料進行比對了。

另外一個方法叫做「Rehash(重雜湊)」,原始的概念使用在資料結構當中處理雜湊資料碰撞的問題。我們把md5編碼過後的md5字串再編碼一次後再儲存到資料庫,那麼再厲害也無找回原來的明碼是什麼。

保護自己的帳號密碼是在網路世界中冒險最重要的基本動作,你可以用md5函數去加密自己的密碼過後,送去這個網站試試看,你的密碼是否也在md5字典清單之內呢?