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 04 Python
python网络爬虫采集联想词示例
Feb 11 Python
Python中使用 Selenium 实现网页截图实例
Jul 18 Python
Python获取文件ssdeep值的方法
Oct 05 Python
Python中表示字符串的三种方法
Sep 06 Python
Python subprocess模块详细解读
Jan 29 Python
Python实现决策树C4.5算法的示例
May 30 Python
python web自制框架之接受url传递过来的参数实例
Dec 17 Python
对Python协程之异步同步的区别详解
Feb 19 Python
python打开音乐文件的实例方法
Jul 21 Python
利用Python将图片中扭曲矩形的复原
Sep 07 Python
用python对excel查重
Dec 07 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
IIS 7.5 asp Session超时时间设置方法
2017/04/17 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
PHP PDOStatement::fetchColumn讲解
2019/01/31 PHP
php无限级分类实现评论及回复功能
2019/02/18 PHP
对象的类型:本地对象(1)
2006/12/29 Javascript
jQuery Ajax文件上传(php)
2009/06/16 Javascript
jQuery下拉美化搜索表单效果代码分享
2015/08/25 Javascript
聊一聊JS中this的指向问题
2016/06/17 Javascript
基于vue-resource jsonp跨域问题的解决方法
2018/02/03 Javascript
bootstrap模态框关闭后清除模态框的数据方法
2018/08/10 Javascript
vue.js实现数据库的JSON数据输出渲染到html页面功能示例
2019/08/03 Javascript
js cavans实现静态滚动弹幕
2020/05/21 Javascript
Vue 实现监听窗口关闭事件,并在窗口关闭前发送请求
2020/09/01 Javascript
Python压缩解压缩zip文件及破解zip文件密码的方法
2015/11/04 Python
python对DICOM图像的读取方法详解
2017/07/17 Python
Python实现模拟分割大文件及多线程处理的方法
2017/10/10 Python
利用python的socket发送http(s)请求方法示例
2018/05/07 Python
浅谈python中requests模块导入的问题
2018/05/18 Python
python3安装OCR识别库tesserocr过程图解
2020/04/02 Python
浅谈Python程序的错误:变量未定义
2020/06/02 Python
在pytorch中动态调整优化器的学习率方式
2020/06/24 Python
如何基于python把文字图片写入word文档
2020/07/31 Python
python rsa-oaep加密的示例代码
2020/09/23 Python
python使用Windows的wmic命令监控文件运行状况,如有异常发送邮件报警
2021/01/30 Python
详解python第三方库的安装、PyInstaller库、random库
2021/03/03 Python
维德科技C#面试题笔试题
2015/12/09 面试题
如何利用XMLHTTP检测URL及探测服务器信息
2013/11/10 面试题
水务局局长岗位职责
2013/11/28 职场文书
办公自动化专业大学生职业规划书
2014/03/06 职场文书
2014大学生中国梦主题教育学习思想汇报
2014/09/10 职场文书
2015年五四青年节活动总结
2015/02/10 职场文书
医生个人年终总结
2015/02/28 职场文书
培养联系人考察意见
2015/06/01 职场文书
心得体会格式及范文
2016/01/25 职场文书
Python-OpenCV教程之图像的位运算详解
2021/06/21 Python
PYTHON InceptionV3模型的复现详解
2022/05/06 Python