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实现dnspod自动更新dns解析的方法
Feb 14 Python
Python中optionParser模块的使用方法实例教程
Aug 29 Python
python监控文件或目录变化
Jun 07 Python
如何利用Fabric自动化你的任务
Oct 20 Python
python 查找文件名包含指定字符串的方法
Jun 05 Python
python 文件转成16进制数组的实例
Jul 09 Python
python 实现批量xls文件转csv文件的方法
Oct 23 Python
Python上下文管理器用法及实例解析
Nov 11 Python
python实现的多任务版udp聊天器功能案例
Nov 13 Python
DjangoWeb使用Datatable进行后端分页的实现
May 18 Python
Python使用requests模块爬取百度翻译
Aug 25 Python
python3:excel操作之读取数据并返回字典 + 写入的案例
Sep 01 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
CodeIgniter 完美解决URL含有中文字符串
2016/05/13 PHP
PHP实现简易用户登录系统
2020/07/10 PHP
用JQuery模仿淘宝的图片放大镜显示效果
2011/09/15 Javascript
js 3种归并操作的实例代码
2013/10/30 Javascript
js实现动态改变字体大小代码
2014/01/02 Javascript
js实现鼠标悬停图片上时滚动文字说明的方法
2015/02/17 Javascript
学习JavaScript编程语言的8张思维导图分享
2015/03/27 Javascript
Javascript中数组方法汇总(推荐)
2015/04/01 Javascript
jQuery仿gmail实现fixed布局的方法
2015/05/27 Javascript
jQuery实现带有洗牌效果的动画分页实例
2015/08/31 Javascript
解决同一页面中两个iframe互相调用jquery,js函数的方法
2016/12/12 Javascript
浅谈javascript中的事件冒泡和事件捕获
2016/12/28 Javascript
JavaScript数据结构之二叉树的遍历算法示例
2017/04/13 Javascript
react.js组件实现拖拽复制和可排序的示例代码
2018/08/20 Javascript
Koa从零搭建到Api实现项目的搭建方法
2019/07/30 Javascript
解决vue项目input输入框双向绑定数据不实时生效问题
2020/08/05 Javascript
JavaScript判断数据类型有几种方法及区别介绍
2020/09/02 Javascript
Python中int()函数的用法浅析
2017/10/17 Python
python 对txt中每行内容进行批量替换的方法
2018/07/11 Python
解决pycharm每次新建项目都要重新安装一些第三方库的问题
2019/01/17 Python
jupyter notebook oepncv 显示一张图像的实现
2020/04/24 Python
Python多线程:主线程等待所有子线程结束代码
2020/04/25 Python
Python使用shutil模块实现文件拷贝
2020/07/31 Python
Python通过format函数格式化显示值
2020/10/17 Python
一款利用纯css3实现的360度翻转按钮的实例教程
2014/11/05 HTML / CSS
加利福尼亚州威尼斯的女性奢侈品设计师服装和概念店:Mona Moore
2018/09/13 全球购物
经典c++面试题五
2014/12/17 面试题
编程输出如下图形
2013/11/24 面试题
2014小学生国庆65周年演讲稿
2014/09/21 职场文书
投标人法定代表人授权委托书格式
2014/09/28 职场文书
2014年安全员工作总结
2014/11/13 职场文书
考试没考好检讨书(精选篇)
2014/11/16 职场文书
小学教师师德师风自我评价
2015/03/04 职场文书
中学团支部工作总结
2015/08/13 职场文书
创业计划书之韩国烧烤店
2019/09/19 职场文书
Redis如何一键部署脚本
2021/04/12 Redis