python模块之hashlib
摘要算法
1. 摘要算法又称为哈希算法、散列算法,是通过函数将任意长度的数据转化成固定长度的数据串(通常用16进制的字符串表示)。
2. 摘要算法将通过摘要函数f()将数据转化成固定长度的摘要(digest),目的是判断原始数据是否被别人修改过
3. 能够判断的原因是摘要函数是单向函数,计算data很容易,通过digest反推data很难,而且对原始数据做一个bit的修改都会导致计算出的摘要完全不同
常见的摘要算法有MD5,SHA1等
- import hashlib
- s1 = "life is short, carpe diem!"
- ret = hashlib.md5()
- ret.update(s1.encode("utf-8"))
- print(ret.hexdigest()) # 7eda5bd766debaf18e333c949f250580
输入数据量大,可以分块多次调用update()
- ret = hashlib.md5()
- with open("test", encoding="utf-8", mode="r") as f1:
- for line in f1:
- ret.update(line.encode("utf-8"))
- print(ret.hexdigest()) # 271d9daa363f2ab8a48c0d0ecd339dd3
MD5是常见的摘要算法,生成速度快,生成结果是一个128bit的数字,通常用32个16进制位表示。SHA1与MD5的用法类似
- s1 = "life is short, seize the day!"
- ret = hashlib.sha1()
- ret.update(s1.encode("utf-8"))
- print(ret.hexdigest()) # bd60da31ae2b9f407d019ff61bdbc237925ab664
SHA1的生成结果是160bit,用40个16进制表示,比SHA1更安全的算法是SHA256, SHA512,它们生成的结果更长,速度也更慢
摘要算法应用
1. 保存用户名和口令
如果以明文存储密码的话,那么数据库泄露,所有的用户口令就会落到黑客手中,此外,运维人员也是可以访问数据库的,也能获取到用户的口令,所以正确的方式应该是存储密文。
简化版
- password = ""
- ret = hashlib.md5()
- ret.update(password.encode("utf-8"))
- print(ret.hexdigest()) # e10adc3949ba59abbe56e057f20f883e
上述口令比较简单,因此可以把常用的口令如123,888等对应的MD5值计算出来,得到反推表,然后通过反推表去破解密码(撞库),怎么防止呢?加盐!原始口令加一个复杂的字符串来MD5,这个复杂的字符串就称为"盐"
加盐版
- password = ""
- ret = hashlib.md5("hello".encode("utf-8")) # "hello"就是盐
- ret.update(password.encode("utf-8"))
- print(ret.hexdigest()) # eeb9bad681184779aa6570e402d6ef6c
经过加盐的口令,只要不是盐被黑客知道,就很难破解。但是如果两个用户的口令相同,那么它们的MD5也会是相同的,有没有一种方法使不同的用户生成不同的MD5呢,?有的,我们可以把用户名设置成盐,不同的用户名作为盐,这就是动态加盐
动态加盐版
- name = input(">>>")
- password = input(">>>")
- ret = hashlib.md5(name[::2].encode("utf-8"))
- ret.update(password.encode("utf-8"))
- print(ret.hexdigest())
输入不同的用户名(密码相同)
- >>>Robin
- >>>123456
- 0acbae48d9e086089d52d54392365a04
- >>>Rose
- >>>123456
- 825f3023698149b539a17a0f74753eeb # MD5不同
2. 文件校验
文件在传输过程中可能发生损坏,因此需要进行文件校验。我们先创建两个相同的文件test1和test2。文件内容:
- 临江仙
- 夜饮东坡醒复醉
- 归来仿佛三更
- 家童鼻息已雷鸣
- 敲门都不应
- 倚仗听江声
- 长恨此生非我有
- 何时忘却营营
- 夜阑风静縠纹平
- 小舟从此逝
- 江海寄余生
- def file_veri(file):
- with open(file, encoding="utf-8", mode="r") as f:
- while True:
- content = f.read(1024)
- if not content:
- break
- ret = hashlib.md5()
- ret.update(content.encode("utf-8"))
- return ret.hexdigest()
- print(file_veri("test1")) # 4b852fe14346408bdc7c1ab6603b03fe
- print(file_veri("test2")) # 4b852fe14346408bdc7c1ab6603b03fe
注意摘要算法不是加密算法,不能用于加密,因为无法通过摘要反推明文,只能用于防篡改,但是它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令。
python模块之hashlib的更多相关文章
- python 模块之-hashlib
python 模块hashlib import hashlib m=hashlib.md5() # 生成MD5加密对象 m.update('jiami-string'.encode(' ...
- python 模块之hashlib
Hashlib模块 Python里面的hashlib模块提供了很多加密的算法,这里介绍一下hashlib的简单使用事例,用hashlib的md5算法加密数据,其他的所有加密算法使用方式上基本类似. h ...
- python模块学习 hashlib
一.hashlib概述 涉及加密服务:14. Cryptographic Services 其中 hashlib是涉及安全散列和消息摘要,提供多个不同的加密算法借口,如SHA1.SHA224.SHA2 ...
- Python模块之hashlib模块、logging模块
一.hashlib模块 hashlib模块介绍:hashlib这个模块提供了摘要算法,例如 MD5.hsa1 摘要算法又称为哈希算法,它是通过一个函数,把任意长度的数据转换为一个长度固定的数据串,这个 ...
- Python模块:hashlib
hashlib:提供了常见的摘要算法,如MD5,SHA1等. import hashlib m = hashlib.md5() m.update('how to use md5 in python h ...
- python模块之hashlib模块
hashlib模块:提供摘要算法 格式: hashlib格式: obj = hashlib.算法(md5,sha....) obj.update(摘要内容:bytes类型) result = obj. ...
- python模块之hashlib加密
40.加密模块:hashlib 1. >>> import hashlib >>> ret1 = hashlib.md5() ...
- [转] python 模块学习 hashlib
转自: http://www.cnblogs.com/BeginMan/p/3328172.html 一.hashlib概述 涉及加密服务:14. Cryptographic Services 其中 ...
- python之常用模块二(hashlib logging configparser)
摘要:hashlib ***** logging ***** configparser * 一.hashlib模块 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 摘要算法 ...
随机推荐
- 【正睿oi省选十连测】第一场
四小时写了两个暴力??自闭 [原来这就是神仙们的分量Orz rank 56/75 可以说是无比垃圾了 下周目标:进步十名?[大雾 T1 题意:有n个点的图 点有点权Ai 也有点权Bi = A_1 + ...
- hexo博客添加功能
设置Hexo主题模式 Hexo主题中,有三种不同的模式,通过切换模式,让NexT主题显示不一样的样式.在NexT根目录下有一个同样名称为_config.yml,为了区分hexo根目录下的_config ...
- iptables(4)规则编写
/etc/sysconfig/iptables # Generated by iptables-save v1.4.7 on Tue Mar 20 15:05:33 2018*filter:INPUT ...
- Mysql连接报错:1130 - Host ‘118.111.111.111’ is not allowed to connect to this MariaDB server
这个问题是因为在数据库服务器中的mysql数据库中的user的表中没有权限(也可以说没有用户),下面将记录我遇到问题的过程及解决的方法. 在搭建完LNMP环境后用Navicate连接出错 遇到这个问题 ...
- [POI2012]STU-Well(二分答案+神仙操作)
给定一个非负整数序列A,每次操作可以选择一个数然后减掉1,要求进行不超过m次操作使得存在一个Ak=0且max{|Ai−Ai+1|}最小,输出这个最小lk以及最小值. Solution 最大值最小,显然 ...
- Rocket.Chat 开源IM系统部署
Rocket.Chat 官方给出的文档也个人觉得太麻烦了,并且对ubuntu的支持程度远高于CentOS,自己就折腾写了个安装的笔记,如果是在公司内部或者是部门内部还是很有用处的,比较看中的功能有和g ...
- JDK8中的并行流
1.IntStream.parallel():获取并行流处理 2. Collection中调用parallelStream()获取并行流 3.并行排序Arrays.parallelSort()
- 洛谷P4769 冒泡排序
n <= 60w,∑n <= 200w,1s. 解:首先有个全排列 + 树状数组的暴力. 然后有个没有任何规律的状压...首先我想的是按照大小顺序来放数,可以分为确定绝对位置和相对位置两种 ...
- redis的操作
redis相当于是一个在内存中创建的大字典 redis的value有5大数据类型: redis的value有5大数据类型: 字符串 import redis conn = redis.Redis(ho ...
- struts2 contextMap
一.contextMap中的数据操作 root根:List 元素1 元素2 元素3 元素4 元素5 contextMap:Map key value application Map key value ...