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基础教程之基本内置数据类型介绍
Feb 20 Python
Python学习笔记(一)(基础入门之环境搭建)
Jun 05 Python
在Python中使用Mako模版库的简单教程
Apr 08 Python
python插入排序算法实例分析
Jul 03 Python
Python3中的真除和Floor除法用法分析
Mar 16 Python
更改Ubuntu默认python版本的两种方法python-&gt; Anaconda
Dec 18 Python
django轻松使用富文本编辑器CKEditor的方法
Mar 30 Python
python实现彩票系统
Jun 28 Python
Python中的heapq模块源码详析
Jan 08 Python
Pandas聚合运算和分组运算的实现示例
Oct 17 Python
Python3.6 中的pyinstaller安装和使用教程
Mar 16 Python
Python中openpyxl实现vlookup函数的实例
Oct 28 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
获得Google PR值的PHP代码
2007/01/28 PHP
ThinkPHP分组下自定义标签库实例
2014/11/01 PHP
php 实现一个字符串加密解密的函数实例代码
2016/11/01 PHP
yii框架使用分页的方法分析
2019/07/25 PHP
33种Javascript 表格排序控件收集
2009/12/03 Javascript
jquery实现树形二级菜单实例代码
2013/11/20 Javascript
jquery使用正则表达式验证email地址的方法
2015/01/22 Javascript
js控制网页前进和后退的方法
2015/06/08 Javascript
移除AngularJS下URL中的#字符的方法
2015/06/19 Javascript
浅谈javascript中关于日期和时间的基础知识
2016/07/13 Javascript
js实现3d悬浮效果
2017/02/16 Javascript
在javaScript中检测数据类型的几种方式小结
2017/03/04 Javascript
bootstrap daterangepicker汉化以及扩展功能
2017/06/15 Javascript
JS 实现banner图片轮播效果(鼠标事件)
2017/08/04 Javascript
Angular弹出模态框的两种方式
2017/10/19 Javascript
微信小程序访问豆瓣电影api的实现方法
2019/03/31 Javascript
使vue实现jQuery调用的两种方法
2019/05/12 jQuery
js中的面向对象之对象常见创建方法详解
2019/12/16 Javascript
Python3 中文文件读写方法
2018/01/23 Python
Python实现base64编码的图片保存到本地功能示例
2018/06/22 Python
Python Web框架之Django框架cookie和session用法分析
2019/08/16 Python
Django 多对多字段的更新和插入数据实例
2020/03/31 Python
Django model重写save方法及update踩坑详解
2020/07/27 Python
CSS3属性background-size使用指南
2014/12/09 HTML / CSS
佳能法国商店:Canon法国
2019/02/14 全球购物
POP文化和音乐灵感的时尚:Hot Topic
2019/06/19 全球购物
CheapTickets泰国:廉价航班,查看促销价格并预订机票
2019/12/28 全球购物
汽车销售经理岗位职责
2014/06/09 职场文书
2014政府领导班子对照检查材料思想汇报(3篇)
2014/09/26 职场文书
领导干部作风整顿个人剖析材料
2014/10/11 职场文书
婚庆司仪开场白
2015/05/29 职场文书
国博复兴之路观后感
2015/06/02 职场文书
护士业务学习心得体会
2016/01/25 职场文书
Python 如何利用ffmpeg 处理视频素材
2021/11/27 Python
Python利用Turtle绘制哆啦A梦和小猪佩奇
2022/04/04 Python
R9700摩机记
2022/04/05 无线电