摘要算法

1. 摘要算法又称为哈希算法、散列算法,是通过函数将任意长度的数据转化成固定长度的数据串(通常用16进制的字符串表示)。

2. 摘要算法将通过摘要函数f()将数据转化成固定长度的摘要(digest),目的是判断原始数据是否被别人修改过

3. 能够判断的原因是摘要函数是单向函数,计算data很容易,通过digest反推data很难,而且对原始数据做一个bit的修改都会导致计算出的摘要完全不同

常见的摘要算法有MD5,SHA1等

1 import hashlib
2 s1 = "life is short, carpe diem!"
3 ret = hashlib.md5()
4 ret.update(s1.encode("utf-8"))
5 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 = "123456"
ret = hashlib.md5()
ret.update(password.encode("utf-8"))
print(ret.hexdigest())   # e10adc3949ba59abbe56e057f20f883e

上述口令比较简单,因此可以把常用的口令如123,888等对应的MD5值计算出来,得到反推表,然后通过反推表去破解密码(撞库),怎么防止呢?加盐!原始口令加一个复杂的字符串来MD5,这个复杂的字符串就称为"盐"

加盐版

password = "123456"
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。文件内容:

临江仙
夜饮东坡醒复醉
归来仿佛三更
家童鼻息已雷鸣
敲门都不应
倚仗听江声
长恨此生非我有
何时忘却营营
夜阑风静縠纹平
小舟从此逝
江海寄余生

 1 def file_veri(file):
 2     with open(file, encoding="utf-8", mode="r") as f:
 3         while True:
 4             content = f.read(1024)
 5             if not content:
 6                 break
 7             ret = hashlib.md5()
 8             ret.update(content.encode("utf-8"))
 9         return ret.hexdigest()
10
11
12 print(file_veri("test1"))   # 4b852fe14346408bdc7c1ab6603b03fe
13 print(file_veri("test2"))   # 4b852fe14346408bdc7c1ab6603b03fe

注意摘要算法不是加密算法,不能用于加密,因为无法通过摘要反推明文,只能用于防篡改,但是它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令。

转载于:https://www.cnblogs.com/zzliu/p/10260151.html

python模块之hashlib 1相关推荐

  1. python模块之hashlib

    hashlib模块实现了多种安全哈希和信息摘要算法的通用接口,包括FIPS中定义的SHA1, SHA224, SHA256, SHA384, SHA512以及RFC 1321中定义的MD5 注意点: ...

  2. Python模块学习——hashlib模块讲解

    一:hashlib简介 1.什么叫hash: hash是一种算法(不同的hash算法只是复杂度不一样)(3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SH ...

  3. Python模块之hashlib:提供hash算法

    算法介绍 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常 ...

  4. python 模块学习 hashlib

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

  5. python模块之hashlib加密

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

  6. python hashlib模块_python3 hashlib模块

    Python3 hashlib模块和hmac 模块(加密) hashlib 是一个提供了一些流行的hash算法的 Python 标准库.其中所包括的算法有 md5, sha1, sha224, sha ...

  7. 每周一个 Python 模块 | hashlib

    专栏地址:每周一个 Python 模块 hashlib 模块定义了用于访问不同加密散列算法的 API.要使用特定的哈希算法,需要先用适当的构造函数或new()创建哈希对象.然后,无论使用何种算法,对象 ...

  8. Python3.7模块之hashlib

    Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等 这里以hashlib举例: import hashlibmd=hashlib.md5() md.update("你好 ...

  9. 常用模块之hashlib,configparser,logging模块

    常用模块二 hashlib模块 hashlib提供了常见的摘要算法,如md5和sha1等等. 那么什么是摘要算法呢?摘要算法又称为哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定 ...

最新文章

  1. 网易云课堂 学习教程
  2. python使用fpdf生成各种样式pdf表格数据
  3. TensorFlow学习笔记:共享变量
  4. winsock 错误
  5. 安卓学习-界面-ui-RadioButton CheckBox
  6. tcp 发送数据长度比预设缓存大_一文秒懂 TCP/IP实际五层结构(下篇)
  7. html 修改背景透明度,html – 用css更改背景图像的不透明度
  8. 45岁,一个平凡大叔的异地打工生活
  9. AspNetCore中使用Ocelot之 IdentityServer4
  10. 光纤收发器的选购原则介绍
  11. LeetCode 696. 计数二进制子串
  12. json取数据怎么取_干货速递丨书名应该怎么取?
  13. 关于DOM操作的几个类型
  14. 基于JAVA+SpringMVC+Mybatis+MYSQL的校园帮管理系统
  15. linux外接NetApp存储,netapp linux iscsi 实现
  16. strcpy函数的C/C++实现
  17. requests, Beautifusoup 爬取新浪新闻资讯
  18. 计算机网络物理层之数字传输系统
  19. 【直线检测】【matlab】基于Hough变换的直线检测
  20. [原创] 我了解北京地区消费贷利息情况

热门文章

  1. beats x白灯一直闪_beatsx白灯不停闪烁怎么回事
  2. HT1621 控制LCD屏幕显示数字,连续显示数字
  3. PMBOK挣值分析EMV
  4. 总结软连接和硬连接区别?
  5. jquery 高效实现htmlencode()与htmldecode()函数
  6. PS-的一些常用功能-去污渍或水印-自动批量处理图片-查看坐标与像素值-图片缩放等
  7. QVariant与自定义类型互转之奇巧淫技
  8. vim常用配置及ideavim插件静音
  9. 小型数字系统---运动码表
  10. Linux下的代码编辑器——vim