该模块实现了诸多安全哈希和消息摘要算法的通用接口,包括 FIPS 安全哈希算法: SHA1, SHA224, SHA256, SHA384 和 SHA512 算法(在 FIPS 180-2 中定义),还有  RSA 的 MD5 算法(在 RFC 1321 中定义)。“安全哈希” 和 “消息摘要” 是等价的,旧的算法被称为消息摘要,新的术语则称其为安全哈希。

  * adler32 和 crc32 算法在 zlib 模块中。

  * 某些算法存在已知的哈希冲突漏洞,请参考“六、另见”。

  目录

  一、创建 hash 对象

  二、模块属性

  三、hash 对象的属性

  四、hash 对象的方法

  五、密钥导出函数

  六、另见

一、创建 hash 对象

  每一类哈希算法对应一个构造器,调用这些构造器会返回具有相同接口的 hash 对象。

  该模块一定支持的构造器或哈希算法有: md5()sha1(),sha224(),sha256(),sha384() 和 sha512(),其他的算法则要看 Python 在你的平台上依赖的 OpenSSL 库的支持情况。

  如调用 hashlib.sha1() 来创建一个基于 SHA1 算法的 hash 对象,然后就可以用 update() 方法为其填充任意的字符串。在任意时刻都可以用 digest() 或 hexdigest() 对这个对象中已有字符串的连接求摘要。

  例如:

  获取'Nobody inspects the spammish repetition'的摘要

>>> import hashlib
>>> m = hashlib.md5()
>>> m.update("Nobody inspects")
>>> m.update(" the spammish repetition")
>>> m.digest()
'\xbbd\x9c\x83\xdd\x1e\xa5\xc9\xd9\xde\xc9\xa1\x8d\xf0\xff\xe9'
>>> m.digest_size
16
>>> m.block_size
64

  可以用更为简要的方式:

>>> hashlib.sha224("Nobody inspects the spammish repetition").hexdigest()
'a4337bc45a8fc544c03f52dc550cd6e1e87021bc896588bd79e901e2'

  一个通用的 new() 构造器也可以用来生成 hash 对象,这个构造器的第一个参数是算法的名称,这时的作用等同于具体算法对应的专用构造器。不过特定算法专用的构造器更快,应该优先使用它们。

  例如:

>>> h = hashlib.new('ripemd160')
>>> h.update("Nobody inspects the spammish repetition")
>>> h.hexdigest()
'cc4a5ce1b3df48aec5d22d1f16b894a0b894eccc'

二、模块属性

 hashlib.algorithms 
    
  一个列明该模块所支持的算法名称的元组,Python 2.7 引入。
  
 hashlib.algorithms_guaranteed 
    
  一个包含该模块跨所有平台都支持的算法名称的集合,Python 2.7.9 引入。
  
hashlib.algorithms_available
    
  一个集合,包含当前Python解释器支持的哈希算法名称,该集合中的名称传入 new() 时永远合法。algorithms_guaranteed 是这个属性的子集,同一个算法可能会在这个集合中以不同的名称出现多次(多亏了OpenSSL),Python 2.7.9 引入。
  
    
三、hash 对象的属性
hash.digest_size 
  
  结果哈希的长度(字节)
     
hash.block_size 
  
  哈希算法的内部块的长度(字节)
     
    
四、hash 对象的方法
 hash.update(arg) 
  
  用字符串参数更新 hash 对象,多次调用等于将参数连接起来调用该函数,即:m.update(a);m.update(b) 等价于 m.update(a+b)。
  Python 2.7 中的改变:The Python GIL is released to allow other threads to run while hash updates on data larger than 2048 bytes is taking place when using hash algorithms supplied by OpenSSL.
    
 hash.digest() 
  
  返回所有使用 update()方法传入的字符串的连接的摘要。长度为digest_size,可能会包含非ASCII字符,包括 null 字节。
    
 hash.hexdigest() 
 
  返回结果的长度是 digest() 方法结果的两倍,只含16进制数值,以 ASCII 字符表示,可以用在非二进制的环境中。
    
 hash.copy() 
    
  返回 hash 对象的拷贝,可以有效地计算某些具有相同子串的字符串的摘要。
    
    
