hashlib模块是python2.5 以后出现的一个包,其主要涉及安全和加密。而且hashlib 得到openssl 的“支持” ,其支持openssl 库提供的所有算法,具体包括md5、sha1、sha224、sha256、sha512等。详细用法,可以通过pydoc hashlib 查看,这里结合两个简单的示例,看下其用法。

一、获取某字符串的md5值

比如在涉及到web 站内用户密码时,经常会将管理员帐户的密码进行md5加密后,再存入数据库。假设admin用户的密码为361way ,通过python代码可以进行如下操作:

1>>> import hashlib
2>>> m = hashlib.md5()
3>>> m.update("361way")
4>>> m.hexdigest()
54ac40dc92ce5bc8bbe3d28849f0be1e9

查看帮助时,会现还有一个digest方法。两者的区别如下:

  • md5.digest() 返回16字节的摘要,由传给update的string生成,摘要没有ascii字符
  • md5.hexdigest() 以16进制的形式返回摘要,32位

同样,还是上面的361way 字符,执行m.digest()的结果如下:

1>>> m.digest()
2'J\xc4\r\xc9,\xe5\xbc\x8b\xbe=(\x84\x9f\x0b\xe1\xe9'

如果对hashlib的方法十分熟练的话,上面的代码可以直接简写为如下:

1>>> import hashlib
2>>> hashlib.md5("361way").hexdigest()
3'4ac40dc92ce5bc8bbe3d28849f0be1e9'

sha算法一样,只不过将md5方法换成相应的sha方法。不同的是sha算法执行出的结果更长,相应的比md5计算过程稍慢,所以md5经常用来做用户密码的存储。而sha1则经常用作数字签名

二、确认文件的md5值

经常我们通过比对文件前后的md5 值 ,来确认文件是否被修改。该部分实现的代码的功能和linux 下md5sum指令的功能相同。具体代码如下:

 1#!/usr/bin/python
 2#encoding=utf-8
 3import io
 4import sys
 5import hashlib
 6import string
 7def printUsage():
 8    print ('''Usage: [python] pymd5sum.py <filename>''')
 9def main():
10    if(sys.argv.__len__()==2):
11        #print(sys.argv[1])
12        m = hashlib.md5()
13        file = io.FileIO(sys.argv[1],'r')
14        bytes = file.read(1024)
15        while(bytes != b''):
16                m.update(bytes)
17                bytes = file.read(1024)
18        file.close()
19        #md5value = ""
20        md5value = m.hexdigest()
21        print(md5value+"\t"+sys.argv[1])
22        #dest = io.FileIO(sys.argv[1]+".CHECKSUM.md5",'w')
23        #dest.write(md5value)
24        #dest.close()
25    else:
26        printUsage()
27main()

具体代码我存放到我的github页面上。为避免文件过大,内存使用率过高,这里在读取文件时是以1024 byte为单位进行读取 。其他相关模块还有hmac ,主要用于进行密码消息签名与验证。