Python3 hashlib密码散列算法原理详解


Posted in Python onMarch 30, 2020

1.hashlib密码散列

hashlib模块定义了一个API来访问不同的密码散列算法。要使用一个特定的散列算法,可以用适当的构造器函数或new()来创建一个散列对象。不论使用哪个具体的算法,这些对象都使用相同的API。

1.1 散列算法

由于hashlib有OpenSSL提供“底层支持”,所以OpenSSL库提供的所有算法都可用,包括:

  • md5
  • sha1
  • sha224
  • sha256
  • sha384
  • sha512

有些算法在所有平台上都可用,而有些则依赖于底层库。这两种算法分别由algorithms_guaranteed和algorithms_available提供。

import hashlib
print('Guaranteed:\n{}\n'.format(
  ', '.join(sorted(hashlib.algorithms_guaranteed))))
print('Available:\n{}'.format(
  ', '.join(sorted(hashlib.algorithms_available))))

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

1.2 MD5示例

要为一个数据块(在这里就是转换为一个字节串的Unicode串)计算MD5散列或摘要,首先要创建散列对象,然后增加数据,最后调用digest()或hexdigest()。

import hashlib
lorem = '''Lorem ipsum dolor sit amet, consectetur adipisicing
elit, sed do eiusmod tempor incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis nostrud exercitation
ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis
aute irure dolor in reprehenderit in voluptate velit esse cillum
dolore eu fugiat nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui officia deserunt
mollit anim id est laborum.'''
h = hashlib.md5()
h.update(lorem.encode('utf-8'))
print(h.hexdigest())

这个例子使用了hexdigest()方法而不是digest(),因为要格式化输出以便清楚的打印。如果可以接受二进制摘要值,那么可以使用digest()。

Python3 hashlib密码散列算法原理详解

1.3 SHA1示例

SHA1摘要也用同样的方式计算。

import hashlib
lorem = '''Lorem ipsum dolor sit amet, consectetur adipisicing
elit, sed do eiusmod tempor incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis nostrud exercitation
ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis
aute irure dolor in reprehenderit in voluptate velit esse cillum
dolore eu fugiat nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui officia deserunt
mollit anim id est laborum.'''
h = hashlib.sha1()
h.update(lorem.encode('utf-8'))
print(h.hexdigest())

这个例子中的摘要值有所不同,因为MD5和SHA1算法不同。

Python3 hashlib密码散列算法原理详解

1.4 增量更新

散列计算器的update()方法可以反复调用。每次调用时,都会根据提供的附加文本更新摘要。增量更新比将整个文件读入内存更高效,而且能生成相同的结果。

import hashlib
lorem = '''Lorem ipsum dolor sit amet, consectetur adipisicing
elit, sed do eiusmod tempor incididunt ut labore et dolore magna
aliqua. Ut enim ad minim veniam, quis nostrud exercitation
ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis
aute irure dolor in reprehenderit in voluptate velit esse cillum
dolore eu fugiat nulla pariatur. Excepteur sint occaecat
cupidatat non proident, sunt in culpa qui officia deserunt
mollit anim id est laborum.'''
h = hashlib.md5()
h.update(lorem.encode('utf-8'))
all_at_once = h.hexdigest()
def chunkize(size, text):
  "Return parts of the text in size-based increments."
  start = 0
  while start < len(text):
    chunk = text[start:start + size]
    yield chunk
    start += size
  return
h = hashlib.md5()
for chunk in chunkize(64, lorem.encode('utf-8')):
  h.update(chunk)
line_by_line = h.hexdigest()
print('All at once :', all_at_once)
print('Line by line:', line_by_line)
print('Same    :', (all_at_once == line_by_line))

这个例子展示了读取或生成数据时如何以增量方式更新一个摘要。

