什么叫hash?
hash是一种算法(不同的hash算法只是复杂度不一样)(python3.x里面 代替了md5模块 和sha模块,主要提供SHA1,SHA224,SHA256, SHA384, SHA512, MD5算法),该算法接收传入的内容,经过运算得到一串hash值。
hash值得特点是(hash值、产品有三大特性):
import hashlib
#### 256 ####
# 1. 造出hash工厂
hash = hashlib.sha256('898oaFs09f'.encode('utf8')) # 同一种hash算法得到的长度是固定的
# 2. 运送原材料
hash.update('alvin'.encode('utf8')) # 工厂传入的原材料都是bytes类型
# 3. 产出hash值
print(hash.hexdigest())
###### md5 ######
import hashlib
m=hashlib.md5() #括号内也可以传值,类型也要求是bytes类型
m.update('你好呀!'.encode('utf-8'))
print(m.hexdigest()) #9e49eb8e75b9a87424e388b862ea5f83
# 与上述hash的结果一样
import hashlib
m=hashlib.md5('你'.encode('utf-8')) #括号内也可以传值,类型也要求是bytes类型
m.update('好呀!'.encode('utf-8'))
print(m.hexdigest())
# ------- 文件一致性校验 ----------
"""可以copy一个文件放在两个不同的盘中,然后通过判断两个文件的hash值是否相等,判断两个文件是否是同一个文件"""
import hashlib
m = hashlib.md5()
with open(r'G:/logging模块配图.png', 'rb') as f:
for line in f:
m.update(line)
print(m.hexdigest())
import hashlib
m = hashlib.md5()
with open(r'H:/logging模块配图.png','rb') as f:
for line in f:
m.update(line)
print(m.hexdigest())
# 应用:对明文密码进行加密(暴力破解-------用明文密码用一种算法算出一个hash值,与截取的hash值进行比对,比对成功说明明文密码一致,就可以破解用户的密码)
'''如用户在某网站进行注册信息,这个时候防止信息被恶意拦截获取,可以对用户明文密码进行加密,存成hash值得形式,这样用户每次登陆虽然输的是明文密码,校验hash值即可'''
password=input('>>>>>:').strip()
import hashlib
m=hashlib.md5()
m.update(password.encode('utf-8'))
print(m.hexdigest()) #00dcbdaede875d5e23f1f9f64c7849ef
# 对密码进行加盐(暗号)----------进一步加强密码的安全性
password=input('>>>>>:').strip()
import hashlib
m=hashlib.md5()
m.update('一行白鹭上青天'.encode('utf-8')) #对密码加盐
m.update(password.encode('utf-8'))
print(m.hexdigest())
# 重点
'''模拟撞库破解密码'''
import hashlib
passwds=[ #可以通过random实现对passwds中的内容
'alex3714',
'alex1313',
'alex94139413',
'alex123456',
'123456alex',
'a123lex',
]
def make_passwd_dic(passwds): #通过明文密码列表,造出与之对应的hash值得字典
dic={}
for passwd in passwds:
m=hashlib.md5() #使用md5算法,造了一个工厂
m.update(passwd.encode('utf-8')) #给工厂运送原材料(即我们要加密的内容)
dic[passwd]=m.hexdigest() #产出hash值(即最终的产品),将其加入到我们事先造好的空字典中,字典形式:{密码:hash值}
return dic
def break_code(cryptograph,passwd_dic): #判断拦截的hash值是否与字典中事先造好的hash值相等,相等则说明成功进行破解
for k,v in passwd_dic.items():
if v == cryptograph:
print('密码是===>\033[46m%s\033[0m' %k)
cryptograph='aee949757a2e698417463d47acac93df' #我们拦截拿到的密码,经过加密的hash值
break_code(cryptograph,make_passwd_dic(passwds)) #将要破解的密码hash值,和事先造好的hash的字典当做函数的实参传给对应的形参
'''python 还有一个 hmac 模块,它内部对我们创建 key 和 内容 进行进一步的处理然后再加密:'''
import hmac
h = hmac.new('天王盖地虎'.encode('utf8')) #hmac必须要加盐
h.update('hello'.encode('utf8'))
print(h.hexdigest()) #1abaae8f65f68f2695a8545c5bc8e738
#要想保证hmac最终结果一致,必须保证:
#1:hmac.new括号内指定的初始key一样
#2:无论update多少次,校验的内容累加到一起是一样的内容
# 下面单重方式得到的结果是一样的
import hmac
h1=hmac.new(b'tom') #初始值必须保证一致,最终得到的结果就会不一样
h1.update(b'hello')
h1.update(b'world')
print(h1.hexdigest())
h2=hmac.new(b'tom') #初始值必须保证一致,最终得到的结果就会不一样
h2.update(b'helloworld')
print(h2.hexdigest())
h3=hmac.new(b'tomhelloworld') #初始值不一样,所以与上面两种的结果不一样
print(h3.hexdigest())
'''
0426ccec3b134e8c18fdcefee841ef25
0426ccec3b134e8c18fdcefee841ef25
ff1214d895bbaf5f1847db4ebae8212e
'''
参考:hashlib