MD5是一个非常常见的摘要(hash)算法,其特点就是小巧. 速度快. 极难被破解。所以, md5依然是国内非常多的互联网公司选择的密码摘要算法
-
- 这玩意不可逆. 所以. 摘要算法就不是一个加密逻辑.
-
- 相同的内容计算出来的摘要应该是一样的
-
- 不同的内容(哪怕是一丢丢丢丢丢不一样)
# python的内置模块hashlib中提供了md5计算
from hashlib import md5, sha1, sha512
ming = "i love you"
# md5() 创建出来的对象是一次性的...
obj = md5()
#
# 传递进去的必须是字节
obj.update(ming.encode("utf-8"))
# 查看结果
ret = obj.hexdigest()
print(ret) # 459b9511a7f650ebd327889c45cc4e9b
# 注意点===》》》md5()对象是一次性的,如果继续update,相当于叠加字符串了
# 接着上次的update继续update
obj.update(ming.encode("utf-8")) # "i love youi love you"
print(obj.hexdigest()) # b0ce1e6afaf0ee351d8698ea41a1655e
obj2 = md5()
obj2.update("i love youi love you".encode("utf-8"))
print(obj2.hexdigest()) # b0ce1e6afaf0ee351d8698ea41a1655e
小功能,md5加密后是32位字符,也可以是字节
obj = md5()
ret = obj.update("i love you".encode("utf-8"))
print(obj.hexdigest()) # 十六进制的数字 459b9511a7f650ebd327889c45cc4e9b
print("=>", obj.digest()) # 字节 => b"E\x9b\x95\x11\xa7\xf6P\xeb\xd3'\x88\x9cE\xccN\x9b"
#
# # md5的值固定是32位字符串
print(len("459b9511a7f650ebd327889c45cc4e9b"))
#
# 十六进制. 0-9a-f
# 459b9511a7f650ebd327889c45cc4e9b
# 多少个字节.
# 字节
# 1个字节 => 8个01 => 1111 1111 => 255 => 2位十六进制 FF
# md5是32位16进制 => 16个字节.
#
s = "459b9511a7f650ebd327889c45cc4e9b"
import binascii # 内置模块. 专们用来处理.字节和数字之间的关系
bs = binascii.a2b_hex(s) # 把十六进制字符串转化成字节
print(bs) # b"E\x9b\x95\x11\xa7\xf6P\xeb\xd3'\x88\x9cE\xccN\x9b"
撞库与加盐
- 上面我们一直在说,md5加密是不可逆的;
- 但是我在网页上找到md5解密网站,有时候是可以被"解密"出来的;
- 但其实不然. 这里并不是直接解密MD5. 而是"撞库". 就是它网站里存储了大量的MD5的值. 然后去匹配;
- 如何避免撞库: md5在进行计算的时候可以加盐. 加盐之后. 就很难撞库了.
from hashlib import md5
salt = "我是盐.把我加进去就没人能破解了"
obj = md5(salt.encode("utf-8")) # 加盐
obj.update("xwl".encode("utf-8"))
bs = obj.hexdigest()
print(bs)
碰到md5加密怎么办?
- 首先判断是否为标准的md5加密
- 只要某算法的
123456
计算的结果是 e10adc. 就是标准的md5
- 只要某算法的