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中下划线的使用方法
Mar 27 Python
Python调用C++程序的方法详解
Jan 24 Python
python snownlp情感分析简易demo(分享)
Jun 04 Python
Python 多个图同时在不同窗口显示的实现方法
Jul 07 Python
使用django和vue进行数据交互的方法步骤
Nov 11 Python
wxPython实现文本框基础组件
Nov 18 Python
Tensorflow 自定义loss的情况下初始化部分变量方式
Jan 06 Python
pytorch 状态字典:state_dict使用详解
Jan 17 Python
Django调用百度AI接口实现人脸注册登录代码实例
Apr 23 Python
tensorflow模型的save与restore,及checkpoint中读取变量方式
May 26 Python
Idea安装python显示无SDK问题解决方案
Aug 12 Python
matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)
Jan 05 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
NOD32 v2.70.32 简体中文封装版 提供下载了
2007/02/27 PHP
php中在PDO中使用事务(Transaction)
2011/05/14 PHP
PHP原生函数一定好吗?
2014/12/08 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
2019/11/09 PHP
IE6下JS动态设置图片src地址问题
2010/01/08 Javascript
html中的input标签的checked属性jquery判断代码
2012/09/19 Javascript
JavaScript中“基本类型”之争小结
2013/01/03 Javascript
js控制表单奇偶行样式的简单方法
2013/07/31 Javascript
使用jQuery快速解决input中placeholder值在ie中无法支持的问题
2014/01/02 Javascript
使用AngularJS处理单选框和复选框的简单方法
2015/06/19 Javascript
关于原生js中bind函数的简单实现
2016/08/10 Javascript
将json转换成struts参数的方法
2016/11/08 Javascript
微信小程序 wx.login解密出现乱码的问题解决办法
2017/03/10 Javascript
jQuery中的deferred对象和extend方法详解
2017/05/08 jQuery
基于Vue2.X的路由和钩子函数详解
2018/02/09 Javascript
微信小程序自定义tabBar组件开发详解
2020/09/24 Javascript
解决layui富文本编辑器图片上传无法回显的问题
2019/09/18 Javascript
javascript设计模式 ? 外观模式原理与用法实例分析
2020/04/15 Javascript
详解小程序横屏方案对比
2020/06/28 Javascript
用python + openpyxl处理excel2007文档思路以及心得
2014/07/14 Python
Python使用Matplotlib实现雨点图动画效果的方法
2017/12/23 Python
Python进程间通信Queue实例解析
2018/01/25 Python
python pyenv多版本管理工具的使用
2019/12/23 Python
Python实现一个简单的毕业生信息管理系统的示例代码
2020/06/08 Python
在Keras中CNN联合LSTM进行分类实例
2020/06/29 Python
python常量折叠基础知识点讲解
2021/02/28 Python
H5最强接口之canvas实现动态图形功能
2019/05/31 HTML / CSS
Lee牛仔裤澳大利亚官网:美国著名牛仔裤品牌
2017/09/02 全球购物
StubHub新西兰:购买和出售你的门票
2019/04/22 全球购物
俄罗斯名牌服装网上商店:UNIQUE FABRIC
2019/07/25 全球购物
.NET面试题:什么是值类型和引用类型
2016/01/12 面试题
人力资源部门的主要职能
2014/02/22 职场文书
C++程序员求职信
2014/05/07 职场文书
教师党员先进性教育自我剖析材料思想汇报
2014/09/24 职场文书
学生上课说话检讨书
2014/10/25 职场文书
幼儿园教师节感谢信
2015/01/23 职场文书