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连接mssql数据库编码问题解决方法
Jan 01 Python
Python实现的个人所得税计算器示例
Jun 01 Python
python多个模块py文件的数据共享实例
Jan 11 Python
python3 自动识别usb连接状态,即对usb重连的判断方法
Jul 03 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
Aug 29 Python
python3.7将代码打包成exe程序并添加图标的方法
Oct 11 Python
PyCharm汉化安装及永久激活详细教程(靠谱)
Jan 16 Python
python opencv 检测移动物体并截图保存实例
Mar 10 Python
Python如何解除一个装饰器
Aug 07 Python
用python发送微信消息
Dec 21 Python
Python 实现Mac 屏幕截图详解
Oct 05 Python
Python中with上下文管理协议的作用及用法
Mar 18 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小技巧 把数组的键和值交换形成了新的数组,查找值取得键
2011/06/02 PHP
thinkphp中连接oracle时封装方法无法用的解决办法
2013/06/17 PHP
PHP+FastCGI+Nginx配置PHP运行环境
2014/08/07 PHP
laravel 使用事件系统统计浏览量的实现
2019/10/16 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
Javascript 判断客户端浏览器类型代码
2010/03/01 Javascript
基于Jquery的开发个代阴影的对话框效果代码
2011/07/28 Javascript
jqGrid jQuery 表格插件测试代码
2011/08/23 Javascript
jquery实现textarea输入字符控制(仿微博输入控制字符)
2013/04/26 Javascript
jQuery制作仿腾讯web qq用户体验桌面
2013/08/20 Javascript
html页面显示年月日时分秒和星期几的两种方式
2013/08/20 Javascript
举例讲解jQuery中可见性过滤选择器的使用
2016/04/18 Javascript
JQuery插件Marquee.js实现无缝滚动效果
2016/04/26 Javascript
JavaScript开发Chrome浏览器扩展程序UI的教程
2016/05/16 Javascript
js改变html的原有内容实现方法
2016/10/05 Javascript
详解NodeJS框架express的路径映射(路由)功能及控制
2017/03/24 NodeJs
es7学习教程之fetch解决异步嵌套问题的方法示例
2017/07/21 Javascript
jquery写出PC端轮播图实例
2018/01/26 jQuery
vue+element搭建后台小总结 el-dropdown下拉功能
2020/04/10 Javascript
解决vue更新路由router-view复用组件内容不刷新的问题
2019/11/04 Javascript
Vue基础配置讲解
2019/11/29 Javascript
简单谈谈offsetleft、offsetTop和offsetParent
2020/12/04 Javascript
[01:57]2018年度DOTA2最具潜力解说-完美盛典
2018/12/16 DOTA
python创建和删除目录的方法
2015/04/29 Python
详解Python中的各种函数的使用
2015/05/24 Python
浅谈python新手中常见的疑惑及解答
2016/06/14 Python
python cs架构实现简单文件传输
2020/03/20 Python
对python中的高效迭代器函数详解
2018/10/18 Python
python基础知识(一)变量与简单数据类型详解
2019/04/17 Python
Pandas 解决dataframe的一列进行向下顺移问题
2019/12/27 Python
DjangoWeb使用Datatable进行后端分页的实现
2020/05/18 Python
销售顾问的岗位职责
2013/11/13 职场文书
《冬阳童年骆驼队》教学反思
2014/04/15 职场文书
社区党建工作方案
2014/06/10 职场文书
党的群众路线教育实践活动个人对照检查材料(乡镇)
2014/11/05 职场文书
2017大学生寒假社会实践心得体会
2016/01/14 职场文书