1. 程式人生 > >關於HASH和MD5,王小云教授的“解密”

關於HASH和MD5,王小云教授的“解密”

看來很多人對Hash演算法還不是很理解。在這裡,我簡單的講解一下。
我也不在希望以後再有人問關於MD5,SHA1如何解密了!

首先簡單的講一下Hash演算法和他的通途!可能大家看了以後,很多人可能都會發現自己
目前在使用Hash演算法的目的都是和Hash演算法本身的設計目的不一樣的 :D

Hash演算法不管是MD5也好SHA1也好. 他們都是一種雜湊演算法,其演算法的特點是,可以把任意長度的字串經過運算生成固定長度的字串,並且這個產生的字串代表著原來字串裡的所有字元。
簡單的舉個例子,就拿我上面說的那個帖子裡面的 kc_ren(天堂龍)的例子:

admin 加密後:
16位8f00b204e9800998
32位d41d8cd98f00b204e9800998ecf8427e

其中不管是16位也好,32位也好其生成的字串8f00b204e9800998 (16bit)或者d41d8cd98f00b204e9800998ecf8427e(32bit)他們表示著admin這個原始字串.

只要admin這個字串沒有變,不管怎樣重複使用MD5或者SHA1進行重新運算,其結果保持不變。

利用這個特點,在電腦保安學上,我們使用這種演算法來保證資料完整性(Integrity)
這裡提到電腦保安學,我在這裡擴充一下:簡單的概述電腦保安學,其實就是一門在講關於 CIA
的學科。 C = Confidentiality (機密性), I = Integrity (完整性), A = Avalibility(可用性)

顯而易見Hash演算法,是用來保證 Integrity的演算法。什麼叫做完整性,不單單指資料不丟失,並且要保證資料沒有被非法修改過。舉個簡單的例子。

比如:A 發了一個Email給B內容為"Hello",因為我們目前使用的乙太網的特點,任何人在網路上都有可能截獲這封Email,任何人都有可能,修改Hello這個字串。那麼當B收到這封A發來的Email的時候,怎麼確定這封Email在傳送過程中沒有被修改過呢? 我們就使用了Hash演算法來保證資料的完整性。他的工作方式是這樣的:

1.A寫一封Email內容為Hello
2.A用Hash演算法對Hello進行編碼(這裡我用了編碼,沒有用加密這個詞)
3.A將原始Email Hello 以及經過Hash演算法編碼過後的digest(原始Email的摘要資訊)一起傳送給B
  (因此,A給B發的Email由2部分組成,1是原始的Hello,2是經過Hash編碼的摘要資訊)

4.B接收到了A的Email,首先分離由2部分組成的郵件。
5.B通過Hash演算法,根據收到的Email的內容,重新計算出該Email的摘要資訊.
6.B將自己計算出的摘要資訊和收到的摘要資訊進行比較,如果比較結果一樣,則認為這封Email在中途沒有被修改過,否則的話,這封Email在中途一定被修改過,因此內容不可信。

至此,保證了原始資料的完整性。
很多人在使用Hash演算法在對密碼進行所謂的加密,其實是不妥的。這樣做的最終結果最多最多就是能夠讓使用的這個軟體的人放心。放心什麼呢?放心的就是他們在你的軟體裡面所儲存的密碼,開發軟體的人不能獲得。除此之外,沒有其他任何價值。如果一定要說出其他的價值的話。也就是如果開發軟體的人員或者維護該軟體的人員不小心將含有客戶密碼資料的資料庫洩密的話,得到這個資料庫的人,無法從資料庫中獲得那些客戶的密碼。 但是,大家想想清楚,我都獲得了資料庫的資料,我還需要那些密碼幹什麼呢?

我相信很多在CSDN的開發者,他們為了實現向客戶承諾的所謂的 Pravicy,他們在開發Web base應用的時候,使用了Hash演算法。這樣他們會對使用他們Webbase的應用的使用者說:"你們在我這裡的登陸密碼是安全的,沒有人能夠知道。" 看上去好像想得很周到,其實,仔細想想,光光使用這種方法,如何保證使用者的Pravicy呢? 說白了,就是形同虛設,光光使用Hash演算法對使用者的密碼進行編碼(所謂的加密)是沒有什麼很高的價值的。

談了這麼多,我相信大家應該理解Hash演算法的用途了。現在我們來簡單的談一下,很多人很為之驕傲的山東大學王小云教授的關於什麼MD5"解密"的新聞.(根據我剛剛看了山東大學的網頁,據說她連SHA1,MD4都"解密"了).  請大家注意,我在解密上面放了引號!!

如果網上這麼傳,我只能說那些報道這則訊息的新聞工作者的無知!(當然不能怪他們,因為他們不是計算機專業畢業的,而且報道的又是有關電腦保安學方面的東西。要知道在美國電腦保安學,是可以單獨作為大學本科的一個專業的,裡面有太多的東西需要學了。我現在講得也只是皮毛而已。)

有點跑題了:P   ......

回過頭,簡單的講一下王教授的碰撞法。 說到解密?王教授的方法不是用來解密的。所以傳什麼王教授可以解密MD5,將MD5的編碼(所謂的加密)結果還原,這個是有點誇大了。沒有這麼傳神的,那些說法用句時髦的話來描述叫做“傳說中的解密” :D

王教授的碰撞法是利用了MD5或者SHA1演算法的一個漏洞(我暫且叫做漏洞吧,沒有考證過)
根據MD5和SHA1這種Hash演算法的特點,因為他們是任意長度的字串變成固定長度的摘要資訊。
那麼這裡就有可能發生一個問題,就是不同的字串在理論上是有可能產生相同的摘要資訊。

王教授所謂的碰撞法,碰撞的就是不同的字串所產生的摘要資訊是一樣的那些字串。因此得名碰撞法。 碰撞就是體現在這裡。沒有什麼其它的傳神的東西了。根據SHA1和MD5等Hash演算法,在設計時候,設計這個演算法的人認為不同的字串要產生相同結果的摘要資訊的可能性幾乎為零。而王教授則證明了SHA1和MD5等Hash演算法產生的摘要資訊規則是可以在比較短時間內被破解的。這樣一來,原始資料的 Integrity 就被打破了。 所謂的破解,也就是體現在這裡。

如果大家還不明白,我再簡單的用王教授的碰撞法給大家舉個簡單的例子。

還是拿我前面的例子,A給B寫了個Email叫做Hello,然後通過王教授的碰撞法,可能得到Fuck這個字串的摘要資訊和Hello這個這個字串產生的摘要資訊是一樣的。因此,在前面的這個例子中。如果B收到的Email內容為Fuck B也將認為是A發來的Email,並且沒有被修改過!

看到這裡,我相信很多目前在使用MD5或者SHA1等Hash演算法的人來保證密碼安全的人來說,應該考慮一下,是否應該繼續使用目前的方法來保證安全了。