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中map,reduce,filter和sorted函数的使用方法
Aug 17 Python
老生常谈Python序列化和反序列化
Jun 28 Python
Pandas 数据处理,数据清洗详解
Jul 10 Python
Python闭包函数定义与用法分析
Jul 20 Python
Python分布式进程中你会遇到的问题解析
May 28 Python
使用Python opencv实现视频与图片的相互转换
Jul 08 Python
Django  ORM 练习题及答案
Jul 19 Python
Pytorch之Variable的用法
Dec 31 Python
基于pygame实现童年掌机打砖块游戏
Feb 25 Python
用Python制作mini翻译器的实现示例
Aug 17 Python
通过Python pyecharts输出保存图片代码实例
Nov 25 Python
python 30行代码实现蚂蚁森林自动偷能量
Feb 08 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实现手机归属地查询API接口实现代码
2012/08/27 PHP
如何在PHP中使用正则表达式进行查找替换
2013/06/13 PHP
CodeIgniter CLI模式简介
2014/06/17 PHP
PHP图片添加水印功能示例小结
2016/10/03 PHP
详解php用curl调用接口方法,get和post两种方式
2017/01/13 PHP
JS打印gridview实现原理及代码
2013/02/05 Javascript
JavaScript中使用Substring删除字符串最后一个字符
2013/11/03 Javascript
jquery获取颜色在ie和ff下的区别示例介绍
2014/03/28 Javascript
Bootstrap的popover(弹出框)在append后弹不出(失效)
2017/02/27 Javascript
基于Vue实例对象的数据选项
2017/08/09 Javascript
微信小程序实现图片压缩功能
2018/01/26 Javascript
百度地图去掉marker覆盖物或者去掉maker的label文字方法
2018/01/26 Javascript
webpack配置打包后图片路径出错的解决
2018/04/26 Javascript
Vue.js 中取得后台原生HTML字符串 原样显示问题的解决方法
2018/06/10 Javascript
jQuery轮播图实例详解
2018/08/15 jQuery
一个手写的vue放大镜效果
2019/08/09 Javascript
Vue开发中常见的套路和技巧总结
2020/11/24 Vue.js
vue打开其他项目页面并传入数据详解
2020/11/25 Vue.js
详解javascript脚本何时会被执行
2021/02/05 Javascript
[04:37]DOTA2英雄梦之声Vol20发条
2014/06/20 DOTA
Python 类与元类的深度挖掘 II【经验】
2016/05/06 Python
Python中的异常处理相关语句基础学习笔记
2016/07/11 Python
Python 包含汉字的文件读写之每行末尾加上特定字符
2016/12/12 Python
Python随机读取文件实现实例
2017/05/25 Python
python的staticmethod与classmethod实现实例代码
2018/02/11 Python
python 获取毫秒数,计算调用时长的方法
2019/02/20 Python
使用python制作一个解压缩软件
2019/11/13 Python
怎样声明接口
2014/09/19 面试题
办公室副主任岗位职责
2013/11/25 职场文书
学生思想表现的评语
2014/01/30 职场文书
百货商场楼层班组长竞聘书
2014/03/31 职场文书
工作失职检讨书500字
2014/10/17 职场文书
毕业班工作总结
2015/08/10 职场文书
2016元旦晚会主持人开场白和结束语
2015/12/03 职场文书
2016年六一儿童节开幕词
2016/03/04 职场文书
8个JS的reduce使用实例和reduce操作方式
2021/10/05 Javascript