上篇:https://blog.csdn.net/qq_42489308/article/details/89813895

hashlib

Hash,译做“散列”,也有直接音译为“哈希”的。把任意长度的输入,通过某种hash算法,变换成固定长度的输出,该输出就是散列值,也称摘要值。该算法就是哈希函数,也称摘要函数。

MD5是最常见的摘要算法,速度很快,生成结果是固定的16字节,通常用一个32位的16进制字符串表示。SHA1算法更安全点,它的结果是20字节长度,通常用一个40位的16进制字符串表示。而比SHA1更安全的算法是SHA256和SHA512等等,不过越安全的算法越慢,并且摘要长度更长。

hashlib模块

Python内置的hashlib模块为我们提供了多种安全方便的摘要方法

当前,在大部分操作系统下,hashlib模块支持md5(),sha1(), sha224(), sha256(), sha384(), sha512(), blake2b()blake2s()sha3_224(), sha3_256(), sha3_384(), sha3_512(), shake_128(), shake_256()等多种hash构造方法。这些构造方法在使用上通用,返回带有同样接口的hash对象,对算法的选择,差别只在于构造方法的选择。例如sha1()能创建一个SHA-1对象,sha256()能创建一个SHA-256对象。然后就可以使用通用的update()方法将bytes类型的数据添加到对象里,最后通过digest()或者hexdigest()方法获得当前的摘要。

注意了,update()方法现在只接受bytes类型的数据,不接收str类型。

下面是获得bytes类型字符串b'Nobody inspects the spammish repetition'的摘要的过程:

>>> import hashlib
>>> m = hashlib.sha256()                # 通过构造函数获得一个hash对象
>>> m.update(b'Nobody inspects')        # 使用hash对象的update方法添加消息
>>> m.update(b' the spammish repetition')   # 同上
>>> m.digest()                  # 获得bytes类型的消息摘要
b'\x03\x1e\xdd}Ae\x15\x93\xc5\xfe\\\x00o\xa5u+7\xfd\xdf\xf7\xbcN\x84:\xa6\xaf\x0c\x95\x0fK\x94\x06‘
>>> m.hexdigest()                   # 获得16进制str类型的消息摘要
'031edd7d41651593c5fe5c006fa5752b37fddff7bc4e843aa6af0c950f4b9406'
>>> m.digest_size                   # 查看消息摘要的位长
32
>>> m.block_size                    # 查看消息摘要的内部块大小
64
更简洁的用法:
>>> hashlib.sha224(b"Nobody inspects the spammish repetition").hexdigest()
'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2'

hashlib.new(name[, data])

一个通用的构造方法,name是某个算法的字符串名称,data是可选的bytes类型待摘要的数据。

>>> h = hashlib.new('sha256',b"haha")
>>> h.hexdigest()
'090b235e9eb8f197f2dd927937222c570396d971222d9009a9189e2b6cc0a2c1'

hash对象的方法

hash.update(arg)
更新hash对象。连续的调用该方法相当于连续的追加更新。例如m.update(a); m.update(b)相当于m.update(a+b)。注意,当数据规模较大的时候,Python的GIL在此时会解锁,用于提高计算速度。
一定要理解update()的作用,由于消息摘要是只针对当前状态产生的,所以每一次update后,再次计算hexdigest()的值都会不一样。hash.digest()
返回bytes格式的消息摘要hash.hexdigest()
与digest方法类似,不过返回的是两倍长度的字符串对象,所有的字符都是十六进制的数字。通常用于邮件传输或非二进制环境中。通常我们比较摘要时,比较的就是这个值!hash.copy()
返回一个hash对象的拷贝

使用场景

那么消息摘要有什么用呢?最常用的就是密码加密!密码加密不像数据加密,通常不需要反向解析出明文。而数据加密一般是需要反向解析的,我们无法从摘要反向解析出数据,加密是没问题了,但你让数据使用者如何获取数据?

现在,考虑下面的问题:

image.png

当用户登录时,首先计算用户输入的明文口令的摘要值,然后和数据库存储的摘要值进行对比。如果两者一致,说明口令输入正确,如果不一致,口令肯定错误。这样,不但数据库不用储存明文密码,即使能访问数据库的管理员“叛变”了,盗走了整个数据库,也无法获知用户的明文口令。

那么采用诸如MD5等消息摘要存储口令是否就一定安全呢?也不一定!假设你是一个黑客,已经拿到了存储MD5口令的数据库,如何通过MD5反推用户的明文口令呢?暴力破解?费事费力!,真正的黑客不会这么干。很多用户喜欢用123456abcdefloveyou这些简单的口令,由于MD5、SHA1等所有摘要算法都是公开的,黑客可以事先通过这些算法计算出这些常用口令的摘要值,得到一个反推表:

08b9239f92786f609443b669d5a041c1 :  123456
960d15c50def228e8557d68945b5f7c0  : abcdef
47c0e829611b55cd05c680859adb8863  :loveyou

然后,无需暴力破解,只需要对比数据库的密码摘要,黑客就可以获得使用常用口令的用户账号。

