hashlib 模块用来进行hash
hashlib的基本概述:
python中的 hashlib 模块用来进行hash 或者md5加密,而且这种加密是不可逆的,所以这种算法又被称为摘要算法,
其支持Opennssl库提供的所有算法,包括 md5、sha1、sha224、sha256、sha512 等。
hash是一种算法 是将一个任意长的数据 根据计算 得到一个固定长度特征吗
特征:1、不同输入 可能会有相同的结果 几率特别小
2、相同的输入 必然得到相同结果
3、由于散列(特征)的性质 从原理来看是不可能 反解
4、用来 验证 两个输入的数据是否一致
使用场景:
1、密码验证
2、验证数据是否被篡改 比如游戏安装包 有没有被改过
为了防止别人撞库成功 可用提升密码的复杂度 其次可以为密码加盐(加点内容进去)
ps:撞库破解的原理 把常见的 明文和密文的对应关系 存到了数据库中 运气好就能查询到
常用的属性和方法:
algorithms : 列出所有加密算法
digesti——size: 产生的散列的字节大小
md5()/sha1() :创建一个 md5 或者 sha1加密模式的hash 对象
update(arg) :用字符串参数来更新hash对象,如果同一个has对象重复调用该方法,如下:m.update(a); m.update(b), 则等于m.update(a+b)
digest() : 返回摘要,作为二进制数据字符串值
hexdigest() : 返回摘要,作为十六进制数据字符串值
copy() :复制
下面是一个简单的实例:
import hashlib m = hashlib.md5("aaa".encode("utf-8")) print(m.hexdigest())
结果如下:
47bce5c74f589f4867dbd57e9ca9f808
下面是一个简单的加盐实例:
import hashlib m = hashlib.md5("321".encode("utf-8")) #加 m.update("abcdefplkjoujhh".encode("utf-8")) print(m.hexdigest())
结果如下:
7da0befdd8fd811dd0716941c38c0111
关于hmac 的实例:
import hmac # 与hashlib 没啥区别 只是在创建的时候必须加盐 h = hmac.new("abcdefjjjj".encode("utf-8")) h.update("123".encode("utf-8")) print(h.hexdigest())
结果如下:
944b3523fac69f32f6d399a11707da8b
如何产生hash值的三个阶段:
import hashlib # # ######## sha256 ######## # # 1、造出hash工厂 hash = hashlib.sha256('12345ds232'.encode('utf8')) #同一种hash算法得到的长度是固定的 # # 2、运送原材料 hash.update('alvin'.encode('utf8')) #工厂传入的原材料都是bytes类型 # # 3、产出hash值 print(hash.hexdigest()) #结果:0f63932f6e2b2d1e0d9c2d50f0e9d39b79da78a5048a6d054d7f9c27d1a8761a
效验文件的一致性(如何保证下载的文件过程中不丢包,保证数据的完整性!):
# -----------文件一致校验---------------- '''可以拷贝一个文件放在两个不同的盘中,然后通过判断两个文件的hash值是否相等,判断两个文件是否是同一个文件''' import hashlib m = hashlib.md5() with open(r'F:\oldboy课程记录\目录创建函数.py','rb') as f: for line in f: m.update(line) print(m.hexdigest()) #18b6754864943d03b5b2aedacb449466 import hashlib m = hashlib.md5() with open(r'F:\oldboy课程记录\购物车练习.py','rb') as f: for line in f: m.update(line) print(m.hexdigest()) #8e63f67a0049d1fc583a5c2bbf6cf3a8
对密码进行加盐(加密):
# 应用:对明文密码进行加密(暴力破解-------用明文密码用一种算法算出一个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())
hmac模块的加密方式,与hashlib差不多:
'''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
破解用户的密码:
# 重点 '''模拟撞库破解密码''' 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的字典当做函数的实参传给对应的形参