Python值hashlib详解

阅读目录

回到顶部

一、hashlib 的基本概念

1、什么叫 hash:hash 是一种算法(不同的 hash 算法只是复杂度不一样)(3.x 里代替了 md5 模块和 sha 模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法),该算法接受传入的内容,经过运算得到一串 hash 值
2、hash 值的特点是 (hash 值 /产品有三大特性:):
2.1 只要传入的内容一样,得到的 hash 值必然一样 =====>要用明文传输密码文件完整性校验
2.2 不能由 hash 值返解成内容 =======》把密码做成 hash 值,不应该在网络传输明文密码(只能有内容返回 hash 值)
2.3 只要使用的 hash 算法不变,无论校验的内容有多大,得到的 hash 值长度是固定的 (如从网上下载文件要进行 hash 校验,保证网络传输没有丢包)
基于 2.1 和 2.3 可以做文件下载一致性的校验
基于 2.1 和 2.2 可以对用户密码进行加密
hash 算法就像一座工厂,工厂接收你送来的原材料(可以用 m.update()
为工厂运送原材料),经过加工返回的产品就是 hash 值
回到顶部

二、如何产生 hash 值之三个阶段

import hashlib         #(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())  # e79e68f070cdedcfe63eaf1a2e92c83b4cfb1b5c6bc452d214c1b7e77cdfd1c7

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())

回到顶部

三、校验文件的一致性(如何保证下载的文件过程中不丢包,保证下载数据的完整性)

# ----------- 文件一致校验 ----------------
'''可以拷贝一个文件放在两个不同的盘中,然后通过判断两个文件的 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())          #47a6b079cc33a4f312786b46e61e0305

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 的字典当做函数的实参传给对应的形参

回到顶部

六、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
'''