• hashlib模块


    hashlib模块

    1、什么叫hash:
    hash是一种算法(3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法)
    ,该算法接受传入
    的内容,
    经过运算得到一串hash值

    2、hash值的特点是: 2.1 只要传入的内容一样,得到的hash值必然一样=====>要用明文传输密码文件完整性校验 2.2 不能由hash值返解成内容=======》把密码做成hash值,不应该在网络传输明文密码 2.3 只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的

    hash算法就像一座工厂,工厂接收你送来的原材料(可以用m.update()为工厂运送原材料),经过加工返回的产品就是hash值
    import hashlib
    
    m = hashlib.md5()
    n = hashlib.sha256()
    
    m.update('hello'.encode('utf8'))
    n.update('lebron'.encode('utf8'))
    print(m.hexdigest())  # 5d41402abc4b2a76b9719d911017c592
    print(n.hexdigest())  # 6d7cd4295692cf696d5c12504732e7a25a094ac5bca5d847ae1e5f8bc02170a6
    
    m.update('alvin'.encode('utf8'))
    n.update('james'.encode('utf8'))
    
    print(m.hexdigest())  # 92a7e713c30abbb0319fa07da2a5c4af
    print(n.hexdigest())  # 53c6727fe96170f5eb8dac4d64400405a64560926812de390f8905b0c48121c2
    
    m2 = hashlib.md5()
    n2 = hashlib.sha256()
    m2.update('helloalvin'.encode('utf8'))
    n2.update('lebronjames'.encode('utf8'))
    print(m2.hexdigest())  # 92a7e713c30abbb0319fa07da2a5c4af
    print(n2.hexdigest())  # 53c6727fe96170f5eb8dac4d64400405a64560926812de390f8905b0c48121c2

    注意:

    把一段很长的数据update多次,与一次update这段长数据,得到的结果一样。但是update多次为校验大文件提供了可能。

     
    
    
    
    以上加密算法虽然依然非常厉害,但时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密。
    import hashlib
    
    hash = hashlib.sha256('most_valueble_player'.encode('utf8'))
    hash.update('lebronjames'.encode('utf8'))
    print(hash.hexdigest())  #76094d5056575dff10eac71410e53856a81f5a96b6941063c5664bff84308874
    
    
    
    模拟撞库破解密码
    import hashlib
    user = {
        'lebron': 'l4332',
        'curry': 'c2031',
        'geoger': 'g0001',
        'ben': 'b0000',
        'kyrie': 'k0011',
        'lenard': 'l0110',
        'davis': 'd0002',
        'durant': 'd1222'
    }
    
    def en_code():
        passwd = {}
        for i in user:
            n = hashlib.md5()
            n.update(user[i].encode('utf8'))
            passwd[i] = n.hexdigest()
        return passwd
    
    def puch(code):
        for k, v in passwds.items():
            if code == v:
                print('用户名和密码', k, user[k])
    
    passwds = en_code()
    puch('1718794aea266e41ab3d00875956f46e')
    
    #用户名和密码 lebron l4332
    
    
    
    python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 进行进一步的处理然后再加密:
    import hmac
    
    h = hmac.new('mvp'.encode('utf8'))
    h.update('lebron'.encode('utf8'))
    
    print(h.hexdigest())  # 68f359933ed131e4e7f71af399f6e9d4
    
    
    注意点:
    import hmac
    
    h1 = hmac.new(b'lebron')
    h1.update(b'james')
    h1.update(b'mvp')
    print(h1.hexdigest())
    
    h2 = hmac.new(b'lebron')
    h2.update(b'jamesmvp')
    print(h2.hexdigest())
    
    h3 = hmac.new(b'lebronjamesmvp')
    print(h3.hexdigest())
    
    '''
    ebad7f8cd8f08189f2cf1981111ae774
    ebad7f8cd8f08189f2cf1981111ae774
    bbac8491cfc096a66a51288fa106d1be
    '''
    
    
    





     
  • 相关阅读:
    ssh密钥讲解
    Python之paramiko模块
    Python之socket编程进阶版
    linux内socket服务器无法连接windows
    Python之socket编程
    linux(centOS7,mini),python环境的搭建
    Python 之异常处理机制
    pytho常用模块2——random
    Hadoop基础(二):从Hadoop框架讨论大数据生态
    Hadoop基础(一):概论
  • 原文地址:https://www.cnblogs.com/cjsword/p/10550762.html
Copyright © 2020-2023  润新知