Python(hashlib模块)(收录)

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)在这一领域也有不错的成就.