python学习笔记——hashlib模块「建议收藏」

python学习笔记——hashlib模块「建议收藏」上篇:https://blog.csdn.net/qq_42489308/article/details/89813895hashlibHash,译做“散列”,也有直接音译为“哈希”的。把任意长度的输入,通过某种hash算法,变换成固定长度的输出,该输出就是散列值,也称摘要值。该算法就是哈希函数,也称摘要函数。MD5是最常见的摘要算法,速度很快,生成结果是固定的16字节,通常用一个32…

大家好,又见面了,我是你们的朋友全栈君。

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

hashlib

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

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

python学习笔记——hashlib模块「建议收藏」

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对象的拷贝

使用场景

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

现在,考虑下面的问题:

python学习笔记——hashlib模块「建议收藏」

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'

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/132184.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • setCapture 和 releaseCapture

    setCapture 和 releaseCapturesetCapture函数的作用就是将后续的mouse事件都发送给这个对象,releaseCapture就是将鼠标事件还回去,由document、window、object之类的自行来处理。这样就保证了在拖动的过程中,不会由于经过了其它的元素而受到干扰另外,还有一个很重要的事情是,在Win32上,mousemove的事件不是一个连续的,也就是说,并不是我们每次移动1px的鼠标指针,就会发生一个mousemove,windows会周期性检查mouse的位置变化来产生mousemove的事件。所以,如

  • 雷达系统导论_雷达信号处理基础第二版

    雷达系统导论_雷达信号处理基础第二版1.3.3接收机单个散射体的回波波形具有下面的形式:其中,幅度调制A(t)仅仅表示脉冲的包络。接收机处理的主要功能是将雷达信号中承载信息的部分变换到基带,目的是测量。接收机的信号被分到两个通道。为同相“I”通道,在这个通道中接收信号和振荡器(本振)的信号进行混频。这个混频产生了和频和差…

    2022年10月21日
  • Spring cloud 1 – Eurake的服务搭建[通俗易懂]

    Spring cloud 1 – Eurake的服务搭建[通俗易懂]相当于搭建zookeeper、但是springclould推荐使用Eurake作为注册中心,相比zookeeper不需要下载zookeeper1.创建一个空的maven项目,并且依赖jar<parent><groupId>org.springframework.boot</groupId><artifactId&a

  • The hot zone_Grayzone

    The hot zone_Grayzone关于这个问题,是在使用Activiti的时候遇到的,如下图:具体内容如下:Causedby:org.apache.ibatis.exceptions.PersistenceException: ###Errorgettinganewconnection. Cause:java.sql.SQLException:Theservertimezonevalue’Öйú±ê…

  • hdu1524博弈SG

    hdu1524博弈SG

  • reaver-wps

    reaver-wps概述Reaver是暴力破解接入点PIN码的一种工具。这里简单说明,PIN码是8位数字,且第8位是由校验和,由前7位可以推出。而前7位又分为4和3两部分,所以暴力尝试最多10000+1000=11000次即可完成,破解所需的时间通常在2-5小时。支持的网卡驱动完全支持ath9krtl8187carl19170ipw2000rt2800pcirt73usb部分支持ath5kiwlagn

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号