加盐:额外给原始数据添加一点自定义的数据,使得生成的消息摘要不同于普通方式计算的摘要。

比如我下面给密码字符串“password”加上字符串“salt”,这里的“salt”字符串就是所谓的盐,其摘要值必然不等于正常摘要“password”字符串的值。当然这个“salt”具体是什么,完全可以自定义,而且不能告诉他人!千万不要以为加盐就是加个“salt”字符串。

md5 = hashlib.md5()
s = "password" + "salt"
md5.update(s.encode())
md5.hexdigest()
'b305cadbb3bce54f3aa59c64fec00dea'

python学习笔记——hashlib模块相关推荐

  1. Python学习笔记13_模块

    Python学习笔记13_模块 文章目录 Python学习笔记13_模块 1.导入模块和的方法及使用 2.分层的文件系统中常用的包结构 3.OS 模块 4.sys 模块 5.math 模块 6.ran ...

  2. Python学习笔记:第三方模块2

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  3. Python学习笔记:模块

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  4. Python学习笔记011_模块_标准库_第三方库的安装

    容器 -> 数据的封装 函数 -> 语句的封装 类 -> 方法和属性的封装 模块 -> 模块就是程序 , 保存每个.py文件 # 创建了一个hello.py的文件,它的内容如下 ...

  5. Python学习笔记——glob模块【文件、路径操作】

    最近做了一个将dicom文件转化为mhd文件的任务,由于要进行批量转化所以遍历文件夹必不可少,刚开始学习python编程,所以把用过的模块用法记录下来,以加深记忆,方便查阅,最后参考前人的博客做了gl ...

  6. Python 学习笔记 -- pickle模块,如何腌制泡菜(入门级)

    #关于腌菜的基础操作 #一般情况下学会腌菜的技术可以使文件大小更加小巧,更加持久. #下来是就是一些腌菜的基础用法 import pickle, os #在腌菜之前需要导入腌菜模块#实例一:这是一个保 ...

  7. python学习笔记(四)模块

    4.1基础 模块实现函数重用,import导入模块. import sys for i in sys.argv:print(i) 运行结果: C:\Users\liyz-b\Desktop\work\ ...

  8. Python 学习笔记 系统模块 面对对象思想 类和对象 类中的方法与对象 构造函数和析构函数

    一.系统模块: UTC:国际标准时间, 格林尼治天文时间,UTC+8 时间戳:指定时间距离1970.1.1 00:00:00的秒数 time:时间 datetime:日期 calendar:万年历 o ...

  9. Python学习笔记——time模块和datatime模块【时间处理】

    例子 time模块: import timet1 = time.time()#返回当前时间 t2 = time.localtime()#返回本地时间以元组的形式表示 t3 = time.asctime ...

最新文章

  1. 参数服务器训练基本理论
  2. oracle删除大表的数据的方法
  3. Django:模型model和数据库mysql(一)
  4. 利用74LS161计数器芯片分别实现模12,模20的计数器,并在QuartusⅡ上进行仿真
  5. 抛鸡蛋html5游戏,数学智力题:扔鸡蛋计算不会碎的楼层
  6. 送书福利 | 浙江大学陈华钧教授新作,全面梳理知识图谱技术体系
  7. 【CodeForces - 660C】Hard Process (尺取 或 二分+滑窗,前缀和预处理)
  8. Unresolved reference ‘SQLAlchemy‘
  9. Atitit atitit 编程语言之道补充 s22 attilax 艾龙 著 1. 程序设计是个什么概念呢?历史发展 1 1.1. 连接电缆 2 1.2. 程序内置纸带打点 2 1.3. FORT
  10. 配置管理工具Puppet入门介绍:1 :安装与设定
  11. html导航折叠与展开,html展开收起
  12. English--基础知识点--3--动名词做主语
  13. 性能比肩美拍秒拍的Android视频录制编辑特效解决方案
  14. 从Trie树(字典树)谈到后缀树(10.28修订)
  15. 报错:RuntimeError: view size is not compatible with input tensor‘s size and stride (at least one dimen
  16. Windows7系统速度慢 或是颜色校正惹祸
  17. 337调查之「普遍排除令」简介及2018年度典型案例探讨
  18. python冒号亮红无效语法_新的python无效语法*更新
  19. 弹出框和提示框效果以及代码展示
  20. HIT-ICS大作业论文

热门文章

  1. js创建数组添加元素
  2. SVN分支创建 与 分支和主干的代码合并问题
  3. [华为机试练习题]44.24点游戏算法
  4. jquery实现表格内容筛选
  5. JavaScript--DOM案例(一)
  6. fq,fa,fna,ffn,faa都是什么鬼,与fasta,fastq格式有什么关系?终于1分钟搞懂了
  7. 成长一夏 挑战赛来袭 专属社区福利来袭~免费获得CSDN定制T恤衫
  8. (转)感悟《大话西游》有改动
  9. python局域网联机_Python Socket-获取局域网连接的服务器主机名 - python
  10. 牙齿松动,牙龈萎缩怎么治疗?