无法解密的加密算法-MD5

MD5是一种单向的加密算法,本身会丢失原始信息,并不能用于数据传输的加解密,在网络通信中却有一席之地,如微信支付中用于签名算法。

MD5的5大特征

1. 输出值的数据长度不变

无论输入数据大小,输出总是128位的信息,一般用16进制显示。

2. 相同的输入,最后的输出总是相同

3. 相似的输入,哪怕1bit的不同,会导致输出有很大的不同

原文 123456 123455
MD5值 e10adc3949ba59abbe56e057f20f883e 00c66aaf5f2c3f49946f15c1ad2ea0d3

4. 完全不同的数据,输出可能相同,但概率很低

这个概率有多小,形象的描述是“比连续中500万年500万大奖的概率还小”,相当于几十亿台电脑中有几十亿个文件,才有可能相同,一般的数据表完全不用考虑这个问题。

5. 通过MD5值无法获取原输入

MD5是单向算法,无法获得原始值,但现在有解密平台保留了很多常见值的加密值,当量到一定范围时,相当于可以从MD5查询出原值。

MD5的应用

鉴别信息是否被修改

利用MD5的特性2和3,在网络传输中,将接收到的数据做MD5运算,如果MD5值不匹配,则认为数据被篡改。

哈希表

利用MD5的稳定性和分散性,可以在数组结构中获得一张“平衡”的表,以加快查找数据的速度。

用Swift计算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
}

调用

let md5Data = MD5(string:"123456")
let md5Hex =  md5Data.map { String(format: "%02hhx", $0) }.joined()
print("md5Hex: \(md5Hex)")

扩展

MD5算法只是哈希算法中的一种,常见的还有 MD4,SHA-0, SHA-1,SHA-2。在安全要求更高的场景中,推荐SHA-2算法。

你可能感兴趣的:(无法解密的加密算法-MD5)