【测试开发】python系列教程:hashlib 模块

2023-08-25 08:24:41 浏览数 (1)

Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。

什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。

我们以常见的摘要算法MD5为例,计算出一个字符串的MD5值:

代码语言:javascript复制
import hashlib

md5 = hashlib.md5()
md5.update('my name is leizi'.encode('utf-8'))
print(md5.hexdigest())

那么计算出来的md5就是

代码语言:javascript复制
d7d8c24cddfb4c15b83db713badda3d3

如果数据量很大,可以分块多次调用update(),最后计算的结果是一样的:

代码语言:javascript复制
import hashlib

md5 = hashlib.md5()
md5.update('my name is leizi'.encode('utf-8'))
md5.update(" 欢迎关注雷子说测试开发".encode('utf-8'))
print(md5.hexdigest())

最后的结果

代码语言:javascript复制
96f4063331ea2c477fb3d7e980d73404

试试改动一个字母,看看计算的结果是否完全不同。

代码语言:javascript复制
import hashlib

md5 = hashlib.md5()
md5.update('my name is leizi1'.encode('utf-8'))
md5.update(" 欢迎关注雷子说测试开发 ".encode('utf-8'))
print(md5.hexdigest())

结果打印

代码语言:javascript复制
57488933f9d74f5404533d111cbbf4e4

MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit/16字节,通常用一个32位的16进制字符串表示。

另一种常见的摘要算法是SHA1,调用SHA1和调用MD5完全类似:

代码语言:javascript复制
import hashlib

sha1 = hashlib.sha1()
sha1.update('my name is leizi '.encode('utf-8'))
sha1.update('欢迎关注雷子说测试开发'.encode('utf-8'))
print(sha1.hexdigest())

结果:

代码语言:javascript复制
abbe3ae3d30736838602e9d119a2dfe016577a07

常用的属性

代码语言:javascript复制
hashlib.algorithms
#列出所有加密算法

h.digest_size
#产生的散列字节大小。

h.block_size
#哈希内部块的大小

常用方法

代码语言:javascript复制
hash.new([arg])
# 创建指定加密模式的hash对象

hash.update(arg)
# 更新哈希对象以字符串参数。如果同一个hash对象重复调用该方法,m.update(a); m.update(b) 等价于 m.update(a b)

hash.digest()
# 返回摘要,作为二进制数据字符串值。

hash.hexdigest()
# 返回摘要,作为十六进制数据字符串值

hash.copy()
# 复制

hashlib的特点

1、摘要算法在很多地方都有广泛的应用。 2、要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改。 3、它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令。

一个优秀的 hash 算法,将能实现:

代码语言:javascript复制
正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值。
逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文。
输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同。
冲突避免:很难找到两段内容不同的明文,使得它们的 hash 值一致(发生冲突)。即对于任意两个不同的数据块,其hash值相同的可能性极小;对于一个给定的数据块,找到和它hash值相同的数据块极为困难。

除了上面,我们列举的几个,库里还有

sha224(), sha256(), sha384(), sha512(), blake2b(), blake2s(),sha3_224, sha3_256, sha3_384, sha3_512, shake_128, and shake_256等加密方式。

主要的应用场景呢,就是我们的密码的加密和明文的加密,按照一定的约定去形成我们的加密的方式即可,有些时候为了避免太过于简单的加密,我们会约定一个私钥,增加加密的复杂性。

在自动化中,我还会用这个产生不一样的文件的名称,这样可以方便在自动化的过程中有区分。

0 人点赞