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里将list中元素依次向前移动一位
Sep 12 Python
Python同时向控制台和文件输出日志logging的方法
May 26 Python
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
Jan 05 Python
浅谈python日志的配置文件路径问题
Apr 28 Python
Python使用Dijkstra算法实现求解图中最短路径距离问题详解
May 16 Python
使用python进行文本预处理和提取特征的实例
Jun 05 Python
Python 类的特殊成员解析
Jun 20 Python
Python 查找list中的某个元素的所有的下标方法
Jun 27 Python
python单例模式的多种实现方法
Jul 26 Python
Django实现基于类的分页功能
Oct 31 Python
基于pytorch padding=SAME的解决方式
Feb 18 Python
python 制作网站筛选工具(附源码)
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 编写的日历
2006/10/09 PHP
php adodb介绍
2009/03/19 PHP
PHP 中文乱码解决办法总结分析
2009/07/30 PHP
PHP教程 基本语法
2009/10/23 PHP
IP138 IP地址查询小偷实现代码
2010/02/15 PHP
yii实现级联下拉菜单的方法
2014/07/31 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
2014/12/16 PHP
php使用正则表达式获取图片url的方法
2015/01/16 PHP
PHP面向对象程序设计之类与反射API详解
2016/12/02 PHP
Yii2中简单的场景使用介绍
2017/06/02 PHP
div移动 输入框不能输入的问题
2009/11/19 Javascript
JQuery通过Ajax提交表单并返回结果
2011/07/31 Javascript
js同比例缩放图片的小例子
2013/10/30 Javascript
javascript实现多级联动下拉菜单的方法
2015/02/06 Javascript
使用ngView配合AngularJS应用实现动画效果的方法
2015/06/19 Javascript
js判断checkbox是否选中个数的方法(超简单)
2016/08/19 Javascript
JS实现全屏的四种写法
2016/12/30 Javascript
js实现手机发送验证码功能
2017/03/13 Javascript
vue语法之拼接字符串的示例代码
2017/10/25 Javascript
Vue中的无限加载vue-infinite-loading的方法
2018/04/08 Javascript
jQuery+ajax实现批量删除功能完整示例
2019/06/06 jQuery
微信小程序入门之指南针
2020/10/22 Javascript
Vuex实现简单购物车
2021/01/10 Vue.js
Python3 模块、包调用&amp;路径详解
2017/10/25 Python
python实现可视化动态CPU性能监控
2018/06/21 Python
Django教程笔记之中间件middleware详解
2018/08/01 Python
python 随机打乱 图片和对应的标签方法
2018/12/14 Python
Python用Try语句捕获异常的实例方法
2019/06/26 Python
pycharm的python_stubs问题
2020/04/08 Python
HTML5+lufylegend实现游戏中的卷轴
2016/02/29 HTML / CSS
印度婴儿用品在线商店:Firstcry.com
2016/12/05 全球购物
Tod’s英国官方网站:意大利奢华手工制作手袋和鞋履
2019/03/15 全球购物
Deux par Deux官方网站:设计师童装
2020/01/03 全球购物
人事专员的岗位职责
2014/03/01 职场文书
2015年会计个人工作总结
2015/04/02 职场文书
win11怎么消除图标小盾牌?win11消除图标小盾牌解决方法
2022/08/05 数码科技