1.hashilib模块的功能

python的hashlib提供了常见的摘要算法,如MD5, SHA1等等。

什么是摘要算法呢?摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换成一个长度固定的数据串(通常用16进制的字符串表示)。

摘要算法就是通过摘要函数对任意长度的data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡改过。

摘要算法之所以能指出数据是否被篡改过,就是因为摘要函数是一个单向函数,计算data的摘要digest很容易,但是通过digest反推data却非常困难,而且,对原始数据做一个bit的修改,都会导致据算出的摘要完全不同。

2.如何使用hashilib模块。

使用hashilib模块一般分为4步:

(1)在python中引用hashlib模块。

(2)创建一个hash对象,使用hash算法命名的构造函数,或者通用构造函数。

(3)使用hash对象调用update()方法填充对象

(4)调用digest()或者hexdigest()方法来获取摘要(加密结果)

3.实例代码

import hashlib
s = "How to use md5 in python hashlib?"
md5 = hashlib.md5()#调用一个md5对象
#调用md5的update()方法,对参数进行加密,加密必须为bytes类型
md5.update(s.encode("utf-8"))
print(md5.hexdigest())#打印加密结果

4.hashlib的常用代码

4.1 md5 = hashlib.md5() 或 md5 = hashlib.new("md5")

md5可以替换为其他的哈希类型。

4.2 md5.update(arg)

将字节对象arg填充到hashlib对象中,arg通常为要加密的字符串

4.3 md5.digest()

返回加密结果 ,它是一个字节对象,长度为md5.digest_size。

4.4 md5.hexdigest()

返回加密结果,它是一个字符串对象,长度为md5.digest_size*2,只包含16进制数字。

5.hashlib模块提供的常量属性

5.1 hashlib.algorithms_guaranteed

获取保证在所有平台上此模块支持的hash算法名称的集合。

5.2 hashlib.algorithms_available

获取可以运行在python解释器中的hash算法名称的集合。

6.注意事项

(1)update()方法需要接收的参数是一个字节对象。

(2)常用的一些算法主要有sha1, sha224, sha256, sha384, sha512, md5等算法。

(3)sha1算法比较早,是不能暴力破解的。

7.当要加密的数据量很大时,可以分块多次调用update(),最后计算的结果是一样的。

import hashlib  #调用hashlib模块
md5 = hashlib.md5() #创建一个md5模块
md5.update("how to use md5 in ".encode("utf-8")) #调用md5的update()方法,对参数进行加密,加密必须为bytes类型
md5.update("python hashlib?".encode("utf-8"))
print(md5.hexdigest()) #获取摘要内容

8.sha1摘要算法

sha1摘要算法是另一种常见的摘要算法,调用sha1的方式和md5类似

import hashlib
sha1 = hashlib.sha1()
sha1.update("how to use sha1 in ".encode("utf-8"))
sha1.update("python hashlib?".encode("utf-8"))
print(sha1.hexdigest())

9.hashlib的应用

9.1 密码验证

所有允许用户登录的网站都会将用户登录的用户名和密码存储在数据库中。

name    | password
--------+----------
michael | 123456
bob | abc999
alice | alice2008

如果以明文保存用户口令,如果数据库泄漏,所有用户的口令就落入黑客的手中。此外,网站运维人员是可以访问数据库的,也可以获取到所有用户的口令。正确的把保存口令的方式不是存储用户的明文密码,而是存储用户密码的摘要,比如md5:

username | password
---------+---------------------------------
michael | e10adc3949ba59abbe56e057f20f883e
bob | 878ef96e86145580c38c87f0410ad153
alice | 99b1c2188db85afee403b1536010c2c9

9.2 文件校验

hashlib的还有一个方面的应用就是文件校验,它可以在文件传输时,验证文件是否被完整接收,这用到的是hashlib的“相同字符串的摘要一致”原理。如果摘要一致,说明文件传输完成,否则就是文件在传输过程中丢帧。

10.加盐

