Python的hashlib提供了常见的摘要算法,如md5、sha1等
什么是摘要算法了?摘要算法又称哈希算法、散列算法。
它通过一个函数,把任意长度的数据转化魏一个长度固定的数据串(通常用十六进制的字符串表示)。
摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,可以来核对你想要的数据是否被篡改了。
摘要算法之所以能指出数据是否被篡改,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。
而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。
我们以最常见的md5为例:
importhashlib
md5= hashlib.md5() #选择摘要算法中的md5类进行实例化,得到md5
md5.update(b"everything is passible") #对一个字符串进行摘要
print(md5.hexdigest()) #找摘要算法要结果
计算结果如下:
a8c816f56c74b68e4d547769531a46d1
如果数据很大,可以分多次调用update()进行摘要,最后计算的结果是一样的:
importhashlib
md5=hashlib.md5()
md5.update(b"everything")
md5.update(b"is passible")print(md5.hexdigest())
md5是最常见的摘要算法,速度很快,生成结果是固定的128bit字节,通常用一个32位的16进制字符串表示。
另一种常见的摘要算法就是sha1,调用sha1和调用md5完全类似:
importhashlib
sha1=hashlib.sha1()
sha1.update(b"everything is passible")print(sha1.hexdigest())
计算结果:
000da64f15dce120bd685b189c3e169a1f67753b
sha1的结果是160bit字节,通常用一个40位的十六进制字符串表示。
比sha1更安全的算法是sha256和sha512,不过越安全的算法越慢,而且摘要长度更长。
hashlib一般在文件的一致性校验和加密认证这两方面使用的比较多。
由于常用口令的md5值很容易被计算出来,一般我们会添加一些操作,比如“加盐”,就是通过对原始口令加一个复杂字符串来实现。比如:
#前后加了一些特殊字符串,减少了出现的机率。
importhashlib
md5=hashlib.md5()
md5.update(b"*)_#$%^&everything is passible%^&")print(md5.hexdigest())
小结:
摘要算法在很多地方都有广泛的应用。要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改和客户验证。