• hashlib模块


    一般用于明文加密,其实就是一个自定义的字符编码表。原来0和1转换成字符,而现在的是字符转成另一种字符

    hash是一种算法,该算法接受传入的内容,经过运算得到一串hash值。具有以下三个特点:

    • hash加密之后长度一样
    • hash加密的东西一样则哈希结果一样
    • 如果使用同一个哈希字符编码表,不断地哈希结果会累加
    import hashlib
    m = hashlib.md5()
    m.update('hello'.encode('utf8'))
    print(m.hexdigest())
    
    # 用同一个哈希字符编码表,哈希结果会不断累加
    m.update('hash'.encode('utf8'))
    print(m.hexdigest())            # 返回的是hellohash的哈希值
    
    m2 = hashlib.md5()
    m2.update('hellohash'.encode('utf8'))    
    print(m2.hexdigest())
    
    m3 = hashlib.md5()
    m3.update('hello'.encode('utf8'))        # 加密的东西一样,哈希值一样
    print(m3.hexdigest())
    
    5d41402abc4b2a76b9719d911017c592
    97fa850988687b8ceb12d773347f7712
    97fa850988687b8ceb12d773347f7712
    5d41402abc4b2a76b9719d911017c592
    

    撞库破解hash算法加密

    hash加密算法存在一定缺陷的,即可以通过撞库可以反解,如下代码所示

    # 假定它的密码一定是其中一个
    pwd_list = [
        'hash3714',
        'hash1313',
        'hash94139413',
        'hash123456',
        '123456hash',
        'h123ash',
    ]
    
    def break_pwd(hash_pwd):
        for pwd in pwd_list:
            m = hashlib.md5()
            m.update(pwd.encode('utf8'))
            if m.hexdigest()  == hash_pwd:
                return pwd
            
    if __name__ == '__main__':
        # 密码hash后的值
        hash_pwd = '0562b36c3c5a3925dbe3c4d32a4f2ba2'
        pwd = break_pwd(hash_pwd)
        print('这个用户的密码是:', pwd)
    
    这个用户的密码是: hash123456
    

    为了防止密码被撞库,我们可以使用python中的另一hmac模块,它内部对我们创建key和内容做过某种处理后再加密。如果要保证hmac模块最终结果一致,必须保证:

    • hmac.new括号内指定的初始key一样
    • 无论update多少次,校验的内容累加到一起是一样的内容
    import hmac
    h1 = hmac.new(b'123')
    h1.update(b'hello')
    h1.update(b'world')
    print(h1.hexdigest())
    
    h2 = hmac.new(b'123')
    h2.update(b'helloworld')
    print(h2.hexdigest())
    
    1c526ff87444b64b5fb220a7ae3ba62d
    1c526ff87444b64b5fb220a7ae3ba62d
    
  • 相关阅读:
    vim复制
    嵌入式Linux学习(二)
    (Java实现) 洛谷 P1042 乒乓球
    (Java实现) 洛谷 P1042 乒乓球
    (Java实现) 洛谷 P1071 潜伏者
    (Java实现) 洛谷 P1071 潜伏者
    (Java实现) 洛谷 P1025 数的划分
    (Java实现)洛谷 P1093 奖学金
    (Java实现)洛谷 P1093 奖学金
    Java实现 洛谷 P1064 金明的预算方案
  • 原文地址:https://www.cnblogs.com/863652104kai/p/11852089.html
Copyright © 2020-2023  润新知