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多线程编程(一):threading模块综述
Apr 05 Python
Python实现大文件排序的方法
Jul 10 Python
python机器人行走步数问题的解决
Jan 29 Python
解决pyttsx3无法封装的问题
Dec 24 Python
python获取txt文件词向量过程详解
Jul 05 Python
Python爬虫学习之获取指定网页源码
Jul 30 Python
python实现异常信息堆栈输出到日志文件
Dec 26 Python
浅谈Python3实现两个矩形的交并比(IoU)
Jan 18 Python
python matplotlib画盒图、子图解决坐标轴标签重叠的问题
Jan 19 Python
Python编程快速上手——选择性拷贝操作案例分析
Feb 28 Python
用 Python 定义 Schema 并生成 Parquet 文件详情
Sep 25 Python
python超详细实现完整学生成绩管理系统
Mar 17 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
dedecms中常见问题修改方法总结
2007/03/21 PHP
Windows下利用Gvim写PHP产生中文乱码问题解决方法
2011/04/20 PHP
PHP与C#分别格式化文件大小的代码
2011/05/14 PHP
PHP中使用gettext解决国际化问题的例子(i18n)
2014/06/13 PHP
Laravel5.4框架使用socialite实现github登录的方法
2019/03/20 PHP
解决表单中第一个非隐藏的元素获得焦点的一个方案
2009/10/26 Javascript
简介JavaScript中fixed()方法的使用
2015/06/08 Javascript
浅谈JavaScript 执行环境、作用域及垃圾回收
2016/05/31 Javascript
解决ajax不能访问本地文件问题(利用js跨域原理)
2017/01/24 Javascript
详解nodejs模板引擎制作
2017/06/14 NodeJs
nodejs实现简单的gulp打包
2017/12/21 NodeJs
JavaScript中EventLoop介绍
2018/01/22 Javascript
详解如何使用babel进行es6文件的编译
2018/05/29 Javascript
Vue组件的使用及个人理解与介绍
2019/02/09 Javascript
详解用Webpack与Babel配置ES6开发环境
2019/03/12 Javascript
json数据格式常见操作示例
2019/06/13 Javascript
vue中动态select的使用方法示例
2019/10/28 Javascript
vue改变循环遍历后的数据实例
2019/11/07 Javascript
UEditor 自定义图片视频尺寸校验功能的实现代码
2020/10/20 Javascript
[02:57]2014DOTA2国际邀请赛 选手辛苦解说更辛苦
2014/07/10 DOTA
Python正则表达式的使用范例详解
2014/08/08 Python
Python标准模块--ContextManager上下文管理器的具体用法
2017/11/27 Python
详解Python中的动态属性和特性
2018/04/07 Python
解决PyCharm同目录下导入模块会报错的问题
2018/10/13 Python
详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
2019/04/17 Python
python3.4+pycharm 环境安装及使用方法
2019/06/13 Python
Django REST framework 分页的实现代码
2019/06/19 Python
python画图的函数用法以及技巧
2019/06/28 Python
Python使用文件操作实现一个XX信息管理系统的示例
2020/07/02 Python
Windows环境下Python3.6.8 importError: DLLload failed:找不到指定的模块
2020/11/01 Python
html5 figure和figcaption的使用方法
2018/09/10 HTML / CSS
构造方法和其他方法的区别
2016/04/26 面试题
化学专业自荐信
2014/05/28 职场文书
小学亲子活动总结
2014/07/01 职场文书
春季运动会加油词
2015/07/18 职场文书
2016党员学习作风建设心得体会
2016/01/21 职场文书