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 详解的更多相关文章

  1. Python闭包详解

    Python闭包详解 1 快速预览 以下是一段简单的闭包代码示例: def foo(): m=3 n=5 def bar(): a=4 return m+n+a return bar >> ...

  2. [转] Python Traceback详解

    追莫名其妙的bugs利器-mark- 转自:https://www.jianshu.com/p/a8cb5375171a   Python Traceback详解   刚接触Python的时候,简单的 ...

  3. python 数据类型详解

    python数据类型详解 参考网址:http://www.cnblogs.com/linjiqin/p/3608541.html 目录1.字符串2.布尔类型3.整数4.浮点数5.数字6.列表7.元组8 ...

  4. Python 递归函数 详解

    Python 递归函数 详解   在函数内调用当前函数本身的函数就是递归函数   下面是一个递归函数的实例: 第一次接触递归函数的人,都会被它调用本身而搞得晕头转向,而且看上面的函数调用,得到的结果会 ...

  5. python线程详解

    #线程状态 #线程同步(锁)#多线程的优势在于可以同时运行多个任务,至少感觉起来是这样,但是当线程需要共享数据时,可能存在数据不同步的问题. #threading模块#常用方法:'''threadin ...

  6. python数据类型详解(全面)

    python数据类型详解 目录1.字符串2.布尔类型3.整数4.浮点数5.数字6.列表7.元组8.字典9.日期 1.字符串1.1.如何在Python中使用字符串a.使用单引号(')用单引号括起来表示字 ...

  7. Python Collections详解

    Python Collections详解 collections模块在内置数据结构(list.tuple.dict.set)的基础上,提供了几个额外的数据结构:ChainMap.Counter.deq ...

  8. python生成器详解

    1. 生成器 利用迭代器(迭代器详解python迭代器详解),我们可以在每次迭代获取数据(通过next()方法)时按照特定的规律进行生成.但是我们在实现一个迭代器时,关于当前迭代到的状态需要我们自己记 ...

  9. 转 python数据类型详解

    python数据类型详解 目录 1.字符串 2.布尔类型 3.整数 4.浮点数 5.数字 6.列表 7.元组 8.字典 9.日期 1.字符串 1.1.如何在Python中使用字符串 a.使用单引号(' ...

随机推荐

  1. Java JDK 1.8 安装及配置

    1.下载 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 要注册,注 ...

  2. TypeScript(进行中)

    https://ts.xcatliu.com 简介 什么是 TypeScript 即使不显式的定义类型,也能够自动做出类型推论 即使第三方库不是用 TypeScript 写的,也可以编写单独的类型文件 ...

  3. 复习babel

    对babel进行复习

  4. 阻止a链接跳转的点击事件

    <a href="http://www.baidu.com" id="btn">按钮</a> <script> docume ...

  5. iframe刷新另一个iframe

    如果是程序: Response.Write("<script language=javascript>");                Response.Write ...

  6. mysql建立索引类型及索引建立的原则

    索引类型:Unique(唯一索引,一般为主键),Normal(一般索引,普通字段,可做组合索引),索引方法:BTREE 1.选择唯一性索引 唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录 ...

  7. C#中删除目录以及目录下文件的方法

    场景 C#中根据文件夹路径,将文件夹以及文件夹下文件删除. 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi关注公众号 霸道的程序猿 获取编程相关电 ...

  8. cobbler自动安装linux

    1- cobbler简介   cobbler是一个系统启动服务boot server,可以通过pxe得方式用来快速安装.重装系统,支持安装不同linux发行版和windows.   基于python开 ...

  9. 一些PC小软件/工具/神器备份

    小巧.有用的工具,提升工作效率. 以下所有软件均在吾爱破解可以找到(善用搜索) everything(本机文件搜索神器) 天若OCR文字识别(强无敌) QQ拼音截屏工具(从QQ拼音/QQ中独立拿出来的 ...

  10. Hdu2097 Sky数

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2097 Problem Description Sky从小喜欢奇特的东西,而且天生对数字特别敏感,一次偶 ...