day5模块学习--hashlib模块
hashlib模块
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。
什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
举个例子,你写了一篇文章,内容是一个字符串'how to use python hashlib - by Michael',并附上这篇文章的摘要是'2d73d4f15c0db7f5ecb321b6a65e5d6d'。如果有人篡改了你的文章,并发表为'how to use python hashlib - by Bob',你可以一下子指出Bob篡改了你的文章,因为根据'how to use python hashlib - by Bob'计算出的摘要不同于原始文章的摘要。
可见,摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。
摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。
下面就是一个加密算法的形式:
import hashlib m = hashlib.md5()
m.update(b"Hello")
m.update(b"It's me")
print(m.digest())
m.update(b"It's been a long time since last time we ...") print(m.digest()) #2进制格式hash
print(len(m.hexdigest())) #16进制格式hash
运行结果如下:
5ddeb47b2f925ad0bf249c52e342728a
  fef3d1cb846deb62c96ab4a65a80bc6d
  5ddeb47b2f925ad0bf249c52e342728a
  b'[\xa1C\x11\xa1\xb24\x03M\xa0\xe0P=\xdf\x94\xb9'
  32
m.update(b"Hello")和m.update(b"It's me")是把两个字符串拼接之后进行加密,等价于对m.update(b"HelloIt's me"),就是对内容进行加密的情况,是不能反解。
1. md5加密
import hashlib
hash = hashlib.md5()
hash.update("admin".encode("utf-8"))
print(hash.hexdigest())
运行结果如下:
21232f297a57a5a743894a0e4a801fc3
2.sha1加密
import hashlib hash = hashlib.sha1()
hash.update("admin".encode("utf-8"))
print(hash.hexdigest())
运行结果如下:
d033e22ae348aeb5660fc2140aec35850c4da997
3.sha256加密
import hashlib hash = hashlib.sha256()
hash.update("admin".encode("utf-8"))
print(hash.hexdigest())
运行如下:
8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
4.sha384加密
import hashlib hash = hashlib.sha384()
hash.update("admin".encode("utf-8"))
print(hash.hexdigest())
运行结果如下:
9ca694a90285c034432c9550421b7b9dbd5c0f4b6673f05f6dbce58052ba20e4248041956ee8c9a2ec9f10290cdc0782
5.sha512加密
import hashlib hash = hashlib.sha512()
hash.update("admin".encode("utf-8"))
print(hash.hexdigest())
运行结果如下:
9ca694a90285c034432c9550421b7b9dbd5c0f4b6673f05f6dbce58052ba20e4248041956ee8c9a2ec9f10290cdc0782
6. ‘加盐’加密
以上加密算法虽然很厉害,但仍然存在缺陷,通过撞库可以反解。所以必要对加密算法中添加自定义key再来做加密。
import hashlib
  m = hashlib.md5()
  m.update("admin".encode("utf-8"))
  print(m.hexdigest())
  hash = hashlib.md5("python".encode("utf-8"))
  hash.update("admin".encode("utf-8"))
  print(hash.hexdigest())
运行结果如下:
21232f297a57a5a743894a0e4a801fc3
  75b431c498b55557591f834af7856b9f
从上面可以看出,要想增加撞库的难度,可以增加密码的难度。
7. hmac加密
import hmac
  m = hmac.new("python".encode('utf-8'))
  m.update("admin".encode('utf-8'))
  print(m.hexdigest())
