【web_逆向04】MD5摘要算法

发布时间 2023-08-13 21:54:37作者: Tony_xiao

MD5是一个非常常见的摘要(hash)算法,其特点就是小巧. 速度快. 极难被破解。所以, md5依然是国内非常多的互联网公司选择的密码摘要算法

    1. 这玩意不可逆. 所以. 摘要算法就不是一个加密逻辑.
    1. 相同的内容计算出来的摘要应该是一样的
    1. 不同的内容(哪怕是一丢丢丢丢丢不一样)
# 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