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实现图书超期提醒
Aug 02 Python
python操作列表的函数使用代码详解
Dec 28 Python
python验证码识别实例代码
Feb 03 Python
python3 读取Excel表格中的数据
Oct 16 Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
Oct 23 Python
Python 将Matrix、Dict保存到文件的方法
Oct 30 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
Nov 06 Python
python PrettyTable模块的安装与简单应用
Jan 11 Python
在python中画正态分布图像的实例
Jul 08 Python
python使用docx模块读写docx文件的方法与docx模块常用方法详解
Feb 17 Python
python爬取代理IP并进行有效的IP测试实现
Oct 09 Python
Elasticsearch 基本查询和组合查询
Apr 19 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 !function_exists(&quot;T7FC56270E7A70FA81A5935B72EACBE29&quot;))代码解密
2011/01/07 PHP
php批量上传的实现代码
2013/06/09 PHP
PHP迭代器实现斐波纳契数列的函数
2013/11/12 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
phpStudy 2016 使用教程详解(支持PHP7)
2017/10/18 PHP
PHP使用SMTP邮件服务器发送邮件示例
2018/08/28 PHP
如何用javascript去掉字符串里的所有空格
2007/02/08 Javascript
判断控件是否已加载完成的代码
2010/02/24 Javascript
jQuery 获取URL参数的插件
2010/03/04 Javascript
通过jQuery源码学习javascript(三)
2012/12/27 Javascript
JavaScrip实现PHP print_r的数功能(三种方法)
2013/11/12 Javascript
flash遮住div问题的正确解决方法
2014/02/27 Javascript
javascript操作excel生成报表示例
2014/05/08 Javascript
JS使用单链表统计英语单词出现次数
2016/06/16 Javascript
JS对HTML表格进行增删改操作
2016/08/22 Javascript
详解使用vue-cli脚手架初始化Vue项目下的项目结构
2018/03/08 Javascript
vuex state及mapState的基础用法详解
2018/04/19 Javascript
jQuery pjax 应用简单示例
2018/09/20 jQuery
使用react render props实现倒计时的示例代码
2018/12/06 Javascript
微信小程序性能优化之checkSession的使用
2019/03/06 Javascript
vue cli3 调用百度翻译API翻译页面的实现示例
2019/09/13 Javascript
2019年度web前端面试题总结(主要为Vue面试题)
2020/01/12 Javascript
vue-列表下详情的展开与折叠案例
2020/07/28 Javascript
用实例分析Python中method的参数传递过程
2015/04/02 Python
解析Python编程中的包结构
2015/10/25 Python
python实现人脸识别代码
2017/11/08 Python
Python 从列表中取值和取索引的方法
2018/12/25 Python
flask 框架操作MySQL数据库简单示例
2020/02/02 Python
澳大利亚墨尔本的在线时装店:LORETA
2018/09/14 全球购物
女性时尚网购:Chic Me
2019/07/30 全球购物
Europcar比利时:租车
2019/08/26 全球购物
物业管理专业个人的自我评价
2013/11/19 职场文书
美食节目策划方案
2014/05/31 职场文书
2014物价局群众路线对照检查材料思想汇报
2014/09/21 职场文书
Python Django项目和应用的创建详解
2021/11/27 Python
使用Nginx+Tomcat实现负载均衡的全过程
2022/05/30 Servers