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实现LRU算法的2种方法
Jun 24 Python
shelve  用来持久化任意的Python对象实例代码
Oct 12 Python
python编程嵌套函数实例代码
Feb 11 Python
浅谈python下tiff图像的读取和保存方法
Dec 04 Python
Python 获取 datax 执行结果保存到数据库的方法
Jul 11 Python
Pycharm如何导入python文件及解决报错问题
May 10 Python
python函数中将变量名转换成字符串实例
May 11 Python
基于Python3读写INI配置文件过程解析
Jul 23 Python
利用python批量爬取百度任意类别的图片的实现方法
Oct 07 Python
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
Jun 07 Python
关于python类SortedList详解
Sep 04 Python
Python实现为PDF去除水印的示例代码
Apr 03 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递归创建和删除文件夹的代码小结
2012/04/13 PHP
解析阿里云ubuntu12.04环境下配置Apache+PHP+PHPmyadmin+MYsql
2013/06/26 PHP
php三元运算符知识汇总
2015/07/02 PHP
Javascript实现视频轮播在pc端与移动端均可
2013/09/29 Javascript
$.each遍历对象、数组的属性值并进行处理
2014/07/18 Javascript
laytpl 精致巧妙的JavaScript模板引擎
2014/08/29 Javascript
10分钟学会写Jquery插件实例教程
2014/09/06 Javascript
node.js中的fs.utimesSync方法使用说明
2014/12/15 Javascript
jQuery实现鼠标滑向当前图片高亮显示并且其它图片变灰的方法
2015/07/27 Javascript
微信小程序 swiper组件详解及实例代码
2016/10/25 Javascript
H5移动端图片压缩上传开发流程
2016/11/09 Javascript
jQuery异步提交表单实例
2017/05/30 jQuery
一个简易时钟效果js实现代码
2020/03/25 Javascript
vue几个常用跨域处理方式介绍
2018/02/07 Javascript
angularjs 的数据绑定实现原理
2018/07/02 Javascript
vue2.0 实现富文本编辑器功能
2019/05/26 Javascript
Python爬虫之模拟知乎登录的方法教程
2017/05/25 Python
完美解决python中ndarray 默认用科学计数法显示的问题
2018/07/14 Python
与Django结合利用模型对上传图片预测的实例详解
2019/08/07 Python
Anaconda 查看、创建、管理和使用python环境的方法
2019/12/03 Python
python 操作mysql数据中fetchone()和fetchall()方式
2020/05/15 Python
西班牙语在线票务市场:SuperBoletería
2019/06/10 全球购物
一组SQL面试题
2016/02/15 面试题
护理专业优质毕业生自荐书
2014/01/31 职场文书
校园学雷锋活动月总结
2014/03/09 职场文书
2014三八妇女节活动总结范文四篇
2014/03/09 职场文书
倡议书格式范文
2014/04/14 职场文书
学雷锋活动总结范文
2014/04/25 职场文书
高中学生会竞选演讲稿
2014/08/25 职场文书
教师节标语大全
2014/10/07 职场文书
资产运营委托书范本
2014/10/16 职场文书
文明礼仪倡议书
2015/04/28 职场文书
教师节座谈会主持词
2015/07/03 职场文书
小学生暑假生活总结
2015/07/13 职场文书
golang中的并发和并行
2021/05/08 Golang
Python测试框架pytest核心库pluggy详解
2022/08/05 Golang