zoukankan      html  css  js  c++  java
  • hashlib 模块用来进行hash

    hashlib的基本概述:

      python中的 hashlib 模块用来进行hash 或者md5加密,而且这种加密是不可逆的,所以这种算法又被称为摘要算法,

    其支持Opennssl库提供的所有算法,包括 md5、sha1、sha224、sha256、sha512 等。

    hash是一种算法 是将一个任意长的数据 根据计算 得到一个固定长度特征吗

     特征:1、不同输入   可能会有相同的结果 几率特别小

        2、相同的输入 必然得到相同结果

        3、由于散列(特征)的性质 从原理来看是不可能 反解

        4、用来 验证   两个输入的数据是否一致

     使用场景

       1、密码验证

       2、验证数据是否被篡改  比如游戏安装包    有没有被改过

     为了防止别人撞库成功  可用提升密码的复杂度   其次可以为密码加盐(加点内容进去)

    ps:撞库破解的原理  把常见的 明文和密文的对应关系 存到了数据库中  运气好就能查询到

    常用的属性方法

      algorithms : 列出所有加密算法

      digesti——size: 产生的散列的字节大小

      md5()/sha1() :创建一个 md5 或者 sha1加密模式的hash 对象

      update(arg) :用字符串参数来更新hash对象,如果同一个has对象重复调用该方法,如下:m.update(a); m.update(b), 则等于m.update(a+b)

      digest() : 返回摘要,作为二进制数据字符串值

      hexdigest() : 返回摘要,作为十六进制数据字符串值

      copy() :复制

    下面是一个简单的实例:

    import  hashlib
    m = hashlib.md5("aaa".encode("utf-8"))
    print(m.hexdigest())

    结果如下:

    47bce5c74f589f4867dbd57e9ca9f808

     

    下面是一个简单的加盐实例:

    import  hashlib
    
    m = hashlib.md5("321".encode("utf-8"))
    #
    m.update("abcdefplkjoujhh".encode("utf-8"))
    
    print(m.hexdigest())

    结果如下:

    7da0befdd8fd811dd0716941c38c0111

    关于hmac 的实例:

    import hmac
    # 与hashlib 没啥区别 只是在创建的时候必须加盐
    h = hmac.new("abcdefjjjj".encode("utf-8"))
    
    h.update("123".encode("utf-8"))
    
    print(h.hexdigest())

    结果如下:

    944b3523fac69f32f6d399a11707da8b

    如何产生hash值的三个阶段:

    import hashlib
    # # ######## sha256 ########
    # # 1、造出hash工厂
    hash = hashlib.sha256('12345ds232'.encode('utf8'))     #同一种hash算法得到的长度是固定的
    # # 2、运送原材料
    hash.update('alvin'.encode('utf8'))                     #工厂传入的原材料都是bytes类型
    # # 3、产出hash值
    print(hash.hexdigest())                     #结果:0f63932f6e2b2d1e0d9c2d50f0e9d39b79da78a5048a6d054d7f9c27d1a8761a

    效验文件的一致性(如何保证下载的文件过程中不丢包,保证数据的完整性!):

    # -----------文件一致校验----------------
    '''可以拷贝一个文件放在两个不同的盘中,然后通过判断两个文件的hash值是否相等,判断两个文件是否是同一个文件'''
    import hashlib
    m = hashlib.md5()
    with open(r'F:oldboy课程记录目录创建函数.py','rb') as f:
        for line in f:
            m.update(line)
    print(m.hexdigest())          #18b6754864943d03b5b2aedacb449466
    
    import hashlib
    m = hashlib.md5()
    with open(r'F:oldboy课程记录购物车练习.py','rb') as f:
        for line in f:
            m.update(line)
    print(m.hexdigest())           #8e63f67a0049d1fc583a5c2bbf6cf3a8

    对密码进行加盐(加密):

    # 应用:对明文密码进行加密(暴力破解-------用明文密码用一种算法算出一个hash值,与截取的hash值进行比对,比对成功说明明文密码一致,就可以破解用户的密码)
    '''如用户在某网站进行注册信息,这个时候防止信息被恶意拦截获取,可以对用户明文密码进行加密,存成hash值得形式,这样用户每次登陆虽然输的是明文密码,校验hash值即可'''
    #未加密
    password=input('>>>>>:').strip()
    import hashlib
    m=hashlib.md5()
    m.update(password.encode('utf-8'))
    print(m.hexdigest())             #00dcbdaede875d5e23f1f9f64c7849ef
    
    
    # 对密码进行加盐(暗号)----------进一步加强密码的安全性
    password=input('>>>>>:').strip()
    import hashlib
    m=hashlib.md5()
    m.update('一行白鹭上青天'.encode('utf-8'))         #对密码加盐
    m.update(password.encode('utf-8'))
    print(m.hexdigest())  

    hmac模块的加密方式,与hashlib差不多:

    '''python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 进行进一步的处理然后再加密:'''
    import hmac
    h = hmac.new('天王盖地虎'.encode('utf8'))          #hmac必须要加盐
    h.update('hello'.encode('utf8'))
    print(h.hexdigest())                 #1abaae8f65f68f2695a8545c5bc8e738
    
    #要想保证hmac最终结果一致,必须保证:
    #1:hmac.new括号内指定的初始key一样
    #2:无论update多少次,校验的内容累加到一起是一样的内容
    
    # 下面单重方式得到的结果是一样的
    import hmac
    h1=hmac.new(b'tom')          #初始值必须保证一致,最终得到的结果就会不一样
    h1.update(b'hello')
    h1.update(b'world')
    print(h1.hexdigest())
    
    h2=hmac.new(b'tom')         #初始值必须保证一致,最终得到的结果就会不一样
    h2.update(b'helloworld')
    print(h2.hexdigest())
    
    h3=hmac.new(b'tomhelloworld')   #初始值不一样,所以与上面两种的结果不一样
    print(h3.hexdigest())

    结果如下:

    0426ccec3b134e8c18fdcefee841ef25
    0426ccec3b134e8c18fdcefee841ef25
    ff1214d895bbaf5f1847db4ebae8212e

    破解用户的密码

    # 重点
    '''模拟撞库破解密码'''
    import hashlib
    passwds=[                      #可以通过random实现对passwds中的内容
        'alex3714',
        'alex1313',
        'alex94139413',
        'alex123456',
        '123456alex',
        'a123lex',
        ]
    
    def make_passwd_dic(passwds):                #通过明文密码列表,造出与之对应的hash值得字典
        dic={}
        for passwd in passwds:
            m=hashlib.md5()                      #使用md5算法,造了一个工厂
            m.update(passwd.encode('utf-8'))     #给工厂运送原材料(即我们要加密的内容)
            dic[passwd]=m.hexdigest()            #产出hash值(即最终的产品),将其加入到我们事先造好的空字典中,字典形式:{密码:hash值}
        return dic
    
    def break_code(cryptograph,passwd_dic):      #判断拦截的hash值是否与字典中事先造好的hash值相等,相等则说明成功进行破解
        for k,v in passwd_dic.items():
            if v == cryptograph:
                print('密码是===>33[46m%s33[0m' %k)
    
    cryptograph='aee949757a2e698417463d47acac93df'     #我们拦截拿到的密码,经过加密的hash值
    break_code(cryptograph,make_passwd_dic(passwds))   #将要破解的密码hash值,和事先造好的hash的字典当做函数的实参传给对应的形参
  • 相关阅读:
    Eclipse背景颜色设置
    SQL ROW_NUMBER() OVER函数的基本用法用法
    hdu 2844 Coins 多重背包问题
    VC++学习/MFC (1)
    java学习 (1)
    hdu 1506 City Game 二维的多重背包
    java学习(2)
    VC++学习/MFC (2)
    hdu 1506 Largest Rectangle in a Histogram
    hdu 1171 Big Event in HDU
  • 原文地址:https://www.cnblogs.com/TF511/p/9818605.html
Copyright © 2011-2022 走看看