無法解密的加密算法-MD5

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算法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容