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控制台显示时钟的示例
Feb 24 Python
python单例模式实例分析
Apr 08 Python
python中requests模块的使用方法
Apr 08 Python
用Python写一个无界面的2048小游戏
May 24 Python
关于Python面向对象编程的知识点总结
Feb 14 Python
Python 实现删除某路径下文件及文件夹的实例讲解
Apr 24 Python
Python使用re模块实现信息筛选的方法
Apr 29 Python
python实现机器学习之多元线性回归
Sep 06 Python
提升python处理速度原理及方法实例
Dec 25 Python
windows、linux下打包Python3程序详细方法
Mar 17 Python
OpenCV 表盘指针自动读数的示例代码
Apr 10 Python
python 自动识别并连接串口的实现
Jan 19 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
一个PHP的ZIP压缩类分享
2014/05/04 PHP
php程序内部post数据的方法
2015/03/31 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
2016/05/27 PHP
对JavaScript的eval()中使用函数的进一步讨论
2008/07/26 Javascript
javascript的console.log()用法小结
2012/05/31 Javascript
js随机颜色代码的多种实现方式
2013/04/23 Javascript
JS判断、校验MAC地址的2个实例
2014/05/05 Javascript
jquery 显示*天*时*分*秒实现时间计时器
2014/05/07 Javascript
jquery delay()介绍及使用指南
2014/09/02 Javascript
JavaScript中的函数模式详解
2015/02/11 Javascript
jQuery实现瀑布流布局详解(PC和移动端)
2020/09/01 Javascript
JavaScript基础知识及常用方法总结
2016/01/10 Javascript
JavaScript判断DIV内容是否为空的方法
2016/01/29 Javascript
Bootstrap每天必学之轮播(Carousel)插件
2016/04/25 Javascript
基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解
2016/07/18 Javascript
NodeJs模拟登陆正方教务
2017/04/28 NodeJs
深入理解基于vue-cli的vuex配置
2017/07/24 Javascript
Bootstrap3.3.7导航栏下拉菜单鼠标滑过展开效果
2017/10/31 Javascript
详解mpvue开发小程序小总结
2018/07/25 Javascript
微信小程序实现的动态设置导航栏标题功能示例
2019/01/31 Javascript
vue百度地图 + 定位的详解
2019/05/13 Javascript
如何利用node.js开发一个生成逐帧动画的小工具
2019/12/01 Javascript
js实现橱窗展示效果
2020/01/11 Javascript
python+pyqt5实现图片批量缩放工具
2019/03/18 Python
Python基于Dlib的人脸识别系统的实现
2020/02/26 Python
python批量修改xml属性的实现方式
2020/03/05 Python
Pytorch实现WGAN用于动漫头像生成
2021/03/04 Python
使用CSS3的font-face字体嵌入样式的方法讲解
2016/05/13 HTML / CSS
中国专业的综合网上购物商城:京东
2016/08/02 全球购物
BISSELL官网:北美吸尘器第一品牌
2019/03/14 全球购物
2014医学院领导班子对照检查材料思想汇报
2014/09/19 职场文书
银行实习推荐信
2015/03/27 职场文书
道歉的话怎么说
2015/05/12 职场文书
2016年“七一建党节”广播稿
2015/12/18 职场文书
如何用Node.js编写内存效率高的应用程序
2021/04/30 Javascript
Linux中sftp常用命令整理
2022/06/28 Servers