在介紹MD5原理前,先說(shuō)一些計(jì)算機(jī)基礎(chǔ)知識(shí)。
1.數(shù)組
數(shù)組是計(jì)算機(jī)存儲(chǔ)數(shù)據(jù)最原始的一種數(shù)據(jù)類(lèi)型。在日常生活照經(jīng)常會(huì)遇到??紤]如下一種情況:
A班級(jí)有13個(gè)學(xué)生,假設(shè)每個(gè)學(xué)生都有一個(gè)學(xué)號(hào),為了方便說(shuō)明,我們用0,1,2,3...12 對(duì)這13個(gè)學(xué)生進(jìn)行編號(hào)。
這其實(shí)就是一個(gè)最簡(jiǎn)單的數(shù)組,如下圖
如果我們用C#實(shí)現(xiàn)偽代碼,類(lèi)似如下:
這樣,如果需要獲取“學(xué)生5”的信息,直接用
數(shù)組下標(biāo)
students[5] 即可獲得學(xué)生信息。2.數(shù)據(jù)映射
在上面,利用數(shù)組存儲(chǔ)學(xué)生是好的,但是有缺陷,因?yàn)閿?shù)組是從0開(kāi)始的,如果班級(jí)里有4個(gè)學(xué)生,為6,7,9,12,可以看到學(xué)號(hào)不是從0開(kāi)始,而且又不連續(xù),
為了存儲(chǔ)四個(gè)學(xué)生,仍然需要開(kāi)辟13個(gè)存儲(chǔ)空間,這導(dǎo)致大量的空間被浪費(fèi)。
為此,可以采用算法壓縮空間。最容易想到的是取余數(shù)。
6,7,9,12共4個(gè)數(shù),也就意味著最多只要4個(gè)空間,所以,利用除法求余數(shù)計(jì)算位置。
我們小學(xué)學(xué)過(guò)的 6除以4等于1余2,寫(xiě)成6÷4=1...2,在計(jì)算機(jī)里通常使用/表示除法,用%表示求余數(shù)),所以可以得到
6%4=27%4=39%4=112%4=0
這樣,可以認(rèn)為學(xué)生學(xué)號(hào)x通過(guò)一個(gè)簡(jiǎn)單的函數(shù)y=f(x)映射轉(zhuǎn)換,就轉(zhuǎn)換為存儲(chǔ)位置。
3.不可逆
在上面映射里,你可能發(fā)現(xiàn)數(shù)據(jù)是可能沖突的,例如學(xué)生7和學(xué)生11經(jīng)過(guò)求余
7%4=311%4=3
兩個(gè)不同的學(xué)生經(jīng)過(guò)映射后,得到了同一個(gè)數(shù)字3,所以,根據(jù)3你推導(dǎo)不出學(xué)生的學(xué)號(hào)是7還是11.
更通俗的解釋為:a=2,b=8,那么 a+b=10,但是給你10,你推導(dǎo)不出a=2,b=8。因?yàn)閍,b可以有很多種組合。
在MD5加密里,經(jīng)常聽(tīng)到MD5是一種不可逆算法,如果我們把上面例子中,學(xué)生學(xué)號(hào)理解為密碼的明文,存儲(chǔ)地址理解為MD5加密的密文,就可能出現(xiàn):
MD5(123456)=e10adc3949ba59abbe56e057f20f883eMD5(abcdef)=e10adc3949ba59abbe56e057f20f883e
123456和abcdef 加密后,其密文一樣。
再想象一種情況:一個(gè)網(wǎng)站宣傳說(shuō)用戶登錄網(wǎng)站時(shí),密碼采用了MD5加密。這表示網(wǎng)站是把你的密碼加密后存放到SQL數(shù)據(jù)庫(kù)里。萬(wàn)一有一天黑客下載到了SQL數(shù)據(jù)庫(kù), 他可能看到
張三 e10adc3949ba59abbe56e057f20f883e 男 18歲李四 e10adc3949ba59abbe56e057f20f883e 男 20歲
這樣黑客雖然下載了數(shù)據(jù)庫(kù),但是仍然看不到用戶的密碼??梢宰畲笙薅葴p少用戶的損失。
這很重要,因?yàn)楹芏嘤脩襞侣闊?,他們的密碼設(shè)置都是一樣的,你登錄QQ的密碼通常和你登錄郵件的密碼是一樣的。 你的工行銀行取款密碼可能和農(nóng)行取款密碼也是一樣的!
3.哈希表
在上面介紹里,使用學(xué)生號(hào)作為學(xué)生編號(hào),但是,這種編號(hào)不容易人的讀取,一個(gè)最好的方式是使用“學(xué)生姓名”作為學(xué)生編號(hào)的標(biāo)志。這種“鍵-值”模式就是哈希表最原始的方式。
哈希表其實(shí)是Hash的音譯過(guò)來(lái)的。
假如對(duì)學(xué)生信息進(jìn)行存儲(chǔ)時(shí),采用的Hash函數(shù)為:
姓名的每個(gè)字的拼音開(kāi)頭大寫(xiě)字母的ASCII碼之和。
Hash(張三)=ASCII(Z)+ASCII(S)=90+83=173;Hash(李四)=ASCII(L)+ASCII(S)=76+83=159;Hash(王五)=ASCII(W)+ASCII(W)=87+87=174;Hash(張帥)=ASCII(Z)+ASCII(S)=90+83=173;
當(dāng)然,這種設(shè)計(jì)可能會(huì)有沖突, 例如張三和張帥的Hash值都是174,所以在構(gòu)造Hash函數(shù)時(shí)應(yīng)盡量考慮關(guān)鍵字的分布特點(diǎn)來(lái)避免沖突。
哈希函數(shù)也被成為散列函數(shù)。
4.MD5算法
這段話來(lái)自百科給的定義,文字很短,但是你一看到MD5的定義是:Hash函數(shù)、散列值基本上也就大致了解了MD5的意思了。
關(guān)于MD5的詳細(xì)算法很復(fù)雜,詳細(xì)見(jiàn)網(wǎng)上百科介紹。這里,我們可以自己定義一個(gè)自定義的MD5算法:
(1)姓名拼音的首字母(2)取首字母的ASCII碼(3)對(duì)ASCII 使用100求余。(4)因?yàn)橛鄶?shù)在0-99之間,要求余數(shù)必須是2位數(shù)字,如果不夠2位,則前面補(bǔ)0.
現(xiàn)在利用上面的1-4條,給你一個(gè)漢字“張”,和給你一段文本“今天是周幾”你都可以生成自定義的MD5,而且,不管是1個(gè)字還是100個(gè)字,其最終生成的密碼都是2位。
這就是MD5的壓縮性
任意長(zhǎng)度的數(shù)據(jù),其MD5值都固定是一個(gè)32位長(zhǎng)度的十六進(jìn)制字符串。
你能詳細(xì)出,全世界的文字是無(wú)限的,而32位固定長(zhǎng)度能存放的信息是有線的,所以,這就說(shuō)MD5力量上是可以破解的。
5.MD5的作用
對(duì)原數(shù)據(jù)做一丁點(diǎn)的改動(dòng),MD5值就會(huì)有巨大的變動(dòng),利用這個(gè)特性,可以對(duì)數(shù)據(jù)進(jìn)行保護(hù)。
例如:你編寫(xiě)了一個(gè)軟件讓用戶可以下載。此時(shí),你可以用“姓名+最后修改時(shí)間”作為MD5的明文進(jìn)行加密,然后把MD5公開(kāi)。
假如黑客獲取了你的軟件并且修改他,這就會(huì)導(dǎo)致最后修改時(shí)間的改變,只要數(shù)據(jù)有一點(diǎn)點(diǎn)變動(dòng),MD5就會(huì)出現(xiàn)巨大波動(dòng)。
當(dāng)你最終客戶下載軟件后,可以比較MD5,看看軟件本身的MD5和公布的MD5是否一樣,如果不一樣,就表示數(shù)據(jù)被修改過(guò)。
在很多網(wǎng)站里,都會(huì)提供MD5,下圖顯示的是Android Studio下載的頁(yè)面,其旁邊提供有MD5值
當(dāng)你下載好軟件后,可以在右鍵-屬性-數(shù)字簽名-高級(jí) 里看到其值。
備注:下面顯示的sha256加密,其作用和MD5一樣。
6.密碼對(duì)撞
雖然根據(jù)MD5無(wú)法推算出明文,但是黑客可以利用數(shù)據(jù)字典對(duì)撞破解密碼。什么意思呢?
我們以常規(guī)的密碼為例: 10個(gè)數(shù)字加上26個(gè)大小寫(xiě)字母,考慮密碼是區(qū)分大小寫(xiě)的,一共是 62個(gè)字符。
這樣,你登錄QQ,假設(shè)你的密碼為1位,那么總共只有62種可能,黑客通過(guò)MD5算把這62個(gè)情況都存儲(chǔ)起來(lái):
1 c4ca4238a0b923820dcc509a6f75849b2 c81e728d9d4c2f636f067f89cc14862c3 eccbc87e4b5ce2fe28308fd9f2a7baf3...Z 21c2e59531c8710156d34a3c30ac81d5
如前面所述,當(dāng)黑客獲取你數(shù)據(jù)庫(kù)里加密后的MD5后,他只要把你MD5密文和他的數(shù)據(jù)字典比較,就能獲取你的密碼明文。
獲取明文后,他就可以登錄你的QQ,登錄你的郵箱,像你的好友要錢(qián)等等。
也正因?yàn)榇?,很多系統(tǒng)在設(shè)計(jì)時(shí),通常有3個(gè)要求:(1)密碼至少6位 (2)密碼至少包含字母,數(shù)字,特殊字符 (3)登錄次數(shù)有限制,例如你登錄超過(guò)3次,系統(tǒng)自動(dòng)鎖定你的賬戶,禁止你再登錄。通過(guò)這3個(gè)辦法,防止黑客破解你的系統(tǒng)。
因?yàn)?,我們使用的密碼都是英文,很多用戶都喜歡用英語(yǔ)單詞作為密碼,熟不知英語(yǔ)詞典的那些單詞的MD5都被黑客算出來(lái)了,所以,設(shè)置自己密碼時(shí),應(yīng)該要包含字母和數(shù)字。
過(guò)去曾經(jīng)認(rèn)為MD5是不可破解的,但是一方面隨著超級(jí)計(jì)算機(jī)運(yùn)算速度越來(lái)越快,例如2018年最新公布的中國(guó)太湖之光計(jì)算機(jī),每秒運(yùn)算一千萬(wàn)億次,已經(jīng)有科學(xué)院成功破解了MD5,所以,對(duì)于保密性極強(qiáng)的系統(tǒng),已經(jīng)不采用MD5加密了,而采用安全性更高的sha256加密。但是對(duì)于普通小型網(wǎng)站,從運(yùn)算性能和安全綜合考量,仍多采用MD5加密。
7.密碼加鹽
在有些系統(tǒng)里,例如ATM取款機(jī),其密碼限制了只能使用0-9這10個(gè)數(shù)字,安全性降低了,為了提高安全,可以對(duì)密碼進(jìn)行加鹽。
秘密加鹽可以見(jiàn)到理解為對(duì)密碼二次加密。
因?yàn)锳TM初始密碼只能是0-9這10個(gè)數(shù)字,假如一個(gè)ATM取款密碼是123456,通過(guò)一個(gè)函數(shù)salt()對(duì)明文進(jìn)行簡(jiǎn)單加密,例如 salt(123456)=12!3ad。 然后再對(duì)加鹽后的密碼加密成MD5。 MD5(12!3ad)=e21bc87e4b5ce2fe2830w348fd9f2a7b,最后再把這個(gè)MD5存放到數(shù)據(jù)庫(kù)。
加鹽的主要目的,是讓密碼更難破解。
1.《md5是什么 什么是MD5算法?有何用?》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無(wú)關(guān),侵刪請(qǐng)聯(lián)系頁(yè)腳下方聯(lián)系方式。
2.《md5是什么 什么是MD5算法?有何用?》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。
3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來(lái)源地址,http://f99ss.com/keji/346990.html