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中with及contextlib的用法详解
Jun 08 Python
python中利用await关键字如何等待Future对象完成详解
Sep 07 Python
TensorFlow实现AutoEncoder自编码器
Mar 09 Python
python2 与 python3 实现共存的方法
Jul 12 Python
Python产生Gnuplot绘图数据的方法
Nov 09 Python
PyQt4实时显示文本内容GUI的示例
Jun 14 Python
Django REST framework 分页的实现代码
Jun 19 Python
python实现在多维数组中挑选符合条件的全部元素
Nov 26 Python
解决Pytorch 加载训练好的模型 遇到的error问题
Jan 10 Python
python实现将列表中各个值快速赋值给多个变量
Apr 02 Python
基于Python3读写INI配置文件过程解析
Jul 23 Python
OpenCV灰度化之后图片为绿色的解决
Dec 01 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
使用 eAccelerator加速PHP代码的方法
2007/09/30 PHP
在php MYSQL中插入当前时间
2008/04/06 PHP
php socket实现的聊天室代码分享
2014/08/16 PHP
CodeIgniter分页类pagination使用方法示例
2016/03/28 PHP
laravel框架学习笔记之组件化开发实现方法
2020/02/01 PHP
获取焦点时,利用js定时器设定时间执行动作
2010/04/02 Javascript
jquery $.ajax各个事件执行顺序
2010/10/15 Javascript
动态加载外部javascript文件的函数代码分享
2011/07/28 Javascript
封装好的一个万能检测表单的方法
2015/01/21 Javascript
Bootstrap轮播插件中图片变形的终极解决方案 使用jqthumb.js
2016/07/10 Javascript
关于Javascript回调函数的一个妙用
2016/08/29 Javascript
ReactNative-JS 调用原生方法实例代码
2016/10/08 Javascript
angularjs实现柱状图动态加载的示例
2017/12/11 Javascript
Vue中Quill富文本编辑器的使用教程
2018/09/21 Javascript
js时间戳转yyyy-MM-dd HH-mm-ss工具类详解
2019/04/30 Javascript
JavaScript使用localStorage存储数据
2019/09/25 Javascript
js实现选项卡效果
2020/03/07 Javascript
JS实现滑动拼图验证功能完整示例
2020/03/29 Javascript
python组合无重复三位数的实例
2018/11/13 Python
python命令 -u参数用法解析
2019/10/24 Python
多个python文件调用logging模块报错误
2020/02/12 Python
Anaconda和ipython环境适配的实现
2020/04/22 Python
matplotlib.pyplot.plot()参数使用详解
2020/07/28 Python
Python爬虫之Selenium实现键盘事件
2020/12/04 Python
使用CSS变量实现炫酷惊人的悬浮效果
2019/04/26 HTML / CSS
HTML5+CSS3应用详解
2014/02/24 HTML / CSS
护士自我鉴定
2013/10/23 职场文书
决心书标准格式
2014/03/11 职场文书
工程建设实施方案
2014/03/14 职场文书
2014年班主任自我评价范文
2014/04/23 职场文书
奥巴马经典演讲稿
2014/09/13 职场文书
工作期间打牌检讨书范文
2014/11/20 职场文书
公司员工手册范本
2015/05/14 职场文书
运动会宣传稿50字
2015/07/23 职场文书
2016年三八节红领巾广播稿
2015/12/17 职场文书
党性修养心得体会2016
2016/01/21 职场文书