python模块hashlib(加密服务)知识点讲解


Posted in Python onNovember 25, 2019

官方文案:https://docs.python.org/zh-cn/3/library/hashlib.html

hashlib --- 安全哈希与消息摘要

Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。

什么是摘要digest algorithms算法呢?摘要算法又称哈希hash算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。

hash算法

每种类型的hash都有一个构建器方法,返回一个hash对象和相同的简单接口。

例如:

使用sha256()创建一个SHA-256hash object。可以使用update()喂给它bytes-like object。然后可以用digest()或hexdigest()来获得数据的摘要。

hashlib模型有许多算法如:sha1(), sha224(), sha256(), sha384(), sha512(), blake2b(), and blake2s()。还有很多其他算法要看Python使用的OpenSSL libary。具体见文档。

使用algorithms_guaranteed常量,查看模块在所有平台都支持的算法:

>>> hashlib.algorithms_guaranteed
{'blake2s', 'sha256', 'sha3_512', 'sha1', 'shake_128', 'sha3_256', 'sha3_384', 'blake2b', 'sha3_224', 'sha512', 'md5', 'shake_256', 'sha224', 'sha384'}

使用algorithms_available常量,在编译器运行时可以的hash算法

>>> hashlib.algorithms_available
{'sha3_256', 'blake2b', 'md5', 'sha512_224', 'sha384', 'md4', 'sha256', 'sha512', 'whirlpool', 'sha224', 'sha512_256', 'shake_128', 'sha3_384', 'ripemd160', 'blake2s', 'sha3_512', 'sha1', 'sm3', 'shake_256', 'sha3_224', 'md5-sha1'}

例子:

>>> import hashlib
>>> m = hashlib.sha256()
>>> m.update(b" the spammish repetition")  #重复调用相当于,把bytes字节串相加。
>>> m.name  #hash算法的名字
'sha256'
>>> m.digest() #返回传入update()的数据的摘要
b'U<\x9bP\xb1\xa8\x9a\x9aE\x0f;h\xdb\x04\x11\xc1\x08\xfaH\xa7\t\xbfF\x91\x01\x13\xa1\x87\xb6\xd9`\x96'
>>> m.digest_size  #摘要的大小
>>> m.block_size  #hash算法内的块的大小
>>> m.hexdigest()  #返回一个字符串对象,一般用在安全的email或其他非binary环境
'553c9b50b1a89a9a450f3b68db0411c108fa48a709bf46910113a187b6d96096'
>>>

不同的算法安全不一样,sha256就比sha1安全,但越安全的算法不仅越慢,摘要长度更长。

摘要算法应用

保存用户输入的密码:正确的保存口令的方式是不存储用户的明文口令,而是存储用户口令的摘要,比如MD5.

摘要算法在很多地方都有广泛的应用。要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改,但是它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令。

例子:

存储MD5的好处是即使运维人员能访问数据库,也无法获知用户的明文口令。

设计一个验证用户登录的函数,根据用户输入的口令是否正确,返回True或False:

# -*- coding: utf-8 -*-
db = {
  'michael': 'e10adc3949ba59abbe56e057f20f883e',
  'bob': '878ef96e86145580c38c87f0410ad153',
  'alice': '99b1c2188db85afee403b1536010c2c9'
}

import hashlib

def calc_md5(password):
  m = hashlib.md5()
  m.update(password.encode('utf-8'))
  return m.hexdigest()

def login(user, password):
  return db[user] == calc_md5(password)
    

# 测试:
assert login('michael', '123456')
assert login('bob', 'abc999')
assert login('alice', 'alice2008')
assert not login('michael', '1234567')
assert not login('bob', '123456')
assert not login('alice', 'Alice2008')
print('ok')

希望三水点靠木整理的相关知识点能够帮助到大家,感谢你们的支持。

