hashlib模块是python2.5 以后出现的一个包,其主要涉及安全和加密。而且hashlib 得到openssl 的“支持” ,其支持openssl 库提供的所有算法,具体包括md5、sha1、sha224、sha256、sha512等。详细用法,可以通过pydoc hashlib 查看,这里结合两个简单的示例,看下其用法。
一、获取某字符串的md5值
比如在涉及到web 站内用户密码时,经常会将管理员帐户的密码进行md5加密后,再存入数据库。假设admin用户的密码为361way ,通过python代码可以进行如下操作:
>>> import hashlib
>>> m = hashlib.md5()
>>> m.update("361way")
>>> m.hexdigest()
4ac40dc92ce5bc8bbe3d28849f0be1e9
查看帮助时,会现还有一个digest方法。两者的区别如下:
md5.digest() 返回16字节的摘要,由传给update的string生成,摘要没有ascii字符
md5.hexdigest() 以16进制的形式返回摘要,32位
同样,还是上面的361way 字符,执行m.digest()的结果如下:
>>> m.digest()
'J\xc4\r\xc9,\xe5\xbc\x8b\xbe=(\x84\x9f\x0b\xe1\xe9'
如果对hashlib的方法十分熟练的话,上面的代码可以直接简写为如下:
>>> import hashlib
>>> hashlib.md5("361way").hexdigest()
'4ac40dc92ce5bc8bbe3d28849f0be1e9'
sha算法一样,只不过将md5方法换成相应的sha方法。不同的是sha算法执行出的结果更长,相应的比md5计算过程稍慢,所以md5经常用来做用户密码的存储。而sha1则经常用作数字签名。
二、确认文件的md5值
经常我们通过比对文件前后的md5 值 ,来确认文件是否被修改。该部分实现的代码的功能和linux 下md5sum指令的功能相同。具体代码如下:
#!/usr/bin/python
#encoding=utf-8
import io
import sys
import hashlib
import string
def printUsage():
print ('''Usage: [python] pymd5sum.py <filename>''')
def main():
if(sys.argv.__len__()==2):
#print(sys.argv[1])
m = hashlib.md5()
file = io.FileIO(sys.argv[1],'r')
bytes = file.read(1024)
while(bytes != b''):
m.update(bytes)
bytes = file.read(1024)
file.close()
#md5value = ""
md5value = m.hexdigest()
print(md5value+"\t"+sys.argv[1])
#dest = io.FileIO(sys.argv[1]+".CHECKSUM.md5",'w')
#dest.write(md5value)
#dest.close()
else:
printUsage()
main()
具体代码我存放到我的github页面上。
为避免文件过大,内存使用率过高,这里在读取文件时是以1024 byte为单位进行读取 。
其他相关模块还有hmac ,主要用于进行密码消息签名与验证。