python hashlib模块简介

python hashlib模块简介

一、hashlib模块里有什么

hashlib模块提供了多种安全散列和消息摘要算法的公共接口。
校验和算法adler32或crc32则在zlib模块中提供。[1]

在hashlib模块中,sha1()、sha224()、sha256()、sha384()、sha512()和blake2b()、blake2s()方法总是存在的。
md5()方法通常也是可用的。如果使用了罕见的兼容美国联邦信息处理标准(FIPS compliant)的python,则md5()可能会不能用(MD5的安全性不够高的原因)。
其它算法是否可用依赖于python所在操作系统的OpenSSL库。在大多数操作系统中,sha3_224()、sha3_256()、sha3_384()、sha3_512()和shake_128()、shake_256()是可用的。
具体哪些散列算法能用,可以用下面的常量来查看。

使用前先导入:
import hashlib

可以使用常量:
hashlib.algorithms_available 或 hashlib.algorithms_guaranteed来获取本模块支持的散列算法集合。

hashlib.algorithms_available

返回可用的散列函数名集合。包含了sha384,sha521,md5等32个散列函数。
注意,相同的函数可能会以不同名字(大小写)出现多次。

{'RIPEMD160', 'sha224', 'sha3_224', 'SHA384', 'blake2s', 'blake2b', 
'sha3_512', 'sha1', 'DSA', 'ripemd160', 'sha3_384', 'sha3_256', 
'sha', 'shake_128', 'sha512', 'ecdsa-with-SHA1', 'shake_256', 
'SHA', 'SHA512', 'dsaEncryption', 'MD5', 'SHA256', 'DSA-SHA', 
'whirlpool', 'MD4', 'dsaWithSHA', 'SHA224', 'sha256', 'md4', 
'sha384', 'md5', 'SHA1'}

hashlib.algorithms_guaranteed

返回本模块支持的散列函数名集合。包含了sha3_256、md5等14个散列函数。此时没有大小写问题了。
algorithms_guaranteed返回结果是 algorithms_available返回结果的子集。

{'shake_256', 'sha224', 'sha3_224', 'blake2s', 'blake2b', 
'sha3_512', 'sha1', 'shake_128', 'sha3_384', 'sha256', 
'sha3_256', 'sha384', 'md5', 'sha512'}

二、散列算法的应用场景

这些散列函数经常应用于一致性验证、数字签名、安全访问认证等场合。[2]
比如用MD5(信息摘要算法第5版)进行文件一致性验证。
每个文件的MD5值就像是这个文件的“数字指纹”。如果任何人对文件做了任何改动,其MD5值也就是对应的“数字指纹”就会发生变化。
在软件下载操作中,通过比较前后这两个MD5值是否相同,就能判断下载的文件是否出错,或者说下载的文件是否被篡改了。

某下载文件的MD5值

三、使用示例

blake2b
blake2s

md5

sha1

sha224
sha256
sha384
sha512

sha3_224
sha3_256
sha3_384
sha3_512

shake_128
shake_256

这些散列算法的使用方式都是相同的,因为它们返回的都是具有相同接口的散列对象。
比如使用sha256()方法创建SHA-256散列对象,用字节型数据当参数调用update()方法,
用digest()或hexdigest()方法获得相应的摘要信息。

演示代码如下:


#coding=utf-8

import hashlib

text = b'hello world.'
hs = hashlib.sha256()
hs.update(text)
out_text = hs.hexdigest()
print(text, '\n==> ', out_text)

# 内容是中文时注意编码转换
msg = '代码小工蚁'.encode('utf-8')
msg_hs = hashlib.sha256()
msg_hs.update(msg)
out_msg = msg_hs.hexdigest()
print(msg, '\n==> ', out_msg)
print(len(out_msg))  # 长度64位

注意:
1、update()方法的参数要是字节型,英文字符可以在字符串前加b来标识,中文等非ASCII字符要进行编码转换。
如:msg = '代码小工蚁'.encode('utf-8')
msg = bytes('代码小工蚁', encoding='utf-8')

2、对同一个hash对象进行update()操作实际上相当于参数拼接后的update()。
即hs.update(b'abc'),再来hs.update(b'def'),相当于hs.update(b'abc' + b'def'),同hs.update(b'abcdef')

3、散列对象的hexdigest()方法返回字符型摘要信息(处理结果),digest()返回的是字节型的摘要信息。

百度翻译API的代码片断:

    # 申请API地址:
    #       http://api.fanyi.baidu.com/api/trans/product/index
    appid = '2018***********78'
    secretKey = 'Qw6n**************fW'
    myurl = 'http://api.fanyi.baidu.com/api/trans/vip/translate'
    q = trans_text
    fromLang = 'en'
    toLang = 'zh'
    salt = random.randint(32768, 65536)
    sign = appid+q+str(salt)+secretKey
    m1 = hashlib.md5()
    m1.update(sign.encode('utf-8'))
    sign = m1.hexdigest()
    myurl = myurl+'?appid='+appid+'&q='+quote(q)+'&from='+fromLang+'&to='+toLang+'&salt='+str(salt)+'&sign='+sign

代码说明:
百度翻译API使用的md5()方法。
salt = random.randint(32768, 65536)
使用随机整数“加盐”(增加额外的信息,提高复杂度,使信息摘要更有隐蔽性)

四、存在问题及发展

SHA-1存在严重的安全问题。2017年2月份,CWI Amsterdam和Google宣布实现对SHA-1碰撞攻击。
(总计约900万兆次SHA1计算。完成攻击的首个阶段需要单一CPU计算6500年。)[3]
SHA-2家族包括:SHA-256、SHA-384和SHA-512以及SHA-224。
SHA-3竞赛获胜算法Keccak算法成为SHA-3,也是一个哈希家族。
BLAKE2的定位是目前安全系数最高的哈希函数。其中:
BLAKE2b是BLAKE的64位版本,它可以生成最高512位的任意长度哈希。
BLAKE2s是BLAKE的32位版本,它可以生成最高256位的任意长度哈希。
BLAKE2的速度比MD5、SHA-1要快。[4]

各种散列函数速度对比图片来源:http://www.blake2.net/

有人说,只需要一个智能手机30秒就能破解md5。[3]
我尝试了一下,8位0-9纯数字的MD5暴力破解花了约140秒。
看来程序还要优化。

* 所有示例在WIN7 64位系统上执行python3.6.1通过。


[1]hashlib (python 3.6)官方文档:
https://docs.python.org/3.6/library/hashlib.html#hash-algorithms

[2]百度百科:MD5、SHA家族

[3]SHA-1被破解始末
https://mp.weixin.qq.com/s/ND9zg3YJmi13OHN28hP5QQ

[4]BLAKE2简介
https://blog.csdn.net/u010129119/article/details/79105208

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 常用模块 认识模块 什么是模块 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文...
    go以恒阅读 1,932评论 0 6
  • 这篇文章主要讲述在Mobile BI(移动商务智能)开发过程中,在网络通信、数据存储、登录验证这几个方面涉及的加密...
    雨_树阅读 2,330评论 0 6
  • 常用模块学习 什么是模块? 为了维护代码 提高代码的可维护性; 使用模块可以避免函数名和变量名冲突; 可重用 模块...
    drfung阅读 687评论 1 1
  • 2017年9月8日觉察日记+尚军伟+9号 今天上午找领导汇报项目方案,领导听完之后非常满意。其实说实话,连我自己都...
    浩子爸阅读 403评论 1 6
  • 掌门_艾老师阅读 197评论 0 0