python hashlib模块及md5() 、sha()

2015年3月22日 发表评论 阅读评论

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 ,主要用于进行密码消息签名与验证。




本站的发展离不开您的资助,金额随意,欢迎来赏!

You can donate through PayPal.
My paypal id: itybku@139.com
Paypal page: https://www.paypal.me/361way

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.