1 关于hashlib与hash算法
python的hashlib提供了对hash算法的的支持,常见的算法有MD5 SHA1 SHA224等,对不同的算法,hashlib提供了一些通用的函数,以方便我们的使用
hash算法
个人理解是,它可以将任意长度的二进制值变为固定长度的二进制值。
通常,这个固定长度的二进制值叫做hash值,也叫做安全摘要,不同的输入,所计算出的hash值是不同的
更通俗化理解,就像是谍战剧发电报一样,通过hash算法,不管明文有多长,都可以把明文变化为固定长度的密文。这个密文就是hash值或者安全摘要。hash算法也有很多种,不同的算法算出的密文是不同的
下面是一个例子
执行结果
原始数据的明文变化一点点,最后的密文即摘要也会大不相同
现在把上面例子的hello加一个空格在最后面,得到的结果是
若原始数据的明文相同,使用的hash算法即加密算法相同,最后得到的密文肯定是相同的。但原始数据明文不同或者采用的hash算法不同,最后得到的结果是不同的
需要注意的,我们最后生成的密文的长度是固定的,也就是是说密文数据是有限的,但是明文是任意长度,就是说输入的数据是无限的,无限的数据对应到有限的密文数据,理论上说,可能会发生碰撞,即不同的明文得到了相同的密文,这就和前面说的hash的定义的相违背了。但现实中,要实现碰撞的效果,付出的代价非常大,而且我们可以采用更加安全的SHA384 SHA512算法,其密文的长度更长,这样,碰撞的概率就非常之小
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()后的摘要
执行
执行
如上可以看出 hash.update(a) hash.update(b) 等同于hash.update(a+b)
执行