考虑到有这个一个情况,就是有些用户喜欢用“123456”、“888888”等一些简单的口令,于是,黑客可以事先计算出这些常见口令的md5值,得到一个反推表:

'e10adc3949ba59abbe56e057f20f883e': '123456'
'21218cca77804d2ba1922c33e0151105': '888888'

这样,无需破解,只需要对比数据库的md5,黑客就获得了使用常用口令的用户帐号。

对于用户来说,当然不要使用过于简单的口令。同时,我们在程序设计上对简单口令加强保护。

由于常用口令的md5值很容易被计算出来,所以,要确保存储的用户密码不是那些已经被计算出来的常用口令的md5。这一方法通过对原始口令加一个复杂字符串来实现,俗成“加盐”:

hashlib.md5("salt".encode("utf-8"))

经过“salt”处理的md5口令,只要“salt”不被黑客知道,即使用户输入简单口令,也很难通过md5反推明文口令。

但是如果有两个用户都使用了相同的简单密码,比如“123456”,在数据库中,将存储两条相同的md5值,这说明两个用户的密码是一样的。

那么,有没有办法让使用相同口令的用户存储不同的md5呢?

假定用户无法修改登录名,就可以通过把登录名作为“salt”的一部分来计算md5,从而实现相同口令的用户也存储相同的md5。

11.hashlib模块补充

摘要算法在很多地方都有广泛的应用,要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改,但是他的单向计算特性决定了可以在不存储明文密码的情况下验证用户口令。

12.一个简单的验证存储明文口令程序

import hashlib

def md5(arg):   #这是加密函数,将传进来的函数加密
md5_pwd = hashlib.md5(bytes("abd", encoding="utf-8"))
md5_pwd.update(bytes(arg, encoding="utf-8"))
return md5_pwd.hexdigest() #返回加密的数据 def log(user, pwd): #登录时候的函数,由于md5不能反解, 因此登录的时候用正解
with open("user.txt", mode="r", encoding="utf-8") as f:
for line in f:
name, password = line.strip().split("|")
# 登录的时候验证用户名以及加密的密码跟之前保存的是否一样
if user == name and password == md5(pwd):
return True def register(user, pwd): #注册的时候把用户名和加密的密码写进文件,保存起来
with open("user.txt", mode="a", encoding="utf-8") as f:
msg = user + "|" + md5(pwd) + "\n"
f.write(msg) i = input("1表示登录,2表示注册").strip()
if i == "2":
user = input("用户名:")
pwd = input("密码:")
register(user, pwd)
elif i == "1":
user = input("用户名")
pwd = input("密码:")
r = log(user, pwd) #验证用户名和密码
if r == True:
print("登录成功")
else:
print("登录失败")
else:
print("输入不合法")

  

