1.什么是hash?
hash是一种算法,该算法接受传入的内容,经过运算得到一个hash值。
如果把hash算法比作一个工厂,那么给hash算法的内容就是原材料,生成的hash值就是得到的产品。
2.为何使用hash算法?
hash值有三大特性:
1.只要传入的内容一样,得到的hash值必然是固定的。
2.只要使用的hash算法是一样的,不论传入多大的内容,hash值长度都是固定的。
3.不可用hash值逆推出原来的内容。
基于1和2可以在下载文件时做文件一致性校验
基于1和3可以对密码进行加密——> 登陆时密码hash 将获得的hash值传给数据库,数据库调用用户名和对应的hash值做比较,一样则让用户登陆。hash不可逆推,就算被截获也得不出密码。
3 怎么用hash?
例子用的是MD5加密 (还有sha512加密等)
import hashlib
#1、造出hash工厂
m=hashlib.md5()
#2、运送原材料
m.update('你好啊美丽的'.encode('utf-8'))
m.update('张铭言'.encode('utf-8'))
#3、产出hash值
print(m.hexdigest()) #66bcb9758826f562ae8cb70d277a4be9
上下两个hash值是一样的,传入的内容是一样的
#1、造出hash工厂
m=hashlib.md5('你'.encode('utf-8'))
#2、运送原材料
m.update('好啊美丽的张铭言'.encode('utf-8'))
#3、产出hash值
print(m.hexdigest()) #66bcb9758826f562ae8cb70d277a4be9
在不同目录下相同的内容得到的hash值相同
文件的一致性校验
#1、造出hash工厂
m=hashlib.md5()
#2、运送原材料
with open(r'E: 1.mp4','rb') as f:
for line in f:
m.update(line) # 文件过大不能用m.update(f.read())
#3、产出hash值
print(m.hexdigest()) #1273d366d2fe2dc57645cc1031414a05
# 1273d366d2fe2dc57645cc1031414a05
应用一:对明文密码进行加密
password=input('>>>: ')
m=hashlib.md5()
m.update('天王盖地虎'.encode('utf-8')) # 加盐 需要破解用户输入的密码和加盐得数据类型,破解难度增大,加的盐可以和密码混合
m.update(password.encode('utf-8'))
print(m.hexdigest()) #95bd6eafefdf51d8b153785f3fb6263d
# 加盐算法
import hmac,hashlib
# m = hmac.new(key,msg,digestmod="MD5")
m=hmac.new('小鸡炖蘑菇'.encode('utf-8'),digestmod="MD5") # 后面不加默认是MD5加密
m.update('hello'.encode('utf-8'))
print(m.hexdigest()) # 38a608c5c394dfd4d4a882415cc1024e