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 18 Python
Python3访问并下载网页内容的方法
Jul 28 Python
Python新手入门最容易犯的错误总结
Apr 24 Python
Python简单生成随机姓名的方法示例
Dec 27 Python
Python实现多属性排序的方法
Dec 05 Python
使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤
Dec 17 Python
Pytorch 抽取vgg各层并进行定制化处理的方法
Aug 20 Python
python如何通过pyqt5实现进度条
Jan 20 Python
postman和python mock测试过程图解
Feb 22 Python
PyQt5实现画布小程序
May 30 Python
如何用Python搭建gRPC服务
Jun 30 Python
Python实现信息管理系统
Jun 05 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
不用mod_rewrite直接用php实现伪静态化页面代码
2008/10/04 PHP
php之Memcache学习笔记
2013/06/17 PHP
PHP批量生成静态HTML的简单原理和方法
2014/04/20 PHP
Yii框架中memcache用法实例
2014/12/03 PHP
PHP实现递归无限级分类
2015/10/22 PHP
JavaScript中令你抓狂的魔术变量
2006/11/30 Javascript
用 javascript 实现的点击复制代码
2007/03/24 Javascript
javascript 树控件 比较好用
2009/06/11 Javascript
SyntaxHighlighter语法高亮插件使用说明
2011/08/14 Javascript
到处都是jQuery选择器的年代 不了解它们的性能,行吗
2012/06/18 Javascript
innerText和textContent对比及使用介绍
2013/02/27 Javascript
提交表单时执行func方法实现代码
2013/03/17 Javascript
javascript实现playfair和hill密码算法
2014/12/07 Javascript
JS+CSS实现简易的滑动门效果代码
2015/09/24 Javascript
js实现内容显示并使用json传输数据
2016/03/16 Javascript
nodejs加密Crypto的实例代码
2016/07/07 NodeJs
Javascript表单特效之十大常用原理性样例代码大总结
2016/07/12 Javascript
使用vue框架 Ajax获取数据列表并用BootStrap显示出来
2017/04/24 Javascript
JS中的数组转变成JSON格式字符串的方法
2017/05/09 Javascript
NodeJS链接MySql数据库的操作方法
2017/06/27 NodeJs
解决vue中使用swiper插件问题及swiper在vue中的用法
2018/04/04 Javascript
详解如何在你的Vue项目配置vux
2018/06/04 Javascript
微信小程序canvas实现刮刮乐效果
2018/07/09 Javascript
Vue监听事件实现计数点击依次增加的方法
2018/09/26 Javascript
浅谈vux之x-input使用以及源码解读
2018/11/04 Javascript
VueCli3.0中集成MockApi的方法示例
2019/07/05 Javascript
vue实现井字棋游戏
2020/09/29 Javascript
详解Python odoo中嵌入html简单的分页功能
2019/05/29 Python
Python为何不能用可变对象作为默认参数的值
2019/07/01 Python
python全栈开发语法总结
2020/11/22 Python
如何通过python检查文件是否被占用
2020/12/18 Python
公证书样本
2014/04/10 职场文书
文明城市标语
2014/06/16 职场文书
党校党性分析材料
2014/12/19 职场文书
2015年度招聘工作总结
2015/05/28 职场文书
八年级作文之感悟亲情
2019/11/20 职场文书