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交互式图形编程实例(一)
Nov 17 Python
Python决策树分类算法学习
Dec 22 Python
Python实现正整数分解质因数操作示例
Aug 01 Python
如何在Python中实现goto语句的方法
May 18 Python
Django框架搭建的简易图书信息网站案例
May 25 Python
Python 实现将大图切片成小图,将小图组合成大图的例子
Mar 14 Python
Python ATM功能实现代码实例
Mar 19 Python
基于Python词云分析政府工作报告关键词
Jun 02 Python
python 常用日期处理-- datetime 模块的使用
Sep 02 Python
python实现邮件循环自动发件功能
Sep 11 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
Nov 28 Python
图神经网络GNN算法
May 11 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
JavaScript入门教程(7) History历史对象
2009/01/31 Javascript
JQuery 表单中textarea字数限制实现代码
2009/12/07 Javascript
js中判断Object、Array、Function等引用类型对象是否相等
2012/08/29 Javascript
轻松创建nodejs服务器(10):处理上传图片
2014/12/18 NodeJs
利用JQuery写一个简单的异步分页插件
2016/03/07 Javascript
深入理解js中this的用法
2016/05/28 Javascript
jquery中的常见问题及快速解决方法小结
2016/06/14 Javascript
微信小程序 Video API实例详解
2016/10/02 Javascript
获取JavaScript异步函数的返回值
2016/12/21 Javascript
JavaScript实现滑动导航栏效果
2017/08/30 Javascript
JS实现登录页密码的显示和隐藏功能
2017/12/06 Javascript
vue.js vue-router如何实现无效路由(404)的友好提示
2017/12/20 Javascript
vue 地图可视化 maptalks 篇实例代码详解
2019/05/21 Javascript
vue自定义指令限制输入框输入值的步骤与完整代码
2020/08/30 Javascript
使用python删除nginx缓存文件示例(python文件操作)
2014/03/26 Python
Python的for和break循环结构中使用else语句的技巧
2016/05/24 Python
详谈Numpy中数组重塑、合并与拆分方法
2018/04/17 Python
Django Sitemap 站点地图的实现方法
2019/04/29 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
2020/06/10 Python
html5中svg canvas和图片之间相互转化思路代码
2014/01/24 HTML / CSS
英国乐购杂货:Tesco Groceries
2018/11/29 全球购物
分别介绍一下Session Bean和Entity Bean
2015/03/13 面试题
当x.equals(y)等于true时,x.hashCode()与y.hashCode()可以不相等,这句话对不对
2015/05/02 面试题
初入社会应届生求职信
2013/11/18 职场文书
大学四年的个人自我评价
2014/01/14 职场文书
公司中层干部的自我评价分享
2014/03/01 职场文书
yy司仪主持词
2014/03/22 职场文书
房屋租赁协议书范本
2014/04/10 职场文书
反邪教警示教育方案
2014/05/13 职场文书
目标责任书格式
2014/07/28 职场文书
2014年小学生教师节演讲稿范文
2014/09/10 职场文书
工作计划范文之财务管理
2019/08/09 职场文书
多属性、多分类MySQL模式设计
2021/04/05 MySQL
Python激活Anaconda环境变量的详细步骤
2021/06/08 Python
关于html选择框创建占位符的问题
2021/06/09 HTML / CSS
nginx请求限制配置方法
2021/07/09 Servers