Python 相关文章推荐
python实现查找excel里某一列重复数据并且剔除后打印的方法
May 26 Python
Python自动扫雷实现方法
Jul 25 Python
Python IDLE 错误:IDLE''s subprocess didn''t make connection 的解决方案
Feb 13 Python
不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决
Sep 24 Python
人工智能最火编程语言 Python大战Java!
Nov 13 Python
详解Python自建logging模块
Jan 29 Python
python使用tensorflow深度学习识别验证码
Apr 03 Python
解决python opencv无法显示图片的问题
Oct 28 Python
用uWSGI和Nginx部署Flask项目的方法示例
May 05 Python
如何使用Python多线程测试并发漏洞
Dec 18 Python
Python求平面内点到直线距离的实现
Jan 19 Python
利用Python中的Xpath实现一个在线汇率转换器
Sep 09 Python
Python3如何对urllib和urllib2进行重构
Nov 25 #Python
python pygame实现球球大作战
Nov 25 #Python
Python内置加密模块用法解析
Nov 25 #Python
python使用pygame实现笑脸乒乓球弹珠球游戏
Nov 25 #Python
Django项目基础配置和基本使用过程解析
Nov 25 #Python
nginx+uwsgi+django环境搭建的方法步骤
Nov 25 #Python
python找出列表中大于某个阈值的数据段示例
Nov 24 #Python
You might like
ThinkPHP3.1新特性之对Ajax的支持更加完善
2014/06/19 PHP
PHP实现根据设备类型自动跳转相应页面的方法
2014/07/24 PHP
php 删除一维数组中某一个值元素的操作方法
2018/02/01 PHP
javascript 流畅动画实现原理
2009/09/08 Javascript
通过继承IHttpHandle实现JS插件的组织与管理
2010/07/13 Javascript
JavaScript高级程序设计(第3版)学习笔记 概述
2012/10/11 Javascript
如何使用JS获取IE上传文件路径(IE7,8)
2013/07/08 Javascript
解析JavaScript中delete操作符不能删除的对象
2013/12/03 Javascript
js获取窗口相对于屏幕左边和上边的位置坐标
2014/05/15 Javascript
js的image onload事件使用遇到的问题
2014/07/15 Javascript
javascript实现切换td中的值
2014/12/05 Javascript
JavaScript设置获取和设置属性的方法
2015/03/04 Javascript
jQuery实现简单的间隔向上滚动效果
2015/03/09 Javascript
jQuery Ajax请求后台数据并在前台接收
2016/12/10 Javascript
利用原生JS与jQuery实现数字线性变化的动画
2017/02/24 Javascript
微信小程序实现皮肤功能(夜间模式)
2017/06/18 Javascript
使用AngularJS编写多选按钮选中时触发指定方法的指令代码详解
2017/07/24 Javascript
angular2系列之路由转场动画的示例代码
2017/11/09 Javascript
原生js实现简单的焦点图效果实例
2017/12/14 Javascript
vue实现2048小游戏功能思路详解
2018/05/09 Javascript
echarts.js 动态生成多个图表 使用vue封装组件操作
2020/07/19 Javascript
mac下pycharm设置python版本的图文教程
2018/06/13 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
Python3按一定数据位数格式处理bin文件的方法
2019/01/24 Python
PyQt5实现简单数据标注工具
2019/03/18 Python
python调用接口的4种方式代码实例
2019/11/19 Python
基于python实现复制文件并重命名
2020/09/16 Python
基于CSS3实现的几个小loading效果
2018/09/27 HTML / CSS
英国精品买手店:Browns Fashion
2016/09/29 全球购物
软件缺陷的分类都有哪些
2014/08/22 面试题
毕业生优秀推荐信
2013/11/26 职场文书
电子商务专业应届生求职信
2014/05/28 职场文书
员工辞退通知书
2015/04/17 职场文书
幼儿园托班教育随笔
2015/08/14 职场文书
Python 一键获取电脑浏览器的账号密码
2022/05/11 Python
Oracle锁表解决方法的详细记录
2022/06/05 Oracle