Python常用模块之hashlib模块的更多相关文章

  1. Python常用内置模块之xml模块

    xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.从结构上,很像HTML超文本标记语言.但他们被设计的目的是不同的,超文本标记语言被设计用来显示 ...

  2. Python 入门之 内置模块 -- hashlib模块

    Python 入门之 内置模块 -- hashlib模块 1.hashlib 摘要算法,加密算法 (1)主要用途: <1> 加密 : md5 sha1 sha256 sha512 md5, ...

  3. hmac模块和hashlib模块

    hmac模块和hashlib模块 一.hash是什么 ​ hash是一种算法(Python3.版本里使用hashlib模块代替了md5模块和sha模块,主要提供 SHA1.SHA224.SHA256. ...

  4. 包、logging模块、hashlib模块、openpyxl模块、深浅拷贝

    包.logging模块.hashlib模块.openpyxl模块.深浅拷贝 一.包 1.模块与包 模块的三种来源: 1.内置的 2.第三方的 3.自定义的 模块的四种表现形式: 1.py文件 2.共享 ...

  5. [xml模块、hashlib模块、subprocess模块、os与sys模块、configparser模块]

    [xml模块.hashlib模块.subprocess模块.os与sys模块.configparser模块] xml模块 XML:全称 可扩展标记语言,为了能够在不同的平台间继续数据的交换,使交换的数 ...

  6. Python模块之hashlib模块、logging模块

    一.hashlib模块 hashlib模块介绍:hashlib这个模块提供了摘要算法,例如 MD5.hsa1 摘要算法又称为哈希算法,它是通过一个函数,把任意长度的数据转换为一个长度固定的数据串,这个 ...

  7. 19 python初学(os 模块,sys 模块,hashlib 模块)

    os 模块: # _author: lily # _date: 2019/1/13 import os print(os.getcwd()) # 得到当前的工作目录 # print(os.chdir( ...

  8. Py修行路 python基础 (二十)模块 time模块,random模块,hashlib模块,OS及sys模块

    一.前提介绍: 可以开辟作用域的只有类,函数,和模块            for循环 if,else: 不能开辟自己的作用域 避免程序复用和重复调用,将这些写到一个.py文件中,做成一个模块,进行调 ...

  9. Python操作数据库及hashlib模块

    一.hashlib模块 hashlib模块,主要用于加密相关的操作,在python3的版本里,代替了md5和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA51 ...

随机推荐

  1. hdu 1506 最大子矩阵面积

    //写动态规划的题目 要把主要问题提炼出来 这里的问题就是求area=(j-k+1)*a[i]  如果找到j k是解决这个题目的关键 这里暴力求肯定是要超时的 这里用dp来优化 #include< ...

  2. POJ1845Sumdiv题解--约数之和

    题目链接 https://cn.vjudge.net/problem/POJ-1845 分析 \(POJ\)里的数学题总是这么妙啊 首先有一个结论就是\(A=\prod{ \ {p_i}^{c_i} ...

  3. arcgis 服务网页打开需要输入用户名和密码问题解决

    解决方法: 在站点manager中,检查服务的安全性,确认是否是公共.如果不是,设置为公共,面向任何人:如果服务已经被设置为面向公共,那么先设置为私有,面向所选用户,然后再设置为公共,面向任何人 如果 ...

  4. SpringBoot项目的限流

    开发访问量比较大的系统是,爬虫的目的就是解决访问量大的问题:缓存穿透是为了保护后端数据库查询服务:计数服务解决了接近真实访问量以及数据库服务的压力. 架构图 限流 就拿十万博客来说,如果存在热点文章, ...

  5. Windows 下 nvm, node, npm 的下载、安装与配置

    主要解决的问题 下载安装完 nvm 和 node 后,缺失 npm 文件 执行 jasmine 等命令时提示「不是内部或外部命令...」及全局变量的设置 下载与安装 一.nvm github 下载地址 ...

  6. MUI 支付案例(支付宝/微信)

    首先说明一下,本文借鉴了多位博主的文章,所以会看到很多一样的代码. 写这篇博客主要目的是为了便于后期查看(不好之处,敬请留言吐槽),案例经本人测试,是可以使用的. 先上效果图 前端HTML代码: &l ...

  7. Flutter 36: 图解自定义 View 之 Canvas (三)

    小菜继续学习 Canvas 的相关方法: drawVertices 绘制顶点 小菜上次没有整理 drawVertices 的绘制方法,这次补上:Vertice 即顶点,通过绘制多个顶点,在进行连线,多 ...

  8. 9.EL表达式 和 JSTL核心标签库

    EL表达式 1./*获取数据*/ (某个web域中的对象,访问javabean的属性.访问List集合.访问Map集合.访问数组) <html> <head> <titl ...

  9. 【loj#2524】【bzoj5303】 [Haoi2018]反色游戏(圆方树)

    题目传送门:loj bzoj 题意中的游戏方案可以转化为一个异或方程组的解,将边作为变量,点作为方程,因此若方程有解,方程的解的方案数就是2的自由元个数次方.我们观察一下方程,就可以发现自由元数量=边 ...

  10. Java虚拟机(JVM)知多少

    本文大量参考:https://www.cnblogs.com/lfs2640666960/p/9297176.html 概述 JVM是JRE的一部分.它是一个虚构出来的计算机,是通过在实际的计算机上仿 ...