MD5現(xiàn)在還有人用么?
說到密碼學(xué),阿粉現(xiàn)在真的是非常的頭大,為啥呢?因?yàn)槊艽a學(xué)真的是有點(diǎn)難度呀,各種各樣的加密手段,各種各樣的解密手段,像 MD5 呀,還有 RSA 呀,還有 DES 呀,反正就是一大堆,接下來的幾天,阿粉就來逐個(gè)的分析一下這個(gè)關(guān)于密碼中的各種加密手段,以及他們是如何使用的。
MD5 的前世今生
實(shí)際上,MD5由美國密碼學(xué)家羅納德·李維斯特(Ronald Linn Rivest)設(shè)計(jì),于1992年公開,用以取代MD4算法。
也就是說,在他之前,還有 MD4 算法,而 MD4 是麻省理工學(xué)院教授Ronald Rivest于1990年設(shè)計(jì)的一種信息摘要算法。它是一種用來測(cè)試信息完整性的密碼散列函數(shù)的實(shí)行。其摘要長(zhǎng)度為128位,一般128位長(zhǎng)的MD4散列被表示為32位的十六進(jìn)制數(shù)字。
當(dāng)時(shí)設(shè)計(jì)出來 MD4之后,就出現(xiàn)了兩個(gè)不服氣的人,非要證明這個(gè)玩意是不對(duì)的,關(guān)鍵是,這兩個(gè)人還真的成功了,一個(gè)是Den boer 另外一個(gè)Bosselaers 這兩個(gè)大哥,伙同一撥人,還真的找到了 MD4 的漏洞,找到MD4完整版本中的沖突(這個(gè)沖突實(shí)際上是一種漏洞,它將導(dǎo)致對(duì)不同的內(nèi)容進(jìn)行加密卻可能得到相同的加密后結(jié)果)。毫無疑問,MD4就此被淘汰掉了。
而李維斯特肯定也不服氣呀,于是在1992年的時(shí)候,李維斯特向互聯(lián)網(wǎng)工程任務(wù)組(IETF)提交了一份重要文件,描述了 MD5 這種算法的原理。由于這種算法的公開性和安全性,在90年代被廣泛使用在各種程序語言中,用以確保資料傳遞無誤等。
而之后,這個(gè) MD5 可謂是影響深遠(yuǎn),當(dāng)時(shí)據(jù)說 Den boer 另外一個(gè)Bosselaers 這兩個(gè)大哥 又開始挑刺,發(fā)現(xiàn)了MD5算法中的假?zèng)_突(pseudo-collisions),但除此之外就沒有其他被發(fā)現(xiàn)的加密后結(jié)果了。所以也就沒有后續(xù)內(nèi)容了,于是在之后的時(shí)間里,MD5 就開始被大眾廣泛認(rèn)知了,一直持續(xù)了四五年的時(shí)間。
在 1996年后該算法被證實(shí)存在弱點(diǎn),可以被加以破解,對(duì)于需要高度安全性的數(shù)據(jù),專家一般建議改用其他算法,如 SHA-2。
2004年,證實(shí)MD5算法無法防止碰撞(collision),因此不適用于安全性認(rèn)證,如SSL公開密鑰認(rèn)證或是數(shù)字簽名等用途。
所以,在之后,MD5 陸陸續(xù)續(xù)的退出歷史舞臺(tái),雖然退出了歷史舞臺(tái),但是,影響還是在的,至今也有 MD5 加密方式的存在,不信大家可以巴拉一下自己的項(xiàng)目,看看有沒有關(guān)于這個(gè) MD5 的代碼存在呢?
什么是MD5
MD5碼是以512位分組來處理輸入的信息,且每一分組又被劃分為16個(gè)32位子分組,經(jīng)過了一系列的處理后,算法的輸出由四個(gè)32位分組組成,將這四個(gè)32位分組級(jí)聯(lián)后將生成一個(gè)128位散列值。
大家看一下百度百科上面給出的流程圖
其實(shí)總的來說,MD5 就是對(duì)一個(gè)不變的數(shù)據(jù)進(jìn)行加密,而加密之后的字符串也是不變的,只要對(duì)元數(shù)據(jù)哪怕做一個(gè)簡(jiǎn)單的字符修改,那么通過 MD5 加密之后的密碼數(shù)據(jù),都會(huì)對(duì)應(yīng)的做出改變,就相當(dāng)于是一個(gè)人的 "指紋"。
Java實(shí)現(xiàn) MD5 那真的是太簡(jiǎn)單了,實(shí)例代碼如下:
MD5 為什么被棄用了
既然我們上面都說了 MD5 算是比較強(qiáng)大的了,為什么現(xiàn)在 MD5 會(huì)被大家棄用了呢?
一條信息的安全性取決于任何信息摘要函數(shù)的目標(biāo)是產(chǎn)生看起來是隨機(jī)的摘要。要被認(rèn)為是加密安全的,哈希函數(shù)應(yīng)該滿足兩個(gè)要求:
1,攻擊者不可能生成一個(gè)與特定的哈希值相匹配的信息。
2,攻擊者不可能創(chuàng)建兩個(gè)產(chǎn)生相同哈希值的消息。
根據(jù)IETF,MD5哈希值不再被認(rèn)為是加密安全的方法,不應(yīng)該被用于加密認(rèn)證。
2011年,IETF發(fā)布了RFC6151——MD5消息摘要和HMAC-MD5算法的最新安全考慮,其中引用了一些最近針對(duì)MD5哈希值的攻擊。它提到了一個(gè)在標(biāo)準(zhǔn)筆記本上一分鐘或更短的時(shí)間內(nèi)產(chǎn)生哈希碰撞的攻擊,以及另一個(gè)在2.6千兆赫的奔騰4系統(tǒng)上僅用10秒就能產(chǎn)生碰撞的攻擊。因此,IETF建議,新的協(xié)議設(shè)計(jì)根本不應(yīng)該使用MD5,最近針對(duì)該算法的研究抨擊到:在需要抗碰撞的應(yīng)用中取消MD5的使用,如數(shù)字簽名。
這樣,就導(dǎo)致了當(dāng)信息哈希代碼無意中被重復(fù)時(shí),它有可能造成信息碰撞。MD5的哈希代碼串也被限制在128位。這使得它們比后來的其他哈希碼算法更容易被破解。
所以,當(dāng)人們發(fā)現(xiàn)這個(gè)算法不太合適的時(shí)候,就開始棄用了這個(gè)算法,慢慢的就衍生出了其他的相對(duì)于MD5 更加安全的算法了。
而當(dāng)時(shí)驗(yàn)證最早的卻不是2011年,而是2004年通過我國的王曉云教授等學(xué)者的工作,md5已經(jīng)被證明可以進(jìn)行碰撞攻擊。也就是說,攻擊者可以產(chǎn)生兩個(gè)應(yīng)用程序,內(nèi)容不一樣,但是哈希值完全一樣。這就導(dǎo)致了在大家的眼中,MD5 已經(jīng)算是不夠安全的數(shù)據(jù)了,所以,MD5 就逐漸的被大家所淘汰,使用的情況也就不是那么多了。
為什么說MD5是不可逆的?
我們就簡(jiǎn)單的用A乘以B,一定會(huì)得到一個(gè)固定的結(jié)果C。
比如說A(188923010)和B(172389945)
但是如果只是給你一個(gè)結(jié)果C,你知道C是由那幾個(gè)因式計(jì)算出來的結(jié)果嗎?
我相信你也猜不出來。所以, 只能從一個(gè)方向推導(dǎo)結(jié)果,不能從結(jié)果反過來逆向推導(dǎo),就叫單向函數(shù)不可逆, 即Md5算法不可逆。
更不用說,通過MD5的復(fù)雜算法來進(jìn)行計(jì)算以后得到的固定長(zhǎng)度值了。
但是也有很多人說的比較官方,就像百度上的一些大哥生活的:
MD5不可逆的原因是由于它是一種散列函數(shù)(也叫哈希函數(shù),哈希函數(shù)又稱散列函數(shù),雜湊函數(shù),他是一個(gè)單向密碼體制,即從明文到密文的不可逆映射,只有加密過程沒有解密過程,哈希函數(shù)可以將任意長(zhǎng)度的輸入經(jīng)過變化后得到固定長(zhǎng)度的輸出,這個(gè)固定長(zhǎng)度的輸出稱為原消息的散列或消息映射。理想的哈希函數(shù)可以針對(duì)不同的輸入得到不同的輸出,如果存在兩個(gè)不同的消息得到了相同的哈希值,那我們稱這是一個(gè)碰撞),使用的是hash算法,在計(jì)算過程中原文的部分信息是丟失了的。一個(gè)MD5理論上是可以對(duì)應(yīng)多個(gè)原文的,因?yàn)镸D5是有限多個(gè)而原文是無限多個(gè)的。
這么說的話,感覺如果面試官問到的話,肯定回答的不是很好,反而不如先總結(jié)一下,然后再說出自己的理解。
關(guān)于MD5 你了解了么?