一,什么是hash?
hash是一种算法,该算法接受传入的内容,经过运算得到一串hash值。
二,hash值的特点是:
1.只要传入的内容一样,得到的hash值必然一样。————》要用明文传输密码文件完整性校验。
2.不能由hash值反解成内容。
3.只要使用的hash算法不变,无论校验的内容有多大,得到的hash值长度是固定的。
基于1和2可以在下载文件时做文件一致性校验。
基于1和3可以对密码进行加密。
比喻:
hash算法就像是一座工厂,工厂接收你送来的原材料,(可以用m.update()为工厂运送原材料),经过加工返回的产品就是hash值。
操作如下:
import hashlib
m=hashlib.md5() #搞定算法
m.update('你fxc'.encode('utf-8')) #传入原材料
print(m.hexdigest()) #得到hash值。
3、如何用
'''
import hashlib
# #1、造出hash工厂
# m=hashlib.md5()
#
# #2、运送原材料
# m.update('你好啊美丽的'.encode('utf-8'))
# m.update('张铭言'.encode('utf-8'))
#
# #3、产出hash值
# print(m.hexdigest()) #66bcb9758826f562ae8cb70d277a4be9
# #1、造出hash工厂
# m=hashlib.md5('你'.encode('utf-8'))
#
# #2、运送原材料
# m.update('好啊美丽的张铭言'.encode('utf-8'))
#
# #3、产出hash值
# print(m.hexdigest()) #66bcb9758826f562ae8cb70d277a4be9
三。应用一:文件一致性校验
# #1、造出hash工厂
# m=hashlib.sha512('你'.encode('utf-8'))
#
# #2、运送原材料
# m.update('好啊美sadfsadf丽asdfsafdasdasdfsafsdafasdfasdfsadfsadfsadfsadfasdff的张铭言'.encode('utf-8'))
#
#
# #3、产出hash值
# print(m.hexdigest()) #2ff39b418bfc084c8f9a237d11b9da6d5c6c0fb6bebcde2ba43a433dc823966c
# #1、造出hash工厂
# m=hashlib.md5()
#
# #2、运送原材料
# with open(r'E: 1.mp4','rb') as f:
# for line in f:
# m.update(line)
# #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
注意:
把一段很长的数据update多次,与一次update这段长数据,得到的结果是一样的。但是update多次为校验大文件提供了可能。
以上加密算法虽然依然非常厉害,但有时候存在缺陷,即通过撞库可以反解。所以有必要对加密算法中添加自定义key再来做加密。
模拟撞库破解密码:
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('密码是===>