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比较两个图片相似度的方法
Mar 13 Python
Django框架下在URLconf中指定视图缓存的方法
Jul 23 Python
基于Python实现对PDF文件的OCR识别
Aug 05 Python
使用python实现接口的方法
Jul 07 Python
python学习笔记之列表(list)与元组(tuple)详解
Nov 23 Python
详谈pandas中agg函数和apply函数的区别
Apr 20 Python
Python实现读取txt文件并转换为excel的方法示例
May 17 Python
python利用ffmpeg进行录制屏幕的方法
Jan 10 Python
在自动化中用python实现键盘操作的方法详解
Jul 19 Python
python交互模式基础知识点学习
Jun 18 Python
Python数据可视化实现多种图例代码详解
Jul 14 Python
Pandas直接读取sql脚本的方法
Jan 21 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文件上传原理简单分析
2011/05/29 PHP
PHP写的加密函数,支持私人密钥(详细介绍)
2013/06/09 PHP
php5.3 goto函数介绍和示例
2014/03/21 PHP
php在数组中查找指定值的方法
2015/03/17 PHP
php curl请求信息和返回信息设置代码实例
2015/04/27 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
使用Laravel中的查询构造器实现增删改查功能
2019/09/03 PHP
BootstrapTable+KnockoutJS自定义T4模板快速生成增删改查页面
2016/08/01 Javascript
vue-cli的webpack模板项目配置文件分析
2017/04/01 Javascript
全面解析jQuery中的$(window)与$(document)的用法区别
2017/08/15 jQuery
深入理解vue中slot与slot-scope的具体使用
2018/01/26 Javascript
vue项目中导入swiper插件的方法
2018/01/30 Javascript
简单了解JavaScript异步
2019/05/23 Javascript
解决layer.confirm选择完之后消息框不消失的问题
2019/09/16 Javascript
js实现限定区域范围拖拉拽效果
2020/11/20 Javascript
python中MySQLdb模块用法实例
2014/11/10 Python
python实现在sqlite动态创建表的方法
2015/05/08 Python
Python使用Scrapy爬取妹子图
2015/05/28 Python
Python之re操作方法(详解)
2017/06/14 Python
Python抓取聚划算商品分析页面获取商品信息并以XML格式保存到本地
2018/02/23 Python
python实现excel读写数据
2021/03/02 Python
pycharm安装和首次使用教程
2018/08/27 Python
Django实现whoosh搜索引擎使用jieba分词
2020/04/08 Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
2020/12/16 Python
美国Rue La La闪购网站:奢侈品、中高档品牌限时折扣
2016/10/19 全球购物
KIKO MILANO荷兰网上商店:意大利专业化妆品品牌
2017/05/12 全球购物
英国排名第一的LED灯泡网站:LED Bulbs
2019/09/03 全球购物
5个HTML5的常用本地存储方式详解与介绍
2021/03/27 HTML / CSS
教育学专业实习生的自我鉴定
2013/11/26 职场文书
争论的故事教学反思
2014/02/06 职场文书
家教广告词
2014/03/19 职场文书
2015年远程教育工作总结
2015/05/20 职场文书
基于Pygame实现简单的贪吃蛇游戏
2021/12/06 Python
Python内置类型集合set和frozenset的使用详解
2022/04/26 Python
Java由浅入深通关抽象类与接口(下篇)
2022/04/26 Java/Android
td 内容自动换行 table表格td设置宽度后文字太多自动换行
2022/12/24 HTML / CSS