md5是什么
那么到底什么是MD5呢?是加密算法嗎?不是的,md5是一種信息摘要算法,它可以從一個(gè)字符串或一個(gè)文件中按照一定的規(guī)則生成一個(gè)特殊的字符串(這個(gè)特殊的字符串就被稱之為摘要,我理解就是從文件中摘一些信息片段加工而來),并且一個(gè)文件所對應(yīng)的MD5摘要是固定的,當(dāng)文件內(nèi)容變化后,其MD5值也會(huì)不一樣(雖然理論上來說也有可能會(huì)一樣,但概率極小),因此,在應(yīng)用中經(jīng)常使用MD5值來驗(yàn)證一段數(shù)據(jù)有沒有被篡改。
比如,在數(shù)據(jù)的發(fā)送方將原始數(shù)據(jù)生成出MD5值,然后把原始數(shù)據(jù)連同其MD5值一起傳給接收方,接收該收到數(shù)據(jù)后,先將原始數(shù)據(jù)用MD5算法生成摘要信息,然后再將此摘要信息與發(fā)送方發(fā)過來的摘要信息進(jìn)行比較,如果一致就認(rèn)為原始數(shù)據(jù)沒有被修改,否則原始數(shù)據(jù)就是被修改過了。
MD5值有幾個(gè)特點(diǎn):
1、它是一段固定長度的數(shù)據(jù),即128bit的由“0”和“1”組成的一段二進(jìn)制數(shù)據(jù)。無論原始數(shù)據(jù)是多長或多短,其MD5值都是128bit。
2、通常(或者叫行業(yè)規(guī)定),這段128bit的數(shù)據(jù),按4bit一組分成32組,每一組按16進(jìn)制來計(jì)算其值,并以字符的形式輸出每個(gè)值。比如一組數(shù)據(jù)按16進(jìn)制計(jì)算出來的值是0-9,打印出來也是0-9,如果計(jì)算出來的值是a-f,如果直接打印的話將會(huì)是10-15,在java中可以使用String.format("%02x", bytes[i])方法來將16進(jìn)制的 a-f 打印成字母“a-f”,最終這個(gè)128bit的數(shù)據(jù)將會(huì)被打印成一個(gè)32位的字符串。所以我們通常所說的MD5值就是指這串32位的由“0-9,a-f”所組成的字符串。如果你看到某個(gè)MD5不是32位,或發(fā)現(xiàn)其中含有“0~f”之外的字符,那肯定是個(gè)錯(cuò)誤的MD5值。
3、確定性,一個(gè)原始數(shù)據(jù)的MD5值是唯一的,同一個(gè)原始數(shù)據(jù)不可能會(huì)計(jì)算出多個(gè)不同的MD5值。
4、碰撞性,原始數(shù)據(jù)與其MD5值并不是一一對應(yīng)的,有可能多個(gè)原始數(shù)據(jù)計(jì)算出來的MD5值是一樣的,這就是碰撞。
5、不可逆。也就是說如果告訴你一個(gè)MD5值,你是無法通過它還原出它的原始數(shù)據(jù)的,這不是你的技術(shù)不夠牛,這是由它的算法所決定的。因?yàn)楦鶕?jù)第4點(diǎn),一個(gè)給定的MD5值是可能對應(yīng)多個(gè)原始數(shù)據(jù)的,并且理論上講是可以對應(yīng)無限多個(gè)原始數(shù)據(jù),所有無法確定到底是由哪個(gè)原始數(shù)據(jù)產(chǎn)生的。