摘要算法

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的更多相关文章

  1. python 模块之-hashlib

    python 模块hashlib import hashlib m=hashlib.md5()         # 生成MD5加密对象 m.update('jiami-string'.encode(' ...

  2. python 模块之hashlib

    Hashlib模块 Python里面的hashlib模块提供了很多加密的算法,这里介绍一下hashlib的简单使用事例,用hashlib的md5算法加密数据,其他的所有加密算法使用方式上基本类似. h ...

  3. python模块学习 hashlib

    一.hashlib概述 涉及加密服务:14. Cryptographic Services 其中 hashlib是涉及安全散列和消息摘要,提供多个不同的加密算法借口,如SHA1.SHA224.SHA2 ...

  4. Python模块之hashlib模块、logging模块

    一.hashlib模块 hashlib模块介绍:hashlib这个模块提供了摘要算法,例如 MD5.hsa1 摘要算法又称为哈希算法,它是通过一个函数,把任意长度的数据转换为一个长度固定的数据串,这个 ...

  5. Python模块:hashlib

    hashlib:提供了常见的摘要算法,如MD5,SHA1等. import hashlib m = hashlib.md5() m.update('how to use md5 in python h ...

  6. python模块之hashlib模块

    hashlib模块:提供摘要算法 格式: hashlib格式: obj = hashlib.算法(md5,sha....) obj.update(摘要内容:bytes类型) result = obj. ...

  7. python模块之hashlib加密

    40.加密模块:hashlib      1.           >>> import hashlib >>> ret1 = hashlib.md5()     ...

  8. [转] python 模块学习 hashlib

    转自: http://www.cnblogs.com/BeginMan/p/3328172.html 一.hashlib概述 涉及加密服务:14. Cryptographic Services 其中 ...

  9. python之常用模块二(hashlib logging configparser)

    摘要:hashlib ***** logging ***** configparser * 一.hashlib模块 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 摘要算法 ...

随机推荐

  1. BSGS及扩展BSGS总结(BSGS,map)

    蒟蒻哪里有什么总结,只能点击%YL% 还有这位ZigZagK大佬的blog \(\mbox{BSGS}\) 模板题:洛谷P3846 [TJOI2007]可爱的质数 给定\(a,b\)和模数\(\mbo ...

  2. 自学华为IoT物联网_04 车联网常见问题及解决方案

    点击返回自学华为IoT物流网 自学华为IoT物联网_04 车联网常见问题及解决方案 1.1 可以预见的车联网未来 车辆对车辆.车辆对道路.车辆对网络通信 车辆对外发送车辆状态信息 周边环境信息发送给车 ...

  3. Nifi InvokeHttp processor

    Authorization: Bearer <access-token> Content_type: application/json       NIFI 中国社区 QQ群:595034 ...

  4. [ZJOI2016]大森林(LCT)

    题目描述 小Y家里有一个大森林,里面有n棵树,编号从1到n.一开始这些树都只是树苗,只有一个节点,标号为1.这些树都有一个特殊的节点,我们称之为生长节点,这些节点有生长出子节点的能力. 小Y掌握了一种 ...

  5. Python3 与 C# 面向对象之~异常相关

      周末多码文,昨天晚上一篇,今天再来一篇: 在线编程:https://mybinder.org/v2/gh/lotapp/BaseCode/master 在线预览:http://github.les ...

  6. Developing JSF applications with Spring Boot

    Developing JSF applications with Spring Boot Spring Boot can leverage any type of applications, not ...

  7. A1030. Travel Plan

    A traveler's map gives the distances between cities along the highways, together with the cost of ea ...

  8. Django 配置QQ邮箱连接

    首先要在settings.py内进行配置 # 邮件服务配置文件 EMAIL_USE_SSL = True # 邮箱服务 EMAIL_HOST = 'smtp.qq.com' # 端口号 EMAIL_P ...

  9. 利用selenium并使用gevent爬取动态网页数据

    首先要下载相应的库 gevent协程库:pip install gevent selenium模拟浏览器访问库:pip install selenium selenium库相应驱动配置  https: ...

  10. 【精】搭建redis cluster集群,JedisCluster带密码访问【解决当中各种坑】!

    转: [精]搭建redis cluster集群,JedisCluster带密码访问[解决当中各种坑]! 2017年05月09日 00:13:18 冉椿林博客 阅读数:18208  版权声明:本文为博主 ...