Python——hashlib
该模块实现了诸多安全哈希和消息摘要算法的通用接口,包括 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 ...
随机推荐
- java阻塞队列与非阻塞队列
在并发编程中,有时候需要使用线程安全的队列.如果要实现一个线程安全的队列有两种方式:一种是使用阻塞算法,另一种是使用非阻塞算法. //使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入 ...
- linux下文件描述符的查看及分析
起因 近期在调试一个Android播放内核是遇到上层传递的是fd(file descriptor),但是在文件播放结束之后调用lseek却提示返回-1,errno=29(#define ESPIPE ...
- Git修改已经提交的注释或日志
对于已经修改提交过的注释,如果需要修改,可以借助 git commit --amend 来进行.(注意:修改日志的功能在svn中需要server支持,在git中可以独立修改) 注意:必须是最近提交,还 ...
- [转]hive中自定义函数(UDAF)实现多行字符串拼接为一行
函数如何使用: hive> desc concat_test;OKa intb string hive> select * from concat_test;OK1 ...
- win8共享文件设置 详细教程
1.开放防火墙445端口 2.进入组策略,依次进入 从网络访问计算机 属性里--添加-Guest 3.进入 然后把里面的用户清空 4.打开网络和共享中心,关闭密码保护共享
- 【转】suspend造成死锁
备注:我最近的项目就遇到了这个问题.只用了一个CCriticalSection对象,并且全部都有释放.但还是死活没查出死锁的原因.最后才发现原来是suspend导致的.最终用CEvent替代了susp ...
- iOS隐藏状态栏
1.整个项目隐藏状态栏 在Targets->General->勾选中Hide status bar . 整个项目隐藏状态栏 2.单个界面隐藏状态栏,例如登录注册页面 1.首先在info.p ...
- 关于IIS下字体跨域问题
将网站的CSS与项目分离后报了一个错,是因为字体跨域的原因,查了一下资料. 解决方案如下: 1:打开访问的资源iis,在HTTP 响应表头中添加代码名称:Access-Control-Allow-Or ...
- 自己动手写Android框架-数据库框架
大家在工作中基本上都有使用到数据库框架 关系型:ORMLite,GreenDao 对象型:DB4O,Perst 这些数据库用起来都非常的简单,对于我们Android上来说这些数据库足够我们使用了,但是 ...
- 使用jquery的$.ajax向服务端传递中文,避免乱码的解决办法!
在js里,对中文使用下面的方法 encodeURIComponent(var) 函数 就ok了!