python hashlib 详解
1.概述
摘要算法简介
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。 什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。 举个例子,你写了一篇文章,内容是一个字符串'how to use python hashlib - by Michael',并附上这篇文章的摘要是'2d73d4f15c0db7f5ecb321b6a65e5d6d'。如果有人篡改了你的文章,并发表为'how to use python hashlib - by Bob',你可以一下子指出Bob篡改了你的文章,因为根据'how to use python hashlib - by Bob'计算出的摘要不同于原始文章的摘要。 可见,摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。 摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算f(data)很容易,但通过digest反推data却非常困难。而且,对原始数据做一个bit的修改,都会导致计算出的摘要完全不同。
2.举例
import hashlib
md5 = hashlib.md5()
md5.updata("this md5".encode("utf-8"))
print(md5.hexdigest())
# 注意:python3 必须转码为utf-8
# 结果为:1fb854b337664396bacd634a2ad0ec18 #当数据量过过大时,可以分块摘要,例如:
import hashlib
md5 = hashlib.md5()
md5.updata("this".encode("utf-8"))
md5.updata("md5".encode("utf-8"))
print(md5.hexdigest())
# 注意:分块是空格也要保持一致
# 结果为:1fb854b337664396bacd634a2ad0ec18
# MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。
2.1 另一种摘要方式 SHA1
SHA1用法与md5类似
import hashlib sha1 = hashlib.sha1()
sha1.update("this sha1 ".encode("utf-8"))
print(sha1.hexdigest())
# 结果 :db56cab5dcf85f12cb558e53eec3a0b070a6e953
# SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示。
# 比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,而且摘要长度更长。
# 有没有可能两个不同的数据通过某个摘要算法得到了相同的摘要?完全有可能,因为任何摘要算法都是把无限多的数据集合映射到一个有限的集合中。这种情况称为碰撞,比如Bob试图根据你的摘要反推出一篇文章'how to learn hashlib in python - by Bob',并且这篇文章的摘要恰好和你的文章完全一致,这种情况也并非不可能出现,但是非常非常困难。
3.应用
任何允许用户登录的网站都会存储用户登录的用户名和口令。
如何存储用户名和口令呢?方法是存到数据库表中:
name | password
--------+----------
michael | 123456
bob | abc999
alice | alice2008 如果以明文保存用户口令,如果数据库泄露,所有用户的口令就落入黑客的手里。此外,网站运维人员是可以访问数据库的,也就是能获取到所有用户的口令。 正确的保存口令的方式是不存储用户的明文口令,而是存储用户口令的摘要,
比如MD5:
username | password
---------+---------------------------------
michael | e10adc3949ba59abbe56e057f20f883e
bob | 878ef96e86145580c38c87f0410ad153
alice | 99b1c2188db85afee403b1536010c2c9 当用户登录时,首先计算用户输入的明文口令的MD5,
然后和数据库存储的MD5对比,如果一致,说明口令输入正确,
如果不一致,口令肯定错误。
4.高级应用
采用MD5存储口令是否就一定安全呢?也不一定。
假设你是一个黑客,已经拿到了存储MD5口令的数据库,
如何通过MD5反推用户的明文口令呢?暴力破解费事费力,真正的黑客不会这么干。 考虑这么个情况,很多用户喜欢用123456,888888,password这些简单的口令,
于是,黑客可以事先计算出这些常用口令的MD5值,得到一个反推表:
'e10adc3949ba59abbe56e057f20f883e': ''
'21218cca77804d2ba1922c33e0151105': ''
'5f4dcc3b5aa765d61d8327deb882cf99': 'password' 对于用户来讲,当然不要使用过于简单的口令。但是,我们能否在程序设计上对简单口令加强保护呢? 由于常用口令的MD5值很容易被计算出来,所以,要确保存储的用户口令不是那些已经被计算出来的常用口令的MD5,
这一方法通过对原始口令加一个复杂字符串来实现,俗称“加盐”:
def calc_md5(password):
return get_md5(password + 'the-Salt') 经过Salt处理的MD5口令,只要Salt不被黑客知道,即使用户输入简单口令,也很难通过MD5反推明文口令。 但是如果有两个用户都使用了相同的简单口令比如123456,
在数据库中,将存储两条相同的MD5值,
这说明这两个用户的口令是一样的。有没有办法让使用相同口令的用户存储不同的MD5呢? 如果假定用户无法修改登录名,
就可以通过把登录名作为Salt的一部分来计算MD5,从而实现相同口令的用户也存储不同的MD5
5.总结
摘要算法在很多地方都有广泛的应用。 要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改, 但是它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令
参照:https://www.liaoxuefeng.com/wiki/897692888725344/923057313018752
python hashlib 详解的更多相关文章
- Python闭包详解
Python闭包详解 1 快速预览 以下是一段简单的闭包代码示例: def foo(): m=3 n=5 def bar(): a=4 return m+n+a return bar >> ...
- [转] Python Traceback详解
追莫名其妙的bugs利器-mark- 转自:https://www.jianshu.com/p/a8cb5375171a Python Traceback详解 刚接触Python的时候,简单的 ...
- python 数据类型详解
python数据类型详解 参考网址:http://www.cnblogs.com/linjiqin/p/3608541.html 目录1.字符串2.布尔类型3.整数4.浮点数5.数字6.列表7.元组8 ...
- Python 递归函数 详解
Python 递归函数 详解 在函数内调用当前函数本身的函数就是递归函数 下面是一个递归函数的实例: 第一次接触递归函数的人,都会被它调用本身而搞得晕头转向,而且看上面的函数调用,得到的结果会 ...
- python线程详解
#线程状态 #线程同步(锁)#多线程的优势在于可以同时运行多个任务,至少感觉起来是这样,但是当线程需要共享数据时,可能存在数据不同步的问题. #threading模块#常用方法:'''threadin ...
- python数据类型详解(全面)
python数据类型详解 目录1.字符串2.布尔类型3.整数4.浮点数5.数字6.列表7.元组8.字典9.日期 1.字符串1.1.如何在Python中使用字符串a.使用单引号(')用单引号括起来表示字 ...
- Python Collections详解
Python Collections详解 collections模块在内置数据结构(list.tuple.dict.set)的基础上,提供了几个额外的数据结构:ChainMap.Counter.deq ...
- python生成器详解
1. 生成器 利用迭代器(迭代器详解python迭代器详解),我们可以在每次迭代获取数据(通过next()方法)时按照特定的规律进行生成.但是我们在实现一个迭代器时,关于当前迭代到的状态需要我们自己记 ...
- 转 python数据类型详解
python数据类型详解 目录 1.字符串 2.布尔类型 3.整数 4.浮点数 5.数字 6.列表 7.元组 8.字典 9.日期 1.字符串 1.1.如何在Python中使用字符串 a.使用单引号(' ...
随机推荐
- 洛谷 UVA11388 GCD LCM
UVA11388 GCD LCM Description of the title PDF The GCD of two positive integers is the largest intege ...
- axios上传图片遇见问题
博客后台,vue-quill-editor 编辑器,上传图片,使用sm.ms图床,上传逻辑需要自定义,element-ui,el-upload,自定义http-request上传图片, 'conten ...
- 使用centos6.5整理出来的常用命令
1.Vi 基本操作1) 进入vi 在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面: $ vi myfile 进入vi之后,是处于「命令行模式(command mode)」,您要切换到「插 ...
- STM32 & RT-Thread的逆向入门
STM32 & RT-Thread的逆向入门 backahasten@0xFA 现在,各种MCU的价格越来越低,同等条件下能买到的ROM和RAM资源也多了.对 ...
- 03-React基础语法(3)
一.Context 概念:Context 提供一个无需在每层组件中添加Props,就可以实现组件组件之间通信的方法 语法: 1创建context对象 const {Provider, Consum ...
- 洛谷【P2022 有趣的数】 题解
题目链接 https://www.luogu.org/problem/P2022 题目描述 让我们来考虑1到N的正整数集合.让我们把集合中的元素按照字典序排列,例如当N=11时,其顺序应该为:1,10 ...
- HTML-入门
HTML——超文本标记语言(Hyper Text Markup Language)html——W3C制定的标准超文本——除了文本,还有图片.视频.音频等丰富的元素标记(标签)——用来展示内容表型:标签 ...
- LeetCode subarray-sum-equals-k题解 前缀和+Hash表+枚举——线性做法
文章目录 题意 思路 连续子数组的和sum[i,j] 源码 结果记录 题意 给定一个数组,求连续的子数组的和为k的子数组个数. 思路 连续子数组的和sum[i,j] sum[i,j]=∑k=ijAk( ...
- POJ1273【网络流】
Drainage Ditches Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 91824 Accepted ...
- 使用win10 IIS 发布局域网网站
1.安装IIS 按win+R键,输入control,打开控制面板,点击程序,点击 启用或关闭windows 功能,将Internet Information Service勾上,把下属的asp.net ...