1. 介绍hashlib
hashlib 是一个提供了一些流行的hash算法的 Python 标准库.其中所包括的算法有 md5, sha1, sha224, sha256, sha384, sha512. 另外,模块中所定义的 new(name, string=”) 方法可通过指定系统所支持的hash算法来构造相应的hash对象.
2. hashlib的使用
- a. 各hash算法的使用示例
from hashlib import md5, sha1, sha224, sha256, sha384, sha512
from pprint import pprint
hash_funcs = [md5, sha1, sha224, sha256, sha384, sha512]
def hash_show(s):
result = []
for func in hash_funcs:
s_hash_obj = func(s)
s_hash_hex = s_hash_obj.hexdigest()
result.append((s_hash_obj.name, s_hash_hex, len(s_hash_hex)))
return result
if __name__ == '__main__':
s = 'hello python'
rs = hash_show(s)
pprint(rs)
- b. 一个 md5 的使用示例
from hashlib import md5
m1 = hashlib.md5() # 构造hash对象
m1.update('hello')
m1.update(' ')
m1.update('python')
m2 = hashlib.md5('hello python')
print m1.hexdigest() == m2.hexdigest() # 两种方式的效果相同
- c. 使用 new(name, string=”) 构造新的哈系对象
import hashlib
h = hashlib.new('ripemd160', 'hello python') # ripemd160是一个160位的hash算法. ripemd系列算法基于md4, md5.
print h.hexdigest()
3. hashlib的实现
Python 并没有在 hashlib 中提供各种hash算法的实现, 只是提供了一个接口调用.相当于 Linux下的软链接或者 Windows 下的快捷方式一样. Linux 环境下,hashlib 中各hash函数的实现在 _hashlib.x86_64-linux-gun.so 中(具体路径为 /usr/lib/python2.7/lib-dynload/_hashlib.x86_64-linux-gun.so,各不同版本或安装位置的不同,对应相关参数也不同).在系统未提供该共享库的情况下,其实现是 Python 内建的 _md5, _sha, _sha256以及 _sha512.
4. hashlib中各hash函数的介绍
- md5: Message Digest Algorithm 5(消息摘要算法第五版)
信息摘要算法可以用于确保信息传输完整一致.当然,也有用在加密上的,比如有的数据库在存储用户数据时,选择使用md5加密用户密码.也许,还有连用户名一起加密的.记得之前参加数学建模时,最终提交方案的时候就是用的md5做摘要.在 md5 之前有流行的 md2, md3与 md4 算法,后来罗纳德·李维斯特(Ronald L. Rivest.他就是rsa算法命名中的r,2002年的时候还得了图灵奖)继续改进发明了md5.该算法依然被大量使用,不过,由于其安全性问题,未来的话可能会越来越少的人继续使用了吧. - sha: Secure Hash Algorithm(安全哈希算法)
sha是美国国家标准与技术研究院与美国国家安全局设计,从94年以来被广泛使用的加密算法.sha系列中的sha1, sha224, sha2556适用于长度不超过2^64二进制位的消息。sha384和sha512适用于长度不超过2^128二进制位的消息。不过,这个也不太安全.2005年的时候国内王小云教授及其团队在sha1算法的破译上就已经取得了很大的成就.今年谷歌已经攻破了sha1算法.另外,Matthew Green(https://twitter.com/matthew_d_green)在这一领域也有不错的成就.