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实现根据月份和日期得到星座的方法
Mar 27 Python
Python进程通信之匿名管道实例讲解
Apr 11 Python
python的staticmethod与classmethod实现实例代码
Feb 11 Python
python时间日期函数与利用pandas进行时间序列处理详解
Mar 13 Python
5款Python程序员高频使用开发工具推荐
Apr 10 Python
python实现两个dict合并与计算操作示例
Jul 01 Python
pandas删除行删除列增加行增加列的实现
Jul 06 Python
python3+django2开发一个简单的人员管理系统过程详解
Jul 23 Python
初次部署django+gunicorn+nginx的方法步骤
Sep 11 Python
python反转列表的三种方式解析
Nov 08 Python
python实现拉普拉斯特征图降维示例
Nov 25 Python
为什么相对PHP黑python的更少
Jun 21 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统计目录下的文件总数及代码行数(去除注释及空行)
2011/01/17 PHP
php 大数据量及海量数据处理算法总结
2011/05/07 PHP
解析dedeCMS验证码的实现代码
2013/06/07 PHP
PHP函数eval()介绍和使用示例
2014/08/20 PHP
php可生成缩略图的文件上传类实例
2014/12/17 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
2016/12/27 PHP
js 实现菜单上下显示附效果图
2013/11/21 Javascript
jquery判断密码强度的验证代码
2020/04/22 Javascript
jquery显示隐藏元素的实现代码
2016/05/19 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
2016/06/28 Javascript
vue开发心得和技巧分享
2016/10/27 Javascript
搭建element-ui的Vue前端工程操作实例
2018/02/23 Javascript
jQuery实现的自定义轮播图功能详解
2018/12/28 jQuery
bootstrap tooltips在 angularJS中的使用方法
2019/04/10 Javascript
pygame学习笔记(3):运动速率、时间、事件、文字
2015/04/15 Python
Python如何import文件夹下的文件(实现方法)
2017/01/24 Python
Python虚拟环境virtualenv的安装与使用详解
2017/05/28 Python
python 不以科学计数法输出的方法
2018/07/16 Python
python后端接收前端回传的文件方法
2019/01/02 Python
PyCharm在新窗口打开项目的方法
2019/01/17 Python
selenium获取当前页面的url、源码、title的方法
2019/06/12 Python
python实现二级登陆菜单及安装过程
2019/06/21 Python
使用Django搭建web服务器的例子(最最正确的方式)
2019/08/29 Python
如何分离django中的媒体、静态文件和网页
2019/11/12 Python
如何使用pandas读取txt文件中指定的列(有无标题)
2020/03/05 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
2020/03/20 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
2020/08/04 Python
StubHub哥伦比亚:购买和出售您的门票
2016/10/20 全球购物
日本快乐生活方式购物网站:Shop Japan
2018/07/17 全球购物
Guess美国官网:美国知名服装品牌
2019/04/08 全球购物
员工工作能力评语
2014/12/31 职场文书
自主招生专家推荐信
2015/03/26 职场文书
大学生心理健康活动总结
2015/05/08 职场文书
Python 数据可视化神器Pyecharts绘制图像练习
2022/02/28 Python
MySQL数据库安装方法与图形化管理工具介绍
2022/05/30 MySQL
ubuntu端向日葵键盘输入卡顿问题及解决
2022/12/24 Servers