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实现ip查询示例
Mar 26 Python
python爬虫实现教程转换成 PDF 电子书
Feb 19 Python
python根据unicode判断语言类型实例代码
Jan 17 Python
对python中数组的del,remove,pop区别详解
Nov 07 Python
python判断计算机是否有网络连接的实例
Dec 15 Python
Windows下pycharm创建Django 项目(虚拟环境)过程解析
Sep 16 Python
python+mysql实现个人论文管理系统
Oct 25 Python
使用Python画出小人发射爱心的代码
Nov 23 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
Jan 03 Python
Python类中的装饰器在当前类中的声明与调用详解
Apr 15 Python
基于Python脚本实现邮件报警功能
May 20 Python
keras 获取某层的输入/输出 tensor 尺寸操作
Jun 10 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
ThinkPHP Mobile使用方法简明教程
2014/06/18 PHP
PHP对象克隆clone用法示例
2016/09/28 PHP
php is_writable判断文件是否可写实例代码
2016/10/13 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
2017/04/19 PHP
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
2019/03/07 PHP
运算符&amp;&amp;的三个不同层次
2013/04/07 Javascript
jquery ajax双击div可直接修改div中的内容
2016/03/04 Javascript
jquery移除了live()、die(),新版事件绑定on()、off()的方法
2016/10/26 Javascript
微信小程序之拖拽排序(代码分享)
2017/01/21 Javascript
深入理解Javascript中的观察者模式
2017/02/20 Javascript
JS实现遍历不规则多维数组的方法
2018/03/21 Javascript
支付宝小程序自定义弹窗dialog插件的实现代码
2018/11/30 Javascript
浅谈微信小程序列表埋点曝光指南
2019/10/15 Javascript
Vue 实现显示/隐藏层的思路(加全局点击事件)
2019/12/31 Javascript
js判断鼠标移入移出方向的方法
2020/06/24 Javascript
改进Django中的表单的简单方法
2015/07/17 Python
Python中动态创建类实例的方法
2017/03/24 Python
linux环境下python中MySQLdb模块的安装方法
2017/06/16 Python
Python实现七彩蟒蛇绘制实例代码
2018/01/16 Python
python使用turtle库绘制树
2018/06/25 Python
Python骚操作之动态定义函数
2019/03/26 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
2019/08/09 Python
Python 实现简单的客户端认证
2020/07/29 Python
两种CSS3伪类选择器详细介绍
2013/12/24 HTML / CSS
瑞贝卡·明可弗包包官网:Rebecca Minkoff
2016/07/21 全球购物
家乐福台湾线上购物网:Carrefour台湾
2020/09/15 全球购物
百日安全活动总结
2014/05/04 职场文书
销售员岗位职责
2014/06/09 职场文书
六查六看剖析材料
2014/10/06 职场文书
销售员未完成销售业绩的检讨书
2014/10/12 职场文书
培训讲师开场白
2015/06/01 职场文书
《赵州桥》教学反思
2016/02/17 职场文书
辞职信怎么写?
2019/05/21 职场文书
创业计划之特色精品店
2019/08/12 职场文书
Python预测分词的实现
2021/06/18 Python
MySQL时区造成时差问题
2022/04/13 MySQL