2008年9月23日 星期二

MD5

上次說MD5變成了發牢騷,今次我真正說一說MD5是甚麼。

MD5是one way hash的一種,hash中文譯為‘雜湊算法’,我非常不喜歡這個譯法,比較可取的是譯法是‘摘要算法’或索性音譯成‘哈希算法’。

我們可以從‘摘要算法’作為理解的起點。當你看了一部兩小時的電影後,我想知道其內容,你無需用兩小時,可能你祗用兩分鐘,便可大概把內容告訴我。這便是‘摘要’。

當然千萬不要錯誤理解,MD5算法可以有‘智能’地抽取文章的重點,MD5算法祗是可以把不論長度的內容,計算出一個128bits(即一個128位的二進制數字)。由於計算過程全都是deterministic的,所以相同的內容,必會產生相同的結果。這個結果實在沒有任何資訊上的意義,但它就可以視為一個內容的電子簽署。例如,你可發佈一篇文章,但接收者無法得知是否有人曾更改其內容。於是,你便可使用MD5算法,由你的文章生成一個128bits的數字,你就在一個可信任的途徑,例如你的官方網站,發佈這個數字,你的讀者便可以用他們接收的檔案,又生成一個MD5數字,若兩者一致,他便有信心信息在傳送途中未經修改。

例如:

我有一個檔案(註一),內有一句

這是一個試驗

其MD5數值便是
d82d27c49b1b62a6987b4333b1a18d48

你可能會奇怪,為甚麼除0-9外,還有a,b……,其實,這是16進制數字,a代表10,b代表11,…,f代表15

好,我在原來的文檔上加多一個句號,令其變成
這是一個試驗。

那麼,MD5數值便立刻變成
7133a749cb00378b2f7cb6c54f3a8184

祗是多加一個句號,變化就這麼大!應說是完全的不同。這就是md5保護能力所在。理論上,你不能在改了一個字後,又對其他內容作出調整,從而再產生相同的電子簽署!(註二)

MD5廣泛用於Unix系統的密碼貯存上,當你輸入密碼後,系統便會計算其MD5值,然後加以貯存(註三)。下次當你登入時,系統又再計算你輸入密碼的MD5值,若兩者相同,便視為准許登入。這樣做的好處就是,若密碼檔案給人讀取了,他看到的仍是MD5數字,他也無法得知你的密碼,就好像我們不能從d82d27c49b1b62a6987b4333b1a18d48算出是由‘這是一個試驗’生成一樣。所以,若你掉失了密碼,系統管理員也不可以告訴你,你的密碼是甚麼,他可以做的祗是幫你重設另一個密碼而已。

安全警告會請你不要用一些有意義的字詞來當密碼,便是這個原因。在密碼學上,有一種名為字典攻擊(dictionary attack)的方法,這就是把字典上的英文字的MD5全計算出來,若你是用一些英文字如‘hello’作密碼的話,攻擊者便很容易從MD5碼配對出你的密碼來!

註一:MD5不會理會內容,它祗是一種數字的配對。由於我是以中文做例子,而中文就存在著多種不同的編碼方法,若你用相同的句子,而得出不相同的MD5數字,請不要奇怪。這應是編碼的問題。

註二:我早前都說過,編碼和破解存在著辯證的關係,如上文所說,在2008年,便有研究員開發出一些偽冒MD5的算法。其實,自MD5面世後,經已有很多部份破解的算法出現。

註三:針對MD5後來出現的弱點,UNIX系統增加了一個名為salt的數字,組合後才計算MD5。基本上,從已知的資料上判斷,UNIX的密碼系統,仍然是安全的。

沒有留言:

網誌存檔