一、什么是MD5
MD5 (Message Digest Algorithm 5拌屏,消息摘要算法第五版)為計(jì)算機(jī)安全領(lǐng)域廣泛使用的一種散列函數(shù)
MD5的功能,簡(jiǎn)單而言暖哨,是將一段明文作為輸入肌厨,輸出一串固定長(zhǎng)度的字符串培慌,即此段明文的簽名(或摘要),并保證輸入不同的明文柑爸,其輸出的簽名截然不同(有極低概率失效)吵护。
二、MD5算法
MD5的算法可以簡(jiǎn)述如下:
- 若明文長(zhǎng)度不是512位的整數(shù)倍表鳍,則填充字符至滿足此條件馅而,然后將明文按512位的長(zhǎng)度分塊
- 設(shè)置128位的初始秘鑰,一般使用算法庫默認(rèn)值譬圣,按照順序?qū)σ粔K數(shù)據(jù)進(jìn)行非線性運(yùn)算瓮恭,生成一個(gè)128位的結(jié)果,作為下一次計(jì)算的輸入部分厘熟,依次迭代屯蹦,直到最后輸出一個(gè)128位的簽名
三、代碼實(shí)現(xiàn)
現(xiàn)有主流語言都有對(duì)應(yīng)的MD5實(shí)現(xiàn)绳姨,在Python中Demo如下:
import hashlib
# 待加密信息
text = 'hello world'
# 創(chuàng)建md5對(duì)象
md5 = hashlib.md5()
#更新hash對(duì)象的值
md5.update(text.encode("utf-8"))
print('MD5 sign=:' + md5.hexdigest())
四登澜、實(shí)際應(yīng)用
情景1:服務(wù)器端密碼存儲(chǔ)
很久前安全意識(shí)還很淡薄,不少服務(wù)器密碼是明文保存于數(shù)據(jù)庫中的飘庄。一旦攻擊者成功入侵到數(shù)據(jù)庫帖渠,就直接取得賬號(hào)和密碼
隨著時(shí)間發(fā)展,開發(fā)者認(rèn)識(shí)到密碼明文保存的脆弱性竭宰,采用加密保存密碼。此階段不存儲(chǔ)用戶的原始密碼份招,而是存儲(chǔ)其密碼的簽名切揭。用戶登錄時(shí)只需要計(jì)算其輸入密碼的簽名與服務(wù)器端保存的簽名是否一致即可。這樣锁摔,即使泄露了簽名值廓旬,攻擊者也無法直接得到原始的密碼
情景2:消息防篡改
上面MD5的算法中初始由算法默認(rèn)設(shè)置。如果直接使用的話谐腰,是不安全的孕豹。比如我發(fā)送一段消息,并將其MD5簽名發(fā)送出去十气。但是被第三方攔截了励背,他修改了消息,重新進(jìn)行MD5簽名砸西。那么接收方無法判斷其是否消息是否被修改了
一般而言叶眉,是發(fā)送方和接收方一同約定一個(gè)密鑰址儒,在發(fā)送消息是將密鑰加在消息中進(jìn)行簽名。第三方?jīng)]有密鑰衅疙,重新生成的簽名是不同的
此外莲趣,有的時(shí)候會(huì)在消息后面加上一無意義的隨機(jī)字符串,是得生成的MD5更加隨機(jī)饱溢,不易被破解
參考鏈接
MD5算法原理介紹與C++實(shí)現(xiàn)
信息摘要算法之一:MD5算法解析及實(shí)現(xiàn)
Python 中 MD5 加密
談?wù)劽艽a安全:服務(wù)端密碼保存