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中input和raw_input的一点区别
Oct 21 Python
Python中的super()方法使用简介
Aug 14 Python
Python 逐行分割大txt文件的方法
Oct 10 Python
python requests爬取高德地图数据的实例
Nov 10 Python
Python实现网站表单提交和模板
Jan 15 Python
Python3+PyInstall+Sciter解决报错缺少dll、html等文件问题
Jul 15 Python
用Python将Excel数据导入到SQL Server的例子
Aug 24 Python
Python logging设置和logger解析
Aug 28 Python
PyQt5中多线程模块QThread使用方法的实现
Jan 31 Python
Django如何重置migration的几种情景
Feb 24 Python
Python中的pprint模块
Nov 27 Python
python 镜像环境搭建总结
Sep 23 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入门学习知识点八 PHP中for循环基本应用之九九乘法口绝表
2011/07/14 PHP
php in_array() 检查数组中是否存在某个值详解
2016/11/23 PHP
PHP实现生成推广海报的方法详解
2018/03/14 PHP
jquery.validate的使用说明介绍
2013/11/12 Javascript
使用js如何实现全选与全不选
2013/12/30 Javascript
理解javascript定时器中的单线程
2016/02/23 Javascript
jQuery使用eraser.js插件实现擦除、刮刮卡效果的方法【附eraser.js下载】
2017/04/28 jQuery
vue+vux实现移动端文件上传样式
2017/07/28 Javascript
基于zepto.js实现登录界面
2017/10/09 Javascript
微信小程序实现多宫格抽奖活动
2020/04/15 Javascript
elementUI select组件value值注意事项详解
2019/05/29 Javascript
webpack4 optimization使用总结
2019/11/10 Javascript
JS数组方法concat()用法实例分析
2020/01/18 Javascript
javascript实现页面的实时时钟显示示例
2020/08/06 Javascript
[34:56]Ti4冒泡赛LGD vs Liquid 1
2014/07/14 DOTA
[01:02:30]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第三场 8.22
2019/09/05 DOTA
Python调用SQLPlus来操作和解析Oracle数据库的方法
2016/04/09 Python
python遍历目录的方法小结
2016/04/28 Python
Pycharm更换python解释器的方法
2018/10/29 Python
Python正则表达式和元字符详解
2018/11/29 Python
Pycharm 2020年最新激活码(亲测有效)
2020/09/18 Python
Python的轻量级ORM框架peewee使用教程
2021/02/05 Python
使用CSS3制作一个简单的Chrome模拟器
2015/07/15 HTML / CSS
英国派对礼服和连衣裙购物网站:TFNC London
2018/07/07 全球购物
英国电子产品购物网站:Tech in the basket
2019/11/08 全球购物
生物化工工艺专业应届生求职信
2013/10/08 职场文书
《找不到快乐的波斯猫》教学反思
2014/02/24 职场文书
《大作家的小老师》教学反思
2014/04/16 职场文书
生日庆典策划方案
2014/06/02 职场文书
企业员工薪酬方案
2014/06/04 职场文书
行政专员岗位职责范本
2014/08/26 职场文书
红旗渠导游词
2015/02/09 职场文书
西安导游词
2015/02/12 职场文书
2016读书月活动心得体会
2016/01/14 职场文书
python b站视频下载的五种版本
2021/05/27 Python
Python 统计序列中元素的出现频度
2022/04/26 Python