hashlib模块

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:\01.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

posted @ 2018-06-25 15:19  Roc_Atlantis  阅读(110)  评论(0编辑  收藏  举报