该模块实现了诸多安全哈希和消息摘要算法的通用接口,包括 FIPS 安全哈希算法: SHA1, SHA224, SHA256, SHA384 和 SHA512 算法(在 FIPS 180-2 中定义),还有 RSA 的 MD5 算法(在 RFC 1321 中定义)。“安全哈希” 和 “消息摘要” 是等价的,旧的算法被称为消息摘要,新的术语则称其为安全哈希。
* adler32 和 crc32 算法在 zlib 模块中。
* 某些算法存在已知的哈希冲突漏洞,请参考“六、另见”。
目录
一、创建 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。
Python——hashlib的更多相关文章
-
python hashlib模块 md5加密 sha256加密 sha1加密 sha512加密 sha384加密 MD5加盐
python hashlib模块 hashlib hashlib主要提供字符加密功能,将md5和sha模块整合到了一起,支持md5,sha1, sha224, sha256, sha384, ...
-
python hashlib、configparse、logging
一.hashlib 1.Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 2.摘要算法 通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目 ...
-
Python hashlib加密模块
hashlib模块 简介: hashlib模块是一个提供了字符串加密功能的模块,包含MD5和SHA的加密算法.具体的加密支持有: MD5,sha1,sha224,sha256, sha384, sha ...
-
python hashlib 详解
1.概述 摘要算法简介 Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度固定 ...
-
python hashlib模块
用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 import hashlib m=hash ...
-
Python hashlib模块 (主要记录md5加密)
python提供了一个进行hash加密的模块:hashlib 下面主要记录下其中的md5加密方式(sha1加密一样把MD5换成sha1) >>> import hashlib > ...
-
Python hashlib 无法打印
# !/user/bin/python # -*- coding: utf-8 -*- import hashlib # 可提供MD5算法 , 防止内页被篡改 (若内页未被篡改, MD5的值是不变的) ...
-
关于python hashlib模块的使用
hashlib hashlib主要提供字符加密功能,将md5和sha模块整合到了一起,支持md5,sha1, sha224, sha256, sha384, sha512等算法 #!/usr/bin/ ...
-
python hashlib模块学习
目录 hashlib 模块 破解密码 hmac 模块 hashlib 模块 1.干嘛用的: 对字符进行加密,其实就是一个自定义的字符编码表,我们原来接触的是计算机语言0和1然后转化成字符,而hashl ...
随机推荐
-
Thinkphp的初级注意点
开头话: 网站,说实话,是第一次做,也就直接选择了ThinkPHP这个开源框架.选择这个框架的原因...已经不记得了 貌似在我当时的认知中只有这个了,其它更优秀的框架也是这个毕业设计做到后期再去了解的 ...
-
$(";#id";).val()取值textarea是";";
今天取值的时候,判断是null可以通过,证明不是null,明明是空的. 判断是''通过,证明取出来的是''空字符串.
-
C++11 并发指南三(Lock 详解)
在 <C++11 并发指南三(std::mutex 详解)>一文中我们主要介绍了 C++11 标准中的互斥量(Mutex),并简单介绍了一下两种锁类型.本节将详细介绍一下 C++11 标准 ...
-
function设置jsp页面使用js控制文本框只读,并且按下backspace删除按钮后停在原页面
最近一直在学习function设置之类的问题,现在正好有机会和大家分享一下. 设置只读 document.getElementById("projcode").setAttribu ...
-
content = ";IE=edge,chrome=1"; 详解
content = "IE=edge,chrome=1" 详解 < meta http-equiv = "X-UA-Compatible" content ...
-
[Hapi.js] Up and running
hapi is a rock solid server framework for Node.js. Its focus on modularity and configuration-over-co ...
-
在QEMU中调试ARM程序【转】
转自:http://linuxeden.com/html/develop/20100820/104409.html 最近我想调试一个运行在QEMU模拟ARM系统中的Linux程序.我碰到过一些麻烦,因 ...
-
EFCore+Mysql仓储层建设(分页、多字段排序、部分字段更新)
前沿 园子里已有挺多博文介绍了EFCore+Mysql/MSSql如何进行使用,但实际开发不会把EF层放在Web层混合起来,需要多个项目配合结构清晰的进行分层工作,本文根据个人实践经验总结将各个项目进 ...
-
vim相关
保存和传递宏 1 先建立一个宏.如上 2 在任意一个文件的空白位置normal状态下,命令"ap 即可以把宏的内容显示出来.比如说我的宏是: "ohello th id<80 ...
-
PHP更改自动加载的顺序
composer的锅 自从PHPer们用上了composer后,对于传统的加载方式倒是不会用了,可谓是"收之东隅,失之桑榆". 下面说一下怎么改变加载顺序来覆写Laravel中的h ...