zoukankan      html  css  js  c++  java
  • hashlib模块

    hashlib模块

    1 哈希hash的定义

    hash一类算法,该算法接受传入的内容,经过运算得到一串hash值

    2 hash值的特点

    ①只要传入的内容一样,得到的hash值必然一样
    ②不能由hash值返解成内容
    ③不管传入的内容有多大,只要使用的hash算法不变,得到的hash值长度是一定

    3 hash的用途

    用途1:特点②用于密码密文传输与验证
    用途2:特点①,③用于文件完整性校验

    4 hashlib模块的使用

    4.1 密码密文传输与验证

    import hashlib
    
    m=hashlib.md5()							# 创建一个工厂
    m.update('hello'.encode('utf-8'))		# 输入原料
    m.update('world'.encode('utf-8'))		# 输入原料
    res=m.hexdigest() # 'helloworld'		# 得到结果
    print(res)
    # fc5e038d38a57032085441e7fe7010b0
    
    m1=hashlib.md5('he'.encode('utf-8'))
    m1.update('llo'.encode('utf-8'))
    m1.update('w'.encode('utf-8'))
    m1.update('orld'.encode('utf-8'))
    res=m1.hexdigest()# 'helloworld'
    print(res)
    # fc5e038d38a57032085441e7fe7010b0
    # 注意:把一段很长的数据update多次,与一次update这段长数据,得到的结果一样
    # 但是update多次为校验大文件提供了可能。
    

    以上加密算法虽然依然非常厉害,但有时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。

    # 模拟撞库
    cryptograph='aee949757a2e698417463d47acac93df'
    import hashlib
    
    # 制作密码字段
    passwds=[
        'alex3714',
        'alex1313',
        'alex94139413',
        'alex123456',
        '123456alex',
        'a123lex',
    ]
    
    dic={}
    for p in passwds:
        res=hashlib.md5(p.encode('utf-8'))
        dic[p]=res.hexdigest()
    
    # 模拟撞库得到密码
    for k,v in dic.items():
        if v == cryptograph:
            print('撞库成功,明文密码是:%s' %k)
            break
    
    # 提升撞库的成本=>密码加盐
    # 需要撞库得到加的盐以及加的位置才能破解
    import hashlib
    
    m=hashlib.md5()
    
    m.update('天王'.encode('utf-8'))
    m.update('alex3714'.encode('utf-8'))
    m.update('盖地虎'.encode('utf-8'))
    print(m.hexdigest())
    

    4.2 文件完整性校验

    import hashlib
    
    m=hashlib.md5()
    m.update('文件所有的内容')
    m.hexdigest()
    # 内存以及速度问题
    
    import hashlib
    
    m=hashlib.md5()	
    with open('a.txt',mode='rb') as f:
        for line in f:
            m.update(line)
    res = m.hexdigest()
    print(res)
    # 速度问题
    
    
    # 一般采用定点抽查,在某几个点抽一段进行比较
    
    f.read(2000) 
    
    
  • 相关阅读:
    Go使用dlv调试代码
    1660 super安装tensorflow1.15
    SQL Server高级进阶之表分区删除
    SQL Server高级进阶之分区表创建
    SQL Server高级进阶之索引优化查询
    SQL Server高级进阶之索引碎片维护
    C# WinForm通用自动更新器
    获取当前月第一天,当前月最后一天,上个月日期,上个月的第一天
    去除checkbox选择的三种方式
    用SpringBoot实现策略模式
  • 原文地址:https://www.cnblogs.com/achai222/p/12610114.html
Copyright © 2011-2022 走看看