python内置库--hashlib

1 关于hashlib与hash算法

python的hashlib提供了对hash算法的的支持,常见的算法有MD5 SHA1 SHA224等,对不同的算法,hashlib提供了一些通用的函数,以方便我们的使用

hash算法

个人理解是,它可以将任意长度的二进制值变为固定长度的二进制值。
通常,这个固定长度的二进制值叫做hash值,也叫做安全摘要,不同的输入,所计算出的hash值是不同的

更通俗化理解,就像是谍战剧发电报一样,通过hash算法,不管明文有多长,都可以把明文变化为固定长度的密文。这个密文就是hash值或者安全摘要。hash算法也有很多种,不同的算法算出的密文是不同的

下面是一个例子
image
执行结果
image

现在把上面例子的hello加一个空格在最后面,得到的结果是
image
可以看到,原始数据的明文变化一点点,最后的密文即摘要也会大不相同。我们常常用到的验证下载文件的完整性,就是利用了这个特点,

若原始数据的明文相同,使用的hash算法即加密算法相同,最后得到的密文肯定是相同的。但采用的hash算法不同,最后得到的结果也是不同的。使用相同的加密算法,原始明文数据不同,结果大概率是不同的。算法生成的hash值得长度越长,得到相同hash值即密文的概率就越小

说概率的原因是,我们能输入的明文数据的数量是无限的的,按照前面讲的,在hash算法里面,不同的输入会得到不同的hash值即密文,按此推论,hash值即密文的数量应该也是无限的。
但前面也说了,最后得到的是一段固定长度的值,而固定长度所能代表的数据量是有限的,一边是无限的输入数据,一边是有限的hash值数据,每个输入都有hash值对应的话,一定会有多个输入对应一个hash值,这种情况业界业界常描述为碰撞

理论上说,碰撞是成立的,那么,不同的输入会得到一个不同的hash值这个说法就不成立了。在现实中,MD5 SHA0等算法也已经被证明可发生碰撞,不过所需数据量之多,代价比较大

现在MD5算法已不被推荐使用,推荐的是SHA224 SHA256等生成密文长度更长的算法,碰撞的概率非常之小

2 一些相关函数和例子

不同hash算法的构造器函数

如下,基于不同的hash算法,这些函数都返回了对应算法的一个hash对象
hashlib.md5() MD5算法, 生成128位16进制摘要
hashlib.sha1() SHA1算法 生成160位16进制摘要
hashlib.sha224() SHA224算法 生成224位16进制摘要
hashlib.sha256() SHA256算法 生成256位16进制摘要
hashlib.sha384() SHA384算法 生成384位16进制摘要
hashlib.sha512() SHA512算法 生成512位16进制摘要

其他相关函数

hash.update(data) :用需要加密的data来更新hash对象
data为bytes-like object
hash.update(a) hash.update(b) 等价于 hash.update(a+b)

hashhash.digest(): 返回最终的摘要,这是一种原始的字节形式摘要
hash.hexdigest(): 和digest()类似,但返回的长度更短,是一种16进制的字符串形式摘要

hash.copy() :复制一个hash对象

用hashlib来应用hash的算法的步骤
1 利用具体的hash算法的构造器函数来得到一个hash对象 如hashlib.md5()
2 基于bytes形式的数据,用update()来更新hash对象
3 用hexdigest()或者digest()来获得update()后的摘要

image
执行
image

image
执行
image
如上可以看出 hash.update(a) hash.update(b) 等同于hash.update(a+b)

image

执行
image

3 关于hash算法的一些应用

前面说的利用验证下载文件的完整性是一个

还有就是数据库存储的用户密码,密码都是经过加密的,但是hash算法中相同的明文输入得到的密文是一致的,大量用户设置一些简单的密码如123456 abc123等,这样,一些人就事先计算出这些简单密码的密文,然后和数据库中数据一对比,就可以倒退出来这些使用简单密码的用户
此时常用的方法就是hash+salt,salt就是在明文中加入的另一端明文如用户id,这样合成一段新的明文来生产密文,一般而言,这个salt这又内部人才知道是什么,外面的热无法利用

给数据生成一个唯一标识,当数据量很多的时候,利用hash值不同的特点,方便识别

posted @ 2023-05-27 16:31  工作手记  阅读(500)  评论(0编辑  收藏  举报