hashlib模块

1. hash

什么叫hash:
hash是一种算法,该算法接受传入的内容,经过运算得到一串hash值
hash值的特点是:
1 只要传入的内容一样,得到的hash值必然一样=====>要用明文传输密码文件完整性校验
2 不能由hash值返解成内容=======》把密码做成hash值,不应该在网络传输明文密码
3 只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的

hash的用途
用途1:特点2用于密文与密文的传输与验证
用途2:特点1,3用于文件内容完整性校验

hash算法就像一座工厂,工厂接收你送来的原材料(可以用.update()为工厂运送原材料),经过加工返回的产品就是hash值

 

 

img

 

 
import hashlib

m = hashlib.md5()
m.update('hello'.encode('utf-8'))  # 必须为bytes
print(m.hexdigest())  # 5d41402abc4b2a76b9719d911017c592
#
m.update(b'Alex')
print(m.hexdigest())  # a08372b70196c21a9229cf04db6b7ceb

m.update(b'A')
m.update(b'l')
m.update(b'e')
m.update(b'x')
print(m.hexdigest())  # a08372b70196c21a9229cf04db6b7ceb

'''
注意:把一段很长的数据update多次,与一次update这段长数据,得到的结果一样
但是update多次为校验大文件提供了可能。
'''
# 加内容方式1
m.update('文件所有的内容')
m.hexdigest()

# 加内容方式2(推荐)
m.update('hello'.encode('UTF-8'))
m.update('world'.encode('UTF-8'))
res = m.hexdigest() # helloworld

print(res)

 

以上加密算法虽然非常厉害,但有·时候存在缺陷,即:通过撞库可以反解。所以,有必要对加密算法中添加自定义key再来做加密(加盐)。

import hashlib

# ######## 256 ########

hash = hashlib.sha256('da_shuai_bi'.encode('utf-8'))
hash.update('Alex'.encode('utf-8'))
print(hash.hexdigest())  # 338997013cf43e0646f96f64c28a43f194d674450bfee49576a3656746f36a39

2. 模拟撞库破解密码

import hashlib

passwds = [
    'alex3714',
    'alex1313',
    'alex94139413',
    'alex123456',
    '123456alex',
    'a123lex',
]


def make_passwd_dic(passwds):
    dic = {}
    for passwd in passwds:
        m = hashlib.md5()
        m.update(passwd.encode('utf-8'))
        dic[passwd] = m.hexdigest()
    return dic


def break_code(cryptograph, passwd_dic):
    for k, v in passwd_dic.items():
        if v == cryptograph:
            print('密码是===>\033[46m%s\033[0m' % k)


cryptograph = 'aee949757a2e698417463d47acac93df'
break_code(cryptograph, make_passwd_dic(passwds))

 

 

 

posted @ 2021-01-02 19:14  Avery_W  阅读(44)  评论(0)    收藏  举报