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 相关文章推荐
DataFrame中的object转换成float的方法
Apr 10 Python
Python Flask前后端Ajax交互的方法示例
Jul 31 Python
python3使用QQ邮箱发送邮件
May 20 Python
Django处理多用户类型的方法介绍
May 18 Python
python面向对象 反射原理解析
Aug 12 Python
解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题
Aug 31 Python
Python3常用内置方法代码实例
Nov 18 Python
python 使用opencv 把视频分割成图片示例
Dec 12 Python
python函数不定长参数使用方法解析
Dec 14 Python
TensorFLow 变量命名空间实例
Feb 11 Python
解决pip install psycopg2出错问题
Jul 09 Python
Python中request的基本使用解决乱码问题
Apr 12 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
isset和empty的区别
2007/01/15 PHP
PHP生成器简单实例
2015/05/13 PHP
php中的钩子理解及应用实例分析
2019/08/30 PHP
限制复选框的最大可选数
2006/07/01 Javascript
兼容IE、FireFox、Chrome等浏览器的xml处理函数js代码
2011/11/30 Javascript
JavaScript中将一个值转换为字符串的方法分析[译]
2012/09/21 Javascript
javascript对select标签的控制(option选项/select)
2013/01/31 Javascript
js 剪切板的用法(clipboardData.setData)与js match函数介绍
2013/11/19 Javascript
js获取浏览器基本信息大全
2014/11/27 Javascript
浅谈javascript中replace()方法
2015/11/10 Javascript
JavaScript过滤字符串中的中文与空格方法汇总
2016/03/07 Javascript
基于jQuery实现表格内容的筛选功能
2016/08/21 Javascript
原生javascript实现读写CSS样式的方法详解
2017/02/20 Javascript
Vue关于数据绑定出错解决办法
2017/05/15 Javascript
vue改变循环遍历后的数据实例
2019/11/07 Javascript
JavaScript实现联动菜单特效
2020/01/07 Javascript
如何优雅地取消 JavaScript 异步任务
2020/03/22 Javascript
[42:39]老党炸弹人试玩视频
2014/09/03 DOTA
Python交换变量
2008/09/06 Python
Mac中升级Python2.7到Python3.5步骤详解
2017/04/27 Python
Django forms表单 select下拉框的传值实例
2019/07/19 Python
Python OpenCV实现鼠标画框效果
2020/08/19 Python
Django 导出项目依赖库到 requirements.txt过程解析
2019/08/23 Python
解决os.path.isdir() 判断文件夹却返回false的问题
2019/11/29 Python
Python变量格式化输出实现原理解析
2020/08/06 Python
CSS3 中的@keyframes介绍
2014/09/02 HTML / CSS
纯CSS3绘制打火机动画火焰效果
2016/07/18 HTML / CSS
什么是Linux虚拟文件系统VFS
2015/08/25 面试题
Unix如何在一行中运行多个命令
2015/05/29 面试题
教学评估实施方案
2014/03/16 职场文书
人力资源求职信
2014/05/25 职场文书
个性车贴标语
2014/06/24 职场文书
2015年置业顾问工作总结
2015/04/07 职场文书
师德师风主题教育活动总结
2015/05/07 职场文书
2015年政教主任工作总结
2015/07/23 职场文书
学习计划是什么
2019/04/30 职场文书