美文网首页
hashlib和hmac

hashlib和hmac

作者: 一片冰心一生平安 | 来源:发表于2018-06-20 15:00 被阅读0次

    hashlib


    1.普通加密及在加密算法中添加自定义key再来做加密

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    
    import hashlib
    
    a = "I am a boy".encode('utf-8')
    print(hashlib.md5(a).hexdigest())
    print(hashlib.sha1(a).hexdigest())
    print(hashlib.sha224(a).hexdigest())
    print(hashlib.sha256(a).hexdigest())
    print(hashlib.sha384(a).hexdigest())
    print(hashlib.sha512(a).hexdigest())
    
    low = hashlib.md5()
    low.update(a)
    res = low.hexdigest()
    print("普通加密:", res)
    
    high = hashlib.md5(b'zidingyi')
    high.update('this is a test'.encode('utf-8'))
    res = high.hexdigest()  # 使用一个 32 位的 16 进制字符串表示
    print("采用key加密:", res)
    
    

    2.处理大文件

    2.1 先看如下代码,分开处理的结果是一样的:
    import hashlib
    x = hashlib.md5()
    x.update('hello, '.encode('utf-8'))
    x.update('python'.encode('utf-8'))
    x.hexdigest()
    Out[3]: 'fb42758282ecd4646426112d0cbab865'
    hashlib.md5('hello, python'.encode('utf-8')).hexdigest()
    Out[4]: 'fb42758282ecd4646426112d0cbab865'
    
    # 重复的调用等同于一次调用所有数据的组合
    # 对于较大文件可以采取多次传输(多次调用update(bytes_obj)),这和一次性计算得到的hash值是一样的
    
    2.2 所以,借上面的思想写了如下代码:
    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    
    import hashlib
    import os
    
    
    def get_file_md5(file_name):
        if not os.path.isfile(file_name):  # 如果校验md5的文件不是文件,返回空
            return
        m = hashlib.md5()
        with open(file_name, 'rb') as f:
            while True:
                data = f.read(1024)
                if not data:
                    break
                m.update(bytes(data))
        return m.hexdigest()
    
    
    f = b'/root/learn_python/check_proc.sh'
    file_md5 = get_file_md5(f)
    
    print(file_md5)
    
    


    hmac

    HMAC 是用于消息认证的加密哈希算法,全称是 keyed-Hash Message Authentication Code。HMAC 利用哈希算法,以一个密钥和一个消息作为输入,生成一个加密串作为输出。HMAC 可以有效防止类似 MD5 的彩虹表等攻击,比如将常见密码的 MD5 值存入数据库,可能被反向破解。
    如果文件较大可以进行多次update(byte_obj)操作

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    
    # Repeated calls are equivalent to a single call with the concatenation of all the arguments:
    # m.update(a); m.update(b) is equivalent to m.update(a + b).
    
    # https://docs.python.org/3/library/hashlib.html
    # https://docs.python.org/3.6/library/hmac.html
    
    import hashlib
    import hmac
    
    # More condensed:
    x1 = hashlib.md5(b'hello, python').hexdigest()
    print(x1)
    # print(x1.hexdigest())
    
    # Repeated calls:
    x2 = hashlib.md5()
    x2.update('hello, python'.encode('utf-8'))
    print(x2.hexdigest())
    
    x3 = hashlib.md5()
    x3.update('hello, py'.encode('utf-8'))
    x3.update('thon'.encode('utf-8'))
    print(x3.hexdigest())
    
    # 以上加密算法虽然很厉害,但仍然存在缺陷,通过撞库可以反解。所以必要对加密算法中添加自定义key再来做加密。
    x2 = hashlib.md5(b'mykey')
    x2.update('hello, python'.encode('utf-8'))
    print(x2.hexdigest())
    
    # HMAC 可以有效防止类似 MD5 的彩虹表等攻击,比如将常见密码的 MD5 值存入数据库,可能被反向破解。
    msg = b'hello, python'
    key = b'mykey'
    h = hmac.new(key, msg, digestmod='sha256')
    h1 = h.hexdigest()
    print(h1)
    
    myhmac = hmac.new(key=b'mykey', digestmod='sha256')
    myhmac.update(b'hello, ')
    myhmac.update(b'python')
    myhmac1 = myhmac.hexdigest()
    print(myhmac1)
    print(hmac.compare_digest(h1, myhmac1))
    
    
    ssh://root@192.168.5.29:22/usr/bin/python3 -u /root/python_code/10-work.py
    fb42758282ecd4646426112d0cbab865
    fb42758282ecd4646426112d0cbab865
    fb42758282ecd4646426112d0cbab865
    13f81c194feb7824623942bcea2c503c
    92f2bf4930db49efa669179f50f4584ec9c02003297b6382a6636dfa2af42cfb
    92f2bf4930db49efa669179f50f4584ec9c02003297b6382a6636dfa2af42cfb
    True
    
    Process finished with exit code 0
    

    相关文章

      网友评论

          本文标题:hashlib和hmac

          本文链接:https://www.haomeiwen.com/subject/fykxyftx.html