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 相关文章推荐
ssh批量登录并执行命令的python实现代码
May 25 Python
Python嵌套式数据结构实例浅析
Mar 05 Python
简单了解python PEP的一些知识
Jul 13 Python
Python容器使用的5个技巧和2个误区总结
Sep 26 Python
Python 使用元类type创建类对象常见应用详解
Oct 17 Python
python中pandas库中DataFrame对行和列的操作使用方法示例
Jun 14 Python
Python DES加密实现原理及实例解析
Jul 17 Python
简述 Python 的类和对象
Aug 21 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
Sep 09 Python
详解pycharm的python包opencv(cv2)无代码提示问题的解决
Jan 29 Python
Jupyter Notebook内使用argparse报错的解决方案
Jun 03 Python
Python中文分词库jieba(结巴分词)详细使用介绍
Apr 07 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中$_FILES的使用以及注意事项
2013/07/05 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
2019/10/03 PHP
短信提示使用 特效
2007/01/19 Javascript
用js查找法实现当前栏目的高亮显示的代码
2007/11/24 Javascript
基于jquery的给文章加入关键字链接
2010/10/26 Javascript
JavaScript 字符串处理函数使用小结
2010/12/02 Javascript
在js中判断checkboxlist(.net控件客户端id)是否有选中
2013/04/11 Javascript
跟我学Nodejs(二)--- Node.js事件模块
2014/05/21 NodeJs
如何正确使用javascript 来进行我们的程序开发
2014/06/23 Javascript
JavaScript AOP编程实例
2015/06/16 Javascript
js实现的倒计时按钮实例
2015/06/24 Javascript
使用DNode实现php和nodejs之间通信的简单实例
2015/07/06 NodeJs
jQuery右侧选项卡焦点图片轮播特效代码分享
2015/09/05 Javascript
11种ASP连接数据库的方法
2015/09/18 Javascript
AngularJS 遇到的小坑与技巧小结
2016/06/07 Javascript
bootstrap-datetimepicker实现只显示到日期的方法
2016/11/25 Javascript
Angular2中select用法之设置默认值与事件详解
2017/05/07 Javascript
jQuery实现ajax回调函数带入参数的方法示例
2018/06/26 jQuery
关于vue v-for循环解决img标签的src动态绑定问题
2018/09/18 Javascript
微信小程序实现通过js操作wxml的wxss属性示例
2018/12/06 Javascript
Node.js 如何利用异步提升任务处理速度
2019/01/07 Javascript
JS实现的对象去重功能示例
2019/06/04 Javascript
[04:22]DOTA2大事件之护国神翼
2020/08/14 DOTA
举例简单讲解Python中的数据存储模块shelve的用法
2016/03/03 Python
python初学之用户登录的实现过程(实例讲解)
2017/12/23 Python
python在html中插入简单的代码并加上时间戳的方法
2018/10/16 Python
python仿evething的文件搜索器实例代码
2019/05/13 Python
python3射线法判断点是否在多边形内
2019/06/28 Python
python定义类self用法实例解析
2020/01/22 Python
html5小程序飞入购物车(抛物线绘制运动轨迹点)
2020/10/19 HTML / CSS
宝拉珍选澳大利亚官方购物网站:Paula’s Choice澳大利亚
2016/09/13 全球购物
婚礼主持结束词
2014/03/13 职场文书
保护水资源的标语
2014/06/17 职场文书
小学生推普周国旗下讲话稿
2014/09/21 职场文书
《自己的花是让别人看的》教学反思
2016/02/19 职场文书
JavaScript选择器函数querySelector和querySelectorAll
2021/11/27 Javascript