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 list 合并连接字符串的方法
Mar 09 Python
在Python中利用Into包整洁地进行数据迁移的教程
Mar 30 Python
Python 文件管理实例详解
Nov 10 Python
Python使用dis模块把Python反编译为字节码的用法详解
Jun 14 Python
Python selenium 三种等待方式详解(必会)
Sep 15 Python
python获取当前运行函数名称的方法实例代码
Apr 06 Python
微信跳一跳python辅助脚本(总结)
Jan 11 Python
基于python 爬虫爬到含空格的url的处理方法
May 11 Python
Flask web开发处理POST请求实现(登录案例)
Jul 26 Python
python Yaml、Json、Dict之间的转化
Oct 19 Python
Python list和str互转的实现示例
Nov 16 Python
Python实现生成bmp图像的方法
Jun 13 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
PHP防止跨域提交表单
2013/11/01 PHP
PHP远程采集图片详细教程
2014/07/01 PHP
基于PHP实现的事件机制实例分析
2015/06/18 PHP
php批量删除操作代码分享
2017/02/26 PHP
php生成0~1随机小数的方法(必看)
2017/04/05 PHP
JS 拼图游戏 面向对象,注释完整。
2009/06/18 Javascript
jQuery实现Tab菜单滚动切换的方法
2015/09/21 Javascript
js过滤HTML标签完整实例
2015/11/26 Javascript
原生JS实现首页进度加载动画
2016/09/14 Javascript
利用React-router+Webpack快速构建react程序
2016/10/27 Javascript
概述一个页面从输入URL到页面加载完的过程
2016/12/16 Javascript
jQuery Easyui datagrid行内实现【添加】、【编辑】、【上移】、【下移】
2016/12/19 Javascript
js实现用户输入的小写字母自动转大写字母的方法
2017/01/21 Javascript
jQuery插件HighCharts绘制2D金字塔图效果示例【附demo源码下载】
2017/03/09 Javascript
BootStrap导航栏问题记录
2017/07/31 Javascript
JS 中document.write()的用法和清空的原因浅析
2017/12/04 Javascript
nodejs调取微信收货地址的方法
2017/12/20 NodeJs
浅谈vuepress 踩坑记
2018/04/18 Javascript
javascript头像上传代码实例
2019/09/28 Javascript
使用jQuery实现掷骰子游戏
2019/10/24 jQuery
微信小程序 scroll-view 实现锚点跳转功能
2019/12/12 Javascript
python计算两个地址之间的距离方法
2018/06/09 Python
python读取txt文件,去掉空格计算每行长度的方法
2018/12/20 Python
详解python中的index函数用法
2019/08/06 Python
python错误调试及单元文档测试过程解析
2019/12/19 Python
详解字符串在Python内部是如何省内存的
2020/02/03 Python
Pycharm生成可执行文件.exe的实现方法
2020/06/02 Python
德国专业木制品经销商:Holz-Direkt24
2019/12/26 全球购物
新任教师自我鉴定
2014/02/24 职场文书
运动会加油稿100字
2014/09/19 职场文书
2014年党员自我评价材料
2014/09/22 职场文书
给客户的感谢信
2015/01/21 职场文书
通知函格式范文
2015/04/27 职场文书
PyQt5 显示超清高分辨率图片的方法
2021/04/11 Python
Python函数对象与闭包函数
2022/04/13 Python
Golang解析JSON对象
2022/04/30 Golang