运行结果如下:
540f0bf357bfda39ceee96c8e97b2e9e
比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,而且摘要长度更长。
有没有可能两个不同的数据通过某个摘要算法得到了相同的摘要?完全有可能,因为任何摘要算法都是把无限多的数据集合映射到一个有限的集合中。这种情况称为碰撞,比如Bob试图根据你的摘要反推出一篇文章'how to learn hashlib in python - by Bob',并且这篇文章的摘要恰好和你的文章完全一致,这种情况也并非不可能出现,但是非常非常困难。
摘要算法应用
摘要算法能应用到什么地方?举个常用例子:
任何允许用户登录的网站都会存储用户登录的用户名和口令。如何存储用户名和口令呢?方法是存到数据库表中:
  name  | password  --------+----------  michael | 123456  bob   | abc999  alice  | alice2008如果以明文保存用户口令,如果数据库泄露,所有用户的口令就落入黑客的手里。此外,网站运维人员是可以访问数据库的,也就是能获取到所有用户的口令。
正确的保存口令的方式是不存储用户的明文口令,而是存储用户口令的摘要,比如MD5:
  username | password  ---------+---------------------------------  michael | e10adc3949ba59abbe56e057f20f883e  bob   | 878ef96e86145580c38c87f0410ad153  alice  | 99b1c2188db85afee403b1536010c2c9当用户登录时,首先计算用户输入的明文口令的MD5,然后和数据库存储的MD5对比,如果一致,说明口令输入正确,如果不一致,口令肯定错误。
小结:
摘要算法在很多地方都有广泛的应用。要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改,但是它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令。
下面下了一个简单的加密登录程序:
import json,hashlib def register():
'''用户注册模块,注册之后存储到文件数据库中'''
name = input("Please input you register's name: ")
pwd = input("Please input you password:")
hash = hashlib.md5()
hash.update(pwd.encode("utf-8"))
pwd = hash.hexdigest()
sex = input("Please input your sex:")
age = input("Please input your age:")
mail = input("Please input your mail:")
address = input("请输入你的地址:")
message = {"name":name,"sex":sex,"age":age,"mail":mail,"address":address,"pwd":pwd}
with open("user_db.json",'w') as f:
json.dump(message,f) def login():
'''用户登录验证模块,从上面存储的用户数据库中找数据,也使用加密验证是否正确'''
while True:
m = hashlib.md5()
name = input("请输入你的用户名:")
m.update(input("请输入你的密码:").encode('utf-8'))
password = m.hexdigest()
with open("user_db.json",'r') as f1:
user_dic = json.load(f1) if name == user_dic["name"] and password == user_dic["pwd"]:
print("欢迎光临,登录成功!")
return
else:
print("您输入的用户名或密码不对,请核对后输入!") login()
运行结果如下:
请输入你的用户名:geng
  请输入你的密码:admin
  您输入的用户名或密码不对,请核对后输入!
  请输入你的用户名:耿长学
  请输入你的密码:admin
  欢迎光临,登录成功!
其实hashlib存在的意义就是加密,加密是为了防止以明文的方式让别人获取用户信息,所以要通过加密进行保证,即便黑客获取了用户信息,但是由于密码或者关键部分使用加密算法,黑客看到的只是加密之后的信息。由于Md5是不能反解的,只能通过撞库碰运气,因此密码要相对负责一些。
day5模块学习--hashlib模块的更多相关文章
- hmac模块和hashlib模块
		hmac模块和hashlib模块 一.hash是什么  hash是一种算法(Python3.版本里使用hashlib模块代替了md5模块和sha模块,主要提供 SHA1.SHA224.SHA256. ... 
- 包、logging模块、hashlib模块、openpyxl模块、深浅拷贝
		包.logging模块.hashlib模块.openpyxl模块.深浅拷贝 一.包 1.模块与包 模块的三种来源: 1.内置的 2.第三方的 3.自定义的 模块的四种表现形式: 1.py文件 2.共享 ... 
- [xml模块、hashlib模块、subprocess模块、os与sys模块、configparser模块]
		[xml模块.hashlib模块.subprocess模块.os与sys模块.configparser模块] xml模块 XML:全称 可扩展标记语言,为了能够在不同的平台间继续数据的交换,使交换的数 ... 
- day5模块学习 -- os模块学习
		python基础之模块之os模块 os模块 os模块的作用: os,语义为操作系统,所以肯定就是操作系统相关的功能了,可以处理文件和目录这些我们日常手动需要做的操作,就比如说:显示当前目录下所有文件/ ... 
- python-Day5-深入正则表达式--冒泡排序-时间复杂度 --常用模块学习:自定义模块--random模块:随机验证码--time & datetime模块
		正则表达式 语法: mport re #导入模块名 p = re.compile("^[0-9]") #生成要匹配的正则对象 , ^代表从开头匹配,[0 ... 
- Python模块之hashlib模块、logging模块
		一.hashlib模块 hashlib模块介绍:hashlib这个模块提供了摘要算法,例如 MD5.hsa1 摘要算法又称为哈希算法,它是通过一个函数,把任意长度的数据转换为一个长度固定的数据串,这个 ... 
- 19 python初学(os 模块,sys 模块,hashlib 模块)
		os 模块: # _author: lily # _date: 2019/1/13 import os print(os.getcwd()) # 得到当前的工作目录 # print(os.chdir( ... 
- re模块、hashlib模块
		一.re模块 1.什么是正则? 正则就是用一系列具有特殊含义的字符组成一套规则,该规则用来描述具有某一特征的字符串,正则就是用来去一个大的字符串中匹配出符合规则的子字符串 2.为何要用正则? 用户注册 ... 
- 模块讲解----hashlib模块(加密)
		作用 用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 语法 import hashlib #md5 ... 
随机推荐
- GO_06:GO语言基础之struct
			结构struct 1. Go 中的struct与C中的struct非常相似,并且Go没有class 2. 使用 type <Name> struct{} 定义结构,名称遵循可见性规则(即首 ... 
- python中的文件操作(2)
			a+,w+,r+的特点: r+:r+模式允许读和写,当对文件句柄只进行写操作时,tell(),seek()为写操作的‘指针’(也就是写到seek()处). 当只进行读操作时,tell(),seek() ... 
- python安装pymssql
			安装pymssql pip install pymssql 关于python安装pymssql报错export PYMSSQL_BUILD_WITH_BUNDLED_FREETDS=1 然后再 pip ... 
- Linux基础命令【记录】
			后台运行详情:https://www.cnblogs.com/little-ant/p/3952424.html 查看端口.查找等命令 根据关键字查找文件信息: cat <文件名> | g ... 
- [Luogu 1073] NOIP2009 最优贸易
			[Luogu 1073] NOIP2009 最优贸易 分层图,跑最长路. 真不是我恋旧,是我写的 Dijkstra 求不出正确的最长路,我才铤而走险写 SPFA 的- #include <alg ... 
- 回调函数之基本的Promise
			在 JavaScript 中,所有的代码都是单线程的,所谓的回调函数就是为了处理一些异步的操作.而多层的回调函数嵌套是一种比较古老的处理方式,这种代码的弊端显而易见,结构混乱.代码冗余,而 Promi ... 
- soj1767.传纸条
			这道题目想了一会儿觉得不知道如何下手,上网看了下资料,原来这道是一道非常经典的题目. 设 f [ k ][ i ][ j ] 表示第 k 步,第 1 条路径走到第 i 行,第 2 条路径走到第 j 行 ... 
- bzoj 1044 [HAOI2008]木棍分割(二分+贪心,DP+优化)
			[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1044 [题意] n根木棍拼到一起,最多可以切m刀,问切成后最大段的最小值及其方案数. ... 
- 判断html是否含有图片
			核心代码: $url="http://XXXXX/article/012.html"; $content=file_get_contents($url); //读取文章页面源代码 ... 
- HDU 1017 A Mathematical Curiosity 数学题
			解题报告:输入两个数,n和m,求两个数a和b满足0<a<b<n,并且(a^2+b^2+m) % (a*b) =0,这样的a和b一共有多少对.注意这里的b<n,并不可以等于n. ... 
