MD5是一種單向的加密算法,本身會(huì)丟失原始信息,并不能用于數(shù)據(jù)傳輸?shù)募咏饷埽诰W(wǎng)絡(luò)通信中卻有一席之地,如微信支付中用于簽名算法。
MD5的5大特征
1. 輸出值的數(shù)據(jù)長度不變
無論輸入數(shù)據(jù)大小,輸出總是128位的信息,一般用16進(jìn)制顯示。
2. 相同的輸入,最后的輸出總是相同
3. 相似的輸入,哪怕1bit的不同,會(huì)導(dǎo)致輸出有很大的不同
| 原文 | 123456 | 123455 |
|---|---|---|
| MD5值 | e10adc3949ba59abbe56e057f20f883e | 00c66aaf5f2c3f49946f15c1ad2ea0d3 |
4. 完全不同的數(shù)據(jù),輸出可能相同,但概率很低
這個(gè)概率有多小,形象的描述是“比連續(xù)中500萬年500萬大獎(jiǎng)的概率還小”,相當(dāng)于幾十億臺(tái)電腦中有幾十億個(gè)文件,才有可能相同,一般的數(shù)據(jù)表完全不用考慮這個(gè)問題。
5. 通過MD5值無法獲取原輸入
MD5是單向算法,無法獲得原始值,但現(xiàn)在有解密平臺(tái)保留了很多常見值的加密值,當(dāng)量到一定范圍時(shí),相當(dāng)于可以從MD5查詢出原值。
MD5的應(yīng)用
鑒別信息是否被修改
利用MD5的特性2和3,在網(wǎng)絡(luò)傳輸中,將接收到的數(shù)據(jù)做MD5運(yùn)算,如果MD5值不匹配,則認(rèn)為數(shù)據(jù)被篡改。
哈希表
利用MD5的穩(wěn)定性和分散性,可以在數(shù)組結(jié)構(gòu)中獲得一張“平衡”的表,以加快查找數(shù)據(jù)的速度。
用Swift計(jì)算MD5
func MD5(string: String) -> Data {
let messageData = string.data(using:.utf8)!
var digestData = Data(count: Int(CC_MD5_DIGEST_LENGTH))
_ = digestData.withUnsafeMutableBytes {digestBytes in
messageData.withUnsafeBytes {messageBytes in
CC_MD5(messageBytes, CC_LONG(messageData.count), digestBytes)
}
}
return digestData
}
調(diào)用
let md5Data = MD5(string:"123456")
let md5Hex = md5Data.map { String(format: "%02hhx", $0) }.joined()
print("md5Hex: \(md5Hex)")
擴(kuò)展
MD5算法只是哈希算法中的一種,常見的還有 MD4,SHA-0, SHA-1,SHA-2。在安全要求更高的場景中,推薦SHA-2算法。