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
posted @ 2019-11-13 19:36  Never&say&die  阅读(125)  评论(0编辑  收藏  举报