摘要算法简介
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。
什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
举个例子,你写了一篇文章,内容是一个字符串'how to use python hashlib - by Michael'
,并附上这篇文章的摘要是'2d73d4f15c0db7f5ecb321b6a65e5d6d'
。如果有人篡改了你的文章,并发表为'how to use python hashlib - by Bob'
,你可以一下子指出Bob篡改了你的文章,因为根据'how to use python hashlib - by Bob'
计算出的摘要不同于原始文章的摘要。
可见,摘要算法就是通过摘要函数f()
对任意长度的数据data
计算出固定长度的摘要digest
,目的是为了发现原始数据是否被人篡改过。
摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)
很容易,但通过digest
反推data
却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。
我们以常见的摘要算法MD5为例,计算出一个字符串的MD5值:
1 #!/usr/bin/env python 2 # -*- coding: UTF-8 -*- 3 import hashlib 4 5 PRIVATE_KEY = 'key'#防止用默认的md5映射表反解密码,可以在md5()调用时加入自己的key 6 hash1 = hashlib.md5(bytes(PRIVATE_KEY, encoding='utf-8')) 7 hash1.update(bytes('admin', encoding='utf-8')) 8 print(hash1.digest())#返回二进制摘要信息 9 print(hash1.hexdigest())#返回16进制摘要信息
b'\xf6\xc4Zq)l\x1de\xdb8%\xa7\xdcx\x1b\xc8'
f6c45a71296c1d65db3825a7dc781bc8
MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。
另一种常见的摘要算法是SHA1,调用SHA1和调用MD5完全类似:
1 #!/usr/bin/env python 2 # -*- coding: UTF-8 -*- 3 import hashlib 4 5 PRIVATE_KEY = 'key'#防止用默认的md5映射表反解密码,可以在md5()调用时加入自己的key 6 hash2 = hashlib.sha1(bytes(PRIVATE_KEY, encoding='utf-8')) 7 hash2.update(bytes('admin', encoding='utf-8')) 8 print(hash2.digest()) 9 print(hash2.hexdigest())
b'6#i\xc2\xea\xbf$[J\xa4\x13\x99:}!g\x04D\xf5i' 362369c2eabf245b4aa413993a7d21670444f569
SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示。
小结
摘要算法在很多地方都有广泛的应用。要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改,但是它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令。
以下是一个生成md5密文的函数:
1 def gen_md5_password(password): 2 hash_pwd = hashlib.md5(bytes(PRIVATE_KEY, encoding='utf-8')) 3 hash_pwd.update(bytes(password, encoding='utf-8')) 4 ret = hash_pwd.hexdigest() 5 return ret