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动态加载变量示例分享
Feb 17 Python
python从sqlite读取并显示数据的方法
May 08 Python
详解Python的Django框架中的templates设置
May 11 Python
Python字符串特性及常用字符串方法的简单笔记
Jan 04 Python
Python中pygal绘制雷达图代码分享
Dec 07 Python
python使用json序列化datetime类型实例解析
Feb 11 Python
pytorch + visdom CNN处理自建图片数据集的方法
Jun 04 Python
Pycharm+Scrapy安装并且初始化项目的方法
Jan 15 Python
Python企业编码生成系统总体系统设计概述
Jul 26 Python
Python logging模块写入中文出现乱码
May 21 Python
Python 常用日期处理 -- calendar 与 dateutil 模块的使用
Sep 02 Python
基于python实现坦克大战游戏
Oct 27 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中文字母数字验证码实现代码
2008/04/25 PHP
php面象对象数据库操作类实例
2014/12/02 PHP
Yii框架组件和事件行为管理详解
2016/05/20 PHP
Yii的Srbac插件用法详解
2016/07/14 PHP
理解Javascript_05_原型继承原理
2010/10/13 Javascript
Jquery.LazyLoad.js修正版下载,实现图片延迟加载插件
2011/03/12 Javascript
火狐下input焦点无法重复获取问题的解决方法
2014/06/16 Javascript
使用jquery动态加载js文件的方法
2014/12/24 Javascript
jquery实现的横向二级导航效果代码
2015/08/26 Javascript
JavaScript中字面量与函数的基本使用知识
2015/10/20 Javascript
如何解决hover在ie6中的兼容性问题
2016/12/15 Javascript
javascript添加前置0(补零)的几种方法
2017/01/05 Javascript
AngularJS实现路由实例
2017/02/12 Javascript
jQuery常用选择器详解
2017/07/17 jQuery
vue组件jsx语法的具体使用
2018/05/21 Javascript
详解如何提升JSON.stringify()的性能
2019/06/12 Javascript
JavaScript 作用域scope简单汇总
2019/10/23 Javascript
浅谈python中get pass用法
2019/03/19 Python
Django中在xadmin中集成DjangoUeditor过程详解
2019/07/24 Python
pytorch 共享参数的示例
2019/08/17 Python
Python getattr()函数使用方法代码实例
2020/08/10 Python
儿科主治医生个人求职信
2013/09/23 职场文书
车工岗位职责
2013/11/26 职场文书
DIY蛋糕店的创业计划书范文
2013/12/26 职场文书
活动邀请函范文
2014/01/19 职场文书
应届毕业生简历自我评价
2014/01/31 职场文书
买卖协议书范本
2014/04/21 职场文书
2014年置业顾问工作总结
2014/11/17 职场文书
老公保证书
2015/01/17 职场文书
党员个人总结范文
2015/02/14 职场文书
2015年煤矿安全工作总结
2015/05/23 职场文书
安全生产协议书
2016/03/22 职场文书
2016年安全月活动总结
2016/04/06 职场文书
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
2021/06/11 Python
手写Spirit防抖函数underscore和节流函数lodash
2022/03/22 Javascript
SQL Server数据库的三种创建方法汇总
2023/05/08 MySQL