hashlib模块

一,什么是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:\01.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('密码是===>\033[46m%s\033[0m' %k)

cryptograph='aee949757a2e698417463d47acac93df'
break_code(cryptograph,make_passwd_dic(passwds))

 

posted @ 2018-06-25 16:08  空杯人  阅读(108)  评论(0编辑  收藏  举报