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中的面向对象编程详解(下)
Apr 13 Python
使用IPython下的Net-SNMP来管理类UNIX系统的教程
Apr 15 Python
Python 多线程Threading初学教程
Aug 22 Python
python爬虫刷访问量 2019 7月
Aug 01 Python
Python判断字符串是否xx开始或结尾的示例
Aug 08 Python
在pycharm中显示python画的图方法
Aug 31 Python
python编写猜数字小游戏
Oct 06 Python
python实现while循环打印星星的四种形状
Nov 23 Python
使用OpenCV circle函数图像上画圆的示例代码
Dec 27 Python
flask利用flask-wtf验证上传的文件的方法
Jan 17 Python
TensorBoard 计算图的查看方式
Feb 15 Python
Python如何对XML 解析
Jun 28 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中判断文件存在是用file_exists还是is_file的整理
2012/09/12 PHP
PHP和C#可共用的可逆加密算法详解
2015/10/26 PHP
php+html5实现无刷新图片上传教程
2016/01/22 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
2019/05/13 PHP
PHP 图片处理
2020/09/16 PHP
地址栏上的一段语句,改变页面的风格。(教程)
2008/04/02 Javascript
js常用自定义公共函数汇总
2014/01/15 Javascript
node.js中的buffer.slice方法使用说明
2014/12/10 Javascript
学习javascript面向对象 实例讲解面向对象选项卡
2016/01/04 Javascript
Node.js插件安装图文教程
2016/05/06 Javascript
Node.js学习入门
2017/01/03 Javascript
使用UrlConnection实现后台模拟http请求的简单实例
2017/01/04 Javascript
JQuery和html+css实现带小圆点和左右按钮的轮播图实例
2017/07/22 jQuery
使用jQuery实现购物车结算功能
2017/08/15 jQuery
vue 使某个组件不被 keep-alive 缓存的方法
2018/09/21 Javascript
详解如何搭建mpvue框架搭配vant组件库的小程序项目
2019/05/16 Javascript
JS实现json数组排序操作实例分析
2019/10/28 Javascript
vue+ElementUI 关闭对话框清空验证,清除form表单的操作
2020/08/06 Javascript
[01:51]开启你的城市传奇 完美世界城市挑战赛开始报名
2018/10/09 DOTA
python里大整数相乘相关技巧指南
2014/09/12 Python
Python中的filter()函数的用法
2015/04/27 Python
python时间日期函数与利用pandas进行时间序列处理详解
2018/03/13 Python
python2.7实现FTP文件下载功能
2018/04/15 Python
Python numpy线性代数用法实例解析
2019/11/15 Python
关于pandas的离散化,面元划分详解
2019/11/22 Python
python实现实时视频流播放代码实例
2020/01/11 Python
Django 批量插入数据的实现方法
2020/01/12 Python
夜大毕业自我鉴定
2013/10/11 职场文书
考博专家推荐信模板
2013/12/02 职场文书
学前教育学生自荐信范文
2013/12/31 职场文书
餐饮业经理竞聘演讲稿
2014/01/14 职场文书
研究生毕业自我鉴定范文
2014/03/27 职场文书
搬迁通知
2015/04/20 职场文书
2015入党个人自传范文
2015/06/26 职场文书
2016年春季运动会通讯稿
2015/11/25 职场文书
python数字图像处理之对比度与亮度调整示例
2022/06/28 Python