五、密钥导出函数
  密钥导出(Key derivation)和密钥拉伸(key stretching)算法旨在保护密码哈希。普通的算法比如 sha1(password) 经不起暴力破解攻击,一个好的哈希算法必须是可调的,包括撒盐(salt)等。
    
 hashlib.pbkdf2_hmac(name, password, salt, rounds, dklen=None) 
  
  该函数提供 PKCS#5 基于密码的密钥导出函数,且采用 HMAC 作为伪随机函数。
  参数 name 是 HMAC 要用到的哈希摘要算法,例如:‘sha1’ 或 ‘sha256’。
  password 和 salt 被视为字节串,应用应该将 password 限制为一个合理的长度 (如:1024)。 salt 应该大约 16 或更多个 bytes,且拥有可靠的来源(如:os.urandom()
  参数 rounds 应基于算法和计算能力设置,比如 100,000 轮 SHA-256 是推荐的次数。
  参数 dklen 是导出的密钥的长度。如果 dklen 是 None 那么就用参数 name 指定的哈希算法的摘要长度,比如SHA-512为64。
  Python 2.7.8 引入
>>> import hashlib, binascii
>>> dk = hashlib.pbkdf2_hmac('sha256', b'password', b'salt', 100000)
>>> binascii.hexlify(dk)
b'0394a2ede332c9a13eb82e9b24631604c31df978b4e2f0fbd2c549944f9d79a5'

  *注意:

  pbkdf2_hmac 的一个快速实现版本可以使用OpenSSL, Python 的实现使用了行内的 hmac 版本。这样更慢,耗时大概是前者的三倍,不会释放GIL。

六、另见:
  关于安全哈希算法的 FIPS 180-2 文档
  维基百科中关于某些哈希算法存在的问题的介绍

Python——hashlib的更多相关文章

  1. python hashlib模块 md5加密 sha256加密 sha1加密 sha512加密 sha384加密 MD5加盐

      python hashlib模块   hashlib hashlib主要提供字符加密功能,将md5和sha模块整合到了一起,支持md5,sha1, sha224, sha256, sha384, ...

  2. python hashlib、configparse、logging

    一.hashlib 1.Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等.     2.摘要算法 通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目 ...

  3. Python hashlib加密模块

    hashlib模块 简介: hashlib模块是一个提供了字符串加密功能的模块,包含MD5和SHA的加密算法.具体的加密支持有: MD5,sha1,sha224,sha256, sha384, sha ...

  4. python hashlib 详解

    1.概述 摘要算法简介 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定 ...

  5. python hashlib模块

    用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 import hashlib m=hash ...

  6. Python hashlib模块 (主要记录md5加密)

    python提供了一个进行hash加密的模块:hashlib 下面主要记录下其中的md5加密方式(sha1加密一样把MD5换成sha1) >>> import hashlib > ...

  7. Python hashlib 无法打印

    # !/user/bin/python # -*- coding: utf-8 -*- import hashlib # 可提供MD5算法 , 防止内页被篡改 (若内页未被篡改, MD5的值是不变的) ...

  8. 关于python hashlib模块的使用

    hashlib hashlib主要提供字符加密功能,将md5和sha模块整合到了一起,支持md5,sha1, sha224, sha256, sha384, sha512等算法 #!/usr/bin/ ...

  9. python hashlib模块学习

    目录 hashlib 模块 破解密码 hmac 模块 hashlib 模块 1.干嘛用的: 对字符进行加密,其实就是一个自定义的字符编码表,我们原来接触的是计算机语言0和1然后转化成字符,而hashl ...

随机推荐

  1. iOS开发之按钮的基本使用

    实现功能: 点击向上的箭头,按钮图片向上,移动,点击向下的箭头,按钮图片向下移动 点击向左的箭头,按钮图片向左移动,点击向右的箭头,按钮图片向右移动, 点击加号图片放大,点击减号,图片缩小 第一步: ...

  2. 深入HBase架构解析(二)【转】

    转自:http://www.blogjava.net/DLevin/archive/2015/08/22/426950.html 前言 这是<深入HBase架构解析(一)>的续,不多废话, ...

  3. 深入HBase架构解析(一)[转]

    前记 公司内部使用的是MapR版本的Hadoop生态系统,因而从MapR的官网看到了这篇文文章:An In-Depth Look at the HBase Architecture,原本想翻译全文,然 ...

  4. 玩转Bootstrap(JS插件篇)-第1章 模态弹出框 :1-1导入JavaScript插件

    导入JavaScript插件 Bootstrap除了包含丰富的Web组件之外,如前面介绍的下拉菜单.按钮组.导航.分页等.他还包括一些JavaScript的插件. Bootstrap的JavaScri ...

  5. linux 的内核的作用和功能

    Linux内核[kernel]是整个操作系统的最底层, 它负责整个硬件的驱动,以及提供各种系统所需的核心功能, 包括防火墙机制.是否支持LVM或Quota等文件系统等等, 如果内核不认识某个最新的硬件 ...

  6. Eigen教程(2)

    整理下Eigen库的教程,参考:http://eigen.tuxfamily.org/dox/index.html Matrix类 在Eigen,所有的矩阵和向量都是Matrix模板类的对象,Vect ...

  7. button上传替换file上传按钮,并显示图片缩略图,纯jsp操作

    1.jsp代码 <div class="inputBox"> <span id="tu" <c:if test="${pd = ...

  8. php阿里云oss文件上传

    php的文件上传 文件上传 php的文件上传放在了$_FILES数组里,单文件和多文件上传的区别在于$_FILES['userfile']['name']是否为数组, 不熟悉的可以读一下官方文档 单文 ...

  9. Oracle 报错:PLS-00201: 必须声明标识符

    原因:调用其他用户的包或存储过程. 解决方法:在被调用的包或存储过程的用户下授权执行权限给调用用户: grant execute on 包名 to 用户名;

  10. Linxu磁盘分区

    http://vbird.dic.ksu.edu.tw/linux_basic/0130designlinux.php#hardware_know(好文章) http://blog.chinaunix ...