[Python模块学习]用hashlib模块生成消息摘要

来源:互联网 发布:雪梨网红淘宝店链接 编辑:程序博客网 时间:2024/05/15 23:51

hashlib模块

by: uizuizui


功能描述:hashlib模块实现了许多不同种类的安全散列(消息摘要)算法,并提供了相应的接口。hashlib模块用于生成hash对象,hash对象则使用指定的算法生成消息摘要。


一、生成hash对象

生成hash对象有两种途径:

  1. 使用与算法名字相同的构造器生成。由于需要兼容不同的平台,hashlib模块仅提供了6种可以兼容所有平台的构造器。分别是:md5()、sha1()、sha224()、sha256()、sha384()和sha512()。这些构造器生成的hash对象可以运行在任何环境中。

    import hashlibhash = hashlib.md5()type(hash)# <class '_hashlib.HASH'>
  2. new(name, data=b”)函数。该函数第一个参数name代表需要使用的Hash算法的名字(str类型)。第二个参数data代表生成消息摘要的源数据,这个参数必须为bytes类型。(不可以传入str类型,因为str和bytes在本质上是不同的,相关信息请自行查阅,博主后面也会写一篇文讲Python上的编码)new函数会对name参数进行检查,确保可以调用正确的Hash算法。

    import hashlibhash = hashlib.new('md5') # 第二个参数不是必选type(hash)# <class '_hashlib.HASH'>

注意:使用第一种方式生成hash对象会比第二种方式快,因为第二种方式还需要在内部进行检查和适配算法。所以在明确需要使用的算法在hashlib提供的构造器范围内时,应当尽可能使用第一种方式。


二、查看hashlib支持的算法集合

使用hashlib提供的字段可以查看系统支持的算法:

  1. hashlib.algorithms_guaranteed,返回一个集合,该集合包含由模块支持的所有Hash算法。(也就是上面提到的6种)

  2. hashlib.algorithms_available,返回一个集合,该集合包含所有可以在Python解释器运行的Hash算法。(由OpenSSL提供)hashlib.algorithms_guaranteed永远是该集合的子集。相同的算法可能会以不同名字(大小写)在该集合中出现多次。

import hashlibprint(hashlib.algorithms_guaranteed)# {'sha512', 'sha384', 'sha1', 'md5', 'sha224', 'sha256'}print(hashlib.algorithms_available)# {'SHA1', 'sha384', 'dsaWithSHA', 'RIPEMD160', 'ecdsa-with-SHA1', 'sha1', 'MD5', 'md5', 'sha224', 'sha', 'SHA512', 'whirlpool', 'sha512', 'SHA', 'SHA224', 'md4', 'DSA-SHA', 'SHA384', 'dsaEncryption', 'MD4', 'ripemd160', 'SHA256', 'sha256', 'DSA'}

三、hash对象公用接口

无论使用哪种构造器生成出来的hash对象,接口都是相同的。

  1. update(arg)函数。该函数为hash对象提供源。参数和new函数的data参数一样必须是bytes。重复调用这个函数,后面的数据会累加。也就是说:hash.update(m);hash.update(n)等于hash.update(m+n)。

  2. digest()。返回Hash算法计算得到的消息摘要,bytes类型。

  3. hexdigest()。返回消息摘要的十六进制形式,str类型。

  4. copy()。返回调用该函数的hash对象的一个拷贝。当需要形成消息摘要的数据有共同的子串时有用。

  5. digest_size。int值,代表Hash算法返回值的字长。

  6. block_size。int值,代表Hash算法内部块的字长。

  7. name。str类型,代表hash对象使用的Hash算法名字。在部分平台上无法读取

示例代码:

import hashlibhash = hashlib.md5()hash.update(b'hello')print(hash.digest())# b']A@*\xbcK*v\xb9q\x9d\x91\x10\x17\xc5\x92'print(hash.hexdigest())# '5d41402abc4b2a76b9719d911017c592'print(hash.digest_size)# 16print(hash.block_size)# 64print(hash.name)# 'md5'

四、对密码进行加密

使用普通的Hash算法并不安全,很容易被暴力破解。所以在对密码进行加密时可以使用更安全的pbkdf2_hmac。

pbkdf2_hmac(hash_name, password, salt, iterations, dklen=None)

  1. hash_name指加密算法的名字。比如:sha1、sha256等。
  2. password指要加密的密码。为字节串。
  3. salt指撒盐法,可以由os.urandom(n)生成,字节串,长度一般要大于16。
  4. iterations指循环次数。越大越好,官方文档里建议调用SHA-256时以2013年的计算能力至少在十万次以上。
  5. 如果dklen=None,指返回的密钥的长度,会根据加密算法来定返回的digest的长度。

OpenSSL提供了一个pbkdf2_hmac的快速实现版本,比Python自带的快。


以上内容参考hashlib模块官方文档:
https://docs.python.org/3.5/library/hashlib.html#hash-algorithms

第四节内容参考自:
http://blog.csdn.net/python_tty/article/details/50937287
http://www.cnblogs.com/Security-Darren/p/4169423.html

感谢以上内容提供者,感谢模块提供者和OpenSSL。

0 0
原创粉丝点击