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中readline判断文件读取结束的方法
Nov 08 Python
python使用BeautifulSoup分页网页中超链接的方法
Apr 04 Python
Python简单计算文件夹大小的方法
Jul 14 Python
Python使用django搭建web开发环境
Jun 09 Python
基于python中staticmethod和classmethod的区别(详解)
Oct 24 Python
Flask框架通过Flask_login实现用户登录功能示例
Jul 17 Python
python 遍历列表提取下标和值的实例
Dec 25 Python
Python魔法方法详解
Feb 13 Python
python 多线程对post请求服务器测试并发的方法
Jun 13 Python
Python_查看sqlite3表结构,查询语句的示例代码
Jul 17 Python
FFT快速傅里叶变换的python实现过程解析
Oct 21 Python
python如何获取网络数据
Apr 11 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
星际争霸中的对战模式介绍
2020/03/04 星际争霸
php 信息采集程序代码
2009/03/17 PHP
解决File size limit exceeded 错误的方法
2013/06/14 PHP
PHP实现把MySQL数据库导出为.sql文件实例(仿PHPMyadmin导出功能)
2014/05/10 PHP
php读取mssql的ntext字段返回值为空的解决方法
2014/12/30 PHP
PHP中error_reporting()用法详解
2015/08/31 PHP
php实现微信发红包
2015/12/05 PHP
CentOS7系统搭建LAMP及更新PHP版本操作详解
2020/03/26 PHP
PHP 自动加载类原理与用法实例分析
2020/04/14 PHP
40款非常棒的jQuery 插件和制作教程(系列一)
2011/10/26 Javascript
A标签中通过href和onclick传递的this对象实现思路
2013/04/19 Javascript
JS对话框_JS模态对话框showModalDialog用法总结
2014/01/11 Javascript
ie 7/8不支持trim的属性的解决方案
2014/05/23 Javascript
jQuery EasyUI封装简化操作
2016/09/18 Javascript
JS前端开发判断是否是手机端并跳转操作(小结)
2017/02/05 Javascript
Vue监听数组变化源码解析
2017/03/09 Javascript
整理关于Bootstrap模态弹出框的慕课笔记
2017/03/29 Javascript
Vue.extend构造器的详解
2017/07/17 Javascript
Mpvue中使用Vant Weapp组件库的方法步骤
2019/05/16 Javascript
Vue路由权限控制解析
2020/11/09 Javascript
[52:52]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第三局
2016/02/27 DOTA
[52:36]VGJ.S vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python3.4用循环往mysql5.7中写数据并输出的实现方法
2017/06/20 Python
python3解析库lxml的安装与基本使用
2018/06/27 Python
python3安装speech语音模块的方法
2018/12/24 Python
python开发之anaconda以及win7下安装gensim的方法
2019/07/05 Python
Python图像处理模块ndimage用法实例分析
2019/09/05 Python
python爬虫爬取监控教务系统的思路详解
2020/01/08 Python
Python OpenCV中的numpy与图像类型转换操作
2020/12/11 Python
一款纯css3实现的动画加载导航
2014/10/08 HTML / CSS
荷兰在线啤酒店:Beerwulf
2019/08/26 全球购物
SIDESTEP荷兰:在线购买鞋子
2019/11/18 全球购物
ShellScript面试题一则-ShellScript编程
2014/03/05 面试题
大学生社会实践自我鉴定
2014/03/24 职场文书
兽医医药专业求职信
2014/07/27 职场文书
2014年“世界无车日”活动方案
2014/09/21 职场文书