一、什么是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位的初始秘鑰,一般使用算法庫(kù)默認(rèn)值,按照順序?qū)σ粔K數(shù)據(jù)進(jìn)行非線性運(yùn)算,生成一個(gè)128位的結(jié)果,作為下一次計(jì)算的輸入部分,依次迭代,直到最后輸出一個(gè)128位的簽名
三、代碼實(shí)現(xiàn)
現(xiàn)有主流語(yǔ)言都有對(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ù)庫(kù)中的。一旦攻擊者成功入侵到數(shù)據(jù)庫(kù),就直接取得賬號(hào)和密碼
隨著時(shí)間發(fā)展,開(kāi)發(fā)者認(rèn)識(shí)到密碼明文保存的脆弱性,采用加密保存密碼。此階段不存儲(chǔ)用戶的原始密碼,而是存儲(chǔ)其密碼的簽名。用戶登錄時(shí)只需要計(jì)算其輸入密碼的簽名與服務(wù)器端保存的簽名是否一致即可。這樣,即使泄露了簽名值,攻擊者也無(wú)法直接得到原始的密碼
情景2:消息防篡改
上面MD5的算法中初始由算法默認(rèn)設(shè)置。如果直接使用的話,是不安全的。比如我發(fā)送一段消息,并將其MD5簽名發(fā)送出去。但是被第三方攔截了,他修改了消息,重新進(jìn)行MD5簽名。那么接收方無(wú)法判斷其是否消息是否被修改了
一般而言,是發(fā)送方和接收方一同約定一個(gè)密鑰,在發(fā)送消息是將密鑰加在消息中進(jìn)行簽名。第三方?jīng)]有密鑰,重新生成的簽名是不同的
此外,有的時(shí)候會(huì)在消息后面加上一無(wú)意義的隨機(jī)字符串,是得生成的MD5更加隨機(jī),不易被破解
參考鏈接
MD5算法原理介紹與C++實(shí)現(xiàn)
信息摘要算法之一:MD5算法解析及實(shí)現(xiàn)
Python 中 MD5 加密
談?wù)劽艽a安全:服務(wù)端密碼保存