MD5基本概念
MD5,即信息摘要算法,英文为MD5 Message-Digest Algorithm,是一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),也叫散列值,用于确保信息传输完整一致。
它可以从一个字符串或一个文件中按照一定的规则生成一个特殊的字符串,这个特殊的字符串就被称之为摘要。
MD5的作用
通常用于校验一组数据是否被篡改。例如,校验一个文件是否被篡改。
MD5特点及现状:
1)、hash值长度固定。它是一段固定长度的数据,即16个字节(128bit)。无论原始数据是多长或多短,其MD5值都是128bit。
2)、通常,计算出来的md5值包含0~9和大小写字母a ~ f, 以及A ~ F的32位可见字符。即将128bit的数据打印输出时,是一个32位的字符串。(因为直接输出16bytes的数据,是乱码,不可见)。
3)、hash值的确定性,一个原始数据的MD5值是唯一的,同一个原始数据不可能会计算出多个不同的MD5值。
4)、碰撞性,原始数据与其MD5值并不是一一对应的,有可能多个原始数据计算出来的MD5值是一样的,这就是碰撞。
5)、不可逆。即由已知的MD5值,无法还原出它的原始数据的。当然,很多网站可以查询md5的原始数据,是因为事先已经保存了数以万计的原始数据以及它的hash值,我们查询时,只是进行已知数据的查询匹配。
由于hash算法是不可逆的, 所以不存在解密的逻辑。
6)、不安全。由于md5无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。
7)、我国著名教授王小云已经破解了包括MD5、SHA-1在内的5个国际通用哈希函数算法。
MD5值的获取:
很多平台自带md5值的获取,例如,可以用下面的命令计算一个文件的md5值:
% md5 urlinfo.json
MD5 (urlinfo.json) = e58b910fda6a2aed3d00fde20a28c0a7
MD5值的获取:python代码:
1、 不加盐(salt)的md5值
利用python获取md5值的代码如下:
from hashlib import md5
obj = md5()
obj.update("hello python!!!".encode("utf-8"))
bs = obj.hexdigest()
print(bs)
运行结果:
% python3 md5_test.py
ffd986dc69195bd6c1397a76e0df6cc4
用在线网站进行md5值的获取:
可以看到,和我们用python算出的结果一样。
2、 加盐(salt)的md5值
from hashlib import md5
salt = "aabbccddeeff"
obj = md5(salt.encode("utf-8")) # 加盐
obj.update("hello python!!!".encode("utf-8"))
bs = obj.hexdigest()
print(bs)
运行结果:
% python3 md5_test.py
355d1341087e44f53551293193fd706c
3、 扩展sha256的md5值
from hashlib import sha1, sha256
sha = sha256(b'salt')
sha.update(b'hello python!!!')
print(sha.hexdigest())
运行结果:
python3 md5_test.py
24d50be77cb3d092520041983964d9f5daa8962c19f4fb6318bd2764406aab64
说明:不论是sha1, sha256, md5都属于摘要算法.,都是在计算hash值(散列值),只是散列的程度不同而已。