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中使用HTMLParser解析HTML的教程
Apr 29 Python
在Django中创建动态视图的教程
Jul 15 Python
Python的GUI框架PySide的安装配置教程
Feb 16 Python
用python实现百度翻译的示例代码
Mar 09 Python
对Python生成汉字字库文字,以及转换为文字图片的实例详解
Jan 29 Python
pytorch实现CNN卷积神经网络
Feb 19 Python
Python列表解析操作实例总结
Feb 26 Python
pyinstaller打包单文件时--uac-admin选项不起作用怎么办
Apr 15 Python
Python实例方法、类方法、静态方法区别详解
Sep 05 Python
使用python-cv2实现Harr+Adaboost人脸识别的示例
Oct 27 Python
OpenCV3.3+Python3.6实现图片高斯模糊
May 18 Python
pandas时间序列之pd.to_datetime()的实现
Jun 16 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
解析web文件操作常见安全漏洞(目录、文件名检测漏洞)
2013/06/29 PHP
php登陆页的密码处理方式分享
2013/10/14 PHP
一组PHP加密解密函数分享
2014/06/05 PHP
PHP和C#可共用的可逆加密算法详解
2015/10/26 PHP
php+ajax无刷新上传图片实例代码
2015/11/17 PHP
关于图片验证码设计的思考
2007/01/29 Javascript
IE图片缓存document.execCommand(&quot;BackgroundImageCache&quot;,false,true)
2011/03/01 Javascript
js页面跳转的常用方法整理
2013/10/18 Javascript
jquery 获取dom固定元素 添加样式的简单实例
2014/02/04 Javascript
JavaScript使用addEventListener添加事件监听用法实例
2015/06/01 Javascript
js中document.referrer实现移动端返回上一页
2017/02/22 Javascript
jquery replace方法去空格
2017/05/08 jQuery
微信小程序App生命周期详解
2018/01/31 Javascript
vue 自定义全局方法,在组件里面的使用介绍
2018/02/28 Javascript
Webpack的dll功能使用
2018/06/28 Javascript
深入理解Puppeteer的入门教程和实践
2019/03/05 Javascript
微信小程序云开发之数据库操作
2019/05/18 Javascript
30分钟用Node.js构建一个API服务器的步骤详解
2019/05/24 Javascript
Vue中keep-alive的两种应用方式
2020/07/15 Javascript
vue中实现弹出层动画效果的示例代码
2020/09/25 Javascript
[05:41]2014DOTA2西雅图国际邀请赛 小组赛7月10日TOPPLAY
2014/07/10 DOTA
[02:08]什么藏在DOTA2 TI9“小紫本”里?斧王历险记告诉你!
2019/05/17 DOTA
c++生成dll使用python调用dll的方法
2014/01/20 Python
Python基于回溯法子集树模板解决0-1背包问题实例
2017/09/02 Python
python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例
2020/02/27 Python
python3让print输出不换行的方法
2020/08/24 Python
总结30个CSS3选择器
2017/04/13 HTML / CSS
Sephora丝芙兰菲律宾官方网站:购买化妆品和护肤品
2017/04/05 全球购物
完美主义个人的自我评价
2014/02/17 职场文书
2014年文学毕业生自我鉴定
2014/04/23 职场文书
学校领导班子对照检查材料
2014/09/24 职场文书
党员民主生活会材料
2014/12/15 职场文书
详解PHP用mb_string处理windows中文字符
2021/05/26 PHP
如何利用React实现图片识别App
2022/02/18 Javascript
Python利用capstone实现反汇编
2022/04/06 Python
python绘制云雨图raincloud plot
2022/08/05 Python