Python3 hashlib密码散列算法原理详解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用于统计项目中代码总行数的Python脚本分享
Apr 21 Python
python中OrderedDict的使用方法详解
May 05 Python
Python实现字典按照value进行排序的方法分析
Dec 23 Python
对python Tkinter Text的用法详解
Oct 11 Python
Python检查和同步本地时间(北京时间)的实现方法
Dec 03 Python
python使用正则筛选信用卡
Jan 27 Python
详细介绍Python进度条tqdm的使用
Jul 31 Python
python scrapy爬虫代码及填坑
Aug 12 Python
Python K最近邻从原理到实现的方法
Aug 15 Python
Python 实现自动导入缺失的库
Oct 29 Python
解决tensorflow打印tensor有省略号的问题
Feb 04 Python
Python解释器以及PyCharm的安装教程图文详解
Feb 26 Python
django xadmin action兼容自定义model权限教程
Mar 30 #Python
使用Django xadmin 实现修改时间选择器为不可输入状态
Mar 30 #Python
Django admin 实现search_fields精确查询实例
Mar 30 #Python
Django模型中字段属性choice使用说明
Mar 30 #Python
Django+python服务器部署与环境部署教程详解
Mar 30 #Python
Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解
Mar 30 #Python
django自定义非主键自增字段类型详解(auto increment field)
Mar 30 #Python
You might like
ThinkPHP CURD方法之where方法详解
2014/06/18 PHP
php使用Jpgraph绘制3D饼状图的方法
2015/06/10 PHP
PHP中PDO的事务处理分析
2016/04/07 PHP
PHP编译configure时常见错误的总结
2017/08/17 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
javascript中最常用的继承模式 组合继承
2010/08/12 Javascript
基于jquery的自定义鼠标提示效果 jquery.toolTip
2010/11/14 Javascript
JavaScript语言对Unicode字符集的支持详解
2014/12/30 Javascript
简单实现js间歇或无缝滚动效果
2016/06/29 Javascript
JS实现重新加载当前页面或者父页面的几种方法
2016/11/30 Javascript
JS限定手机版中图片大小随分辨率自动调整的方法
2016/12/05 Javascript
React如何将组件渲染到指定DOM节点详解
2017/09/08 Javascript
Vue使用Clipboard.JS在h5页面中复制内容实例详解
2019/09/03 Javascript
JavaScript实现指定数量的并发限制的示例代码
2020/03/10 Javascript
JavaScript代理模式原理与用法实例详解
2020/03/10 Javascript
jQuery实现简单弹幕制作
2020/12/10 jQuery
[15:58]DOTA2国际邀请赛采访专栏:Tongfu.Sansheng&KingJ,DK.rOtk
2013/08/08 DOTA
[48:48]VGJ.T vs Liquid 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
Python实现的批量下载RFC文档
2015/03/10 Python
Python中使用第三方库xlrd来写入Excel文件示例
2015/04/05 Python
对于Python编程中一些重用与缩减的建议
2015/04/14 Python
Python3 适合初学者学习的银行账户登录系统实例
2017/08/08 Python
python 寻找优化使成本函数最小的最优解的方法
2017/12/28 Python
Python实现识别手写数字 简易图片存储管理系统
2018/01/29 Python
Python实现求一个集合所有子集的示例
2018/05/04 Python
Python增强赋值和共享引用注意事项小结
2019/05/28 Python
Python完成哈夫曼树编码过程及原理详解
2019/07/29 Python
pycharm2020.1.2永久破解激活教程,实测有效
2020/10/29 Python
DNA测试:Orig3n
2019/03/01 全球购物
二手房购房意向书范本
2014/04/01 职场文书
商场消防安全责任书
2014/07/29 职场文书
少先队活动总结
2014/08/29 职场文书
县人大领导班子四风对照检查材料思想汇报
2014/10/09 职场文书
期末考试复习计划
2015/01/19 职场文书
2016年党员学习廉政准则心得体会
2016/01/20 职场文书
JavaScript模拟实现网易云轮播效果
2022/04/04 Javascript