Python——第五章:hashlib模块
hashlib 模块(hash)算法
hashlib 模块是 Python 中用于加密散列(hash)算法的模块。它提供了对常见的哈希算法(如MD5、SHA-1、SHA-256等)的支持,使得开发者可以轻松地在其应用中进行数据的安全散列。
以下是 hashlib 模块中一些常用的哈希算法:
MD5 (Message Digest Algorithm 5): 产生128位的哈希值,通常以32位十六进制数字表示。
SHA-1 (Secure Hash Algorithm 1): 产生160位的哈希值,通常以40位十六进制数字表示。然而,由于SHA-1存在一些弱点,推荐使用更安全的算法。
SHA-224, SHA-256, SHA-384, SHA-512: SHA-2 系列,分别产生224、256、384和512位的哈希值。
md5算法:
我们使用 .md5() 创建了一个 MD5 哈希对象,然后使用 .update() 方法更新了输入数据,最后使用 .hexdigest() 方法获取了最终的 MD5 哈希值。
import hashlib
# 创建MD5对象
obj = hashlib.md5()
# 把要加密的信息传递给obj
obj.update("666666".encode("utf-8"))
# 从obj中拿到密文
mi = obj.hexdigest()
print(mi)
#运行结果
f379eaf3c831b04de153469d1bec345e
这里注意:update要求,我们给定的字符串需要先被编码encode("utf-8"),再进行哈希
obj.update("666666")
#运行结果
obj.update("666666")
TypeError: Strings must be encoded before hashing
MD5哈希函数算法是单向的,也就是用拿到的密码是无法反向解密的。因此,通常存储密码时,都是存储其哈希值而不是明文密码。
但是因为MD5的算法已经存在很多年了,现在很多网站上都有MD5的撞库查询法:
这是我们拿加密好的值f379eaf3c831b04de153469d1bec345e来查询为666666的结果

如果一个网站仍然使用MD5来存储密码,这是一种不安全的做法,因为攻击者可以使用预先计算好的MD5散列(称为彩虹表)或现代碰撞攻击技术来破解密码。现代的密码存储做法通常包括使用“盐”(salt)和强大的哈希算法,以增加密码的安全性。
解决撞库的方法:加盐(salt)
加盐的基本思想是在计算哈希值之前,将一个随机生成的字符串与用户密码组合在一起。这个随机字符串就是“盐”(salt),每个用户都有一个唯一的盐值。通过在密码和盐的基础上计算哈希,可以避免使用相同密码的用户在哈希值上产生相同的模式。
加盐操作是一种提高密码安全性的常见做法,可以用于任何哈希算法。无论是MD5、SHA-1、SHA-256,还是其他更安全的哈希算法,都可以通过加盐操作来增加密码的复杂性,提高安全性。
盐必须是bytes类型,这里我们随便输入一个盐b'jkklwajdkljilasd'
obj = hashlib.md5(b'jkklwajdkljilasd')
obj.update("666666".encode("utf-8"))
print(obj.hexdigest())
#运行结果
f96b5f9f131ff8f0d7277b02cd243cc5
使用密码做盐,进行md5加密
def func(salt, s):
obj = hashlib.md5(salt)
obj.update(s.encode("utf-8"))
return obj.hexdigest()
username = input("请输入你的用户名")
password = input("请输入你的密码")
mi_password = func(password.encode("utf-8"), password)
with open("user.txt", mode="w", encoding="utf-8") as f:
f.write(username)
f.write("\n")
f.write(mi_password)
#运行结果,生成user.txt文档:
admin
bc177a7a9c7df69c248647b4dfc6fd84
使用动态盐,进行hash加密
def func(salt, s):
obj = hashlib.md5(salt)
obj.update(s.encode("utf-8"))
return obj.hexdigest()
username = input("请输入你的用户名")
password = input("请输入你的密码")
mi_password = func(password.encode("utf-8"), password)
with open("user.txt", mode="w", encoding="utf-8") as f:
f.write(username)
f.write("\n")
f.write(mi_password)
# 登录验证
username = input("用户名:")
password = input("密码:")
password = func(password.encode("utf-8"), password)
with open("user.txt", mode="r", encoding="utf-8") as f:
uname = f.readline().strip()
upassword = f.readline().strip()
if username == uname and password == upassword:
print("登录成功")
else:
print("登录失败")
在实际应用中,选择适当的哈希算法取决于具体的安全需求。在密码存储等敏感场景,推荐使用较强的哈希算法,如 SHA-256。
计算文件的md5值
计算文件的md5值(用rb模式读取字节),可以选择性加盐(b"abcdefg")
obj = hashlib.md5(b"abcdefg")
with open("wf.txt", mode="rb") as f:
for line in f:
obj.update(line)
print(obj.hexdigest())
# 运行得到的结果
981efc8315eee7b0e1ba4540565daae5
计算文件的md5值,是为了判断文件的一致性——两个相同的文件的md5的值是相等的。
判断文件的MD5值的一致性有几个重要的用途:
文件完整性检查: MD5值是文件的唯一标识符,即使文件大小相同,只要文件内容有一点改变,其MD5值就会截然不同。通过比较文件的MD5值,可以检测文件是否在传输过程中发生了错误、损坏或被篡改。这在文件传输、存储和备份等场景中非常有用,确保文件在处理过程中保持完整性。
验证文件下载: 在下载文件时,用户可以通过比较下载后文件的MD5值与提供的MD5值来验证文件的完整性。这有助于确保文件在下载过程中没有被篡改(替换病毒文件、留下恶意后门)或损坏。
软件分发和更新: 在软件分发和更新的过程中,开发者通常提供文件的MD5值供用户验证。用户可以通过计算文件的MD5值并与提供的值比较,确保下载的软件包是原始、未经篡改的版本。
数据去重: 在存储大量文件的系统中,可以使用文件的MD5值来进行数据去重。相同内容的文件具有相同的MD5值,这可以帮助系统节省存储空间。
数字取证: 在数字取证和安全领域,MD5值常用于检测文件的变化,以确定是否存在潜在的安全威胁。
在我们上传文件的时候(百度网盘、QQ邮箱、QQ在线传文件),系统首先计算你要上传的这个文件的md5.拿着这个值去网盘的数据库中,搜索有没有相同的md5。如果有,就是已经上传过的(用户侧直接提示秒上传完成)。这样会大大节省网络传输压力和存盘空间压力。
Python——第五章:hashlib模块的更多相关文章
- Python第五章__模块介绍,常用内置模块
Python第五章__模块介绍,常用内置模块 欢迎加入Linux_Python学习群 群号:478616847 目录: 模块与导入介绍 包的介绍 time &datetime模块 rando ...
- 简学Python第五章__模块介绍,常用内置模块
Python第五章__模块介绍,常用内置模块 欢迎加入Linux_Python学习群 群号:478616847 目录: 模块与导入介绍 包的介绍 time &datetime模块 rando ...
- Python 入门之 内置模块 -- hashlib模块
Python 入门之 内置模块 -- hashlib模块 1.hashlib 摘要算法,加密算法 (1)主要用途: <1> 加密 : md5 sha1 sha256 sha512 md5, ...
- 小白的Python之路 day5 hashlib模块
hashlib模块 一.概述 用于加密相关的操作,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 二.算法的演 ...
- python全栈开发-hashlib模块(数据加密)、suprocess模块、xml模块
一.hashlib模块 1.什么叫hash:hash是一种算法(3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 ...
- Python操作数据库及hashlib模块
一.hashlib模块 hashlib模块,主要用于加密相关的操作,在python3的版本里,代替了md5和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA51 ...
- python第五周:模块、标准库
模块相关知识: 定义:用来从逻辑上组织python代码(变量.函数.类.逻辑:实现一个功能)本质就是以.py结尾的python文件(文件名:test.py,对应的模块名:test) 附注:包:是用来从 ...
- Python标准库之hashlib模块与hmac模块
hashlib模块用于加密相关的操作.在Python 3.x里代替了md5模块和sha模块,主要提供 SHA1.SHA224.SHA256.SHA384.SHA512 .MD5 算法.如果包含中文字符 ...
- md5模块(Python内置模块)和hashlib模块
转自https://my.oschina.net/duhaizhang/blog/67214 MD5模块用于产生消息摘要,康用来判断文件是否相同. python的md5模块使用非常简单,包括以下几个函 ...
- Python第五章实验报告
一.实验项目名称:<零基础学Python>第五章实战.实例以及两道作业题 二.实验目的和要求:了解和掌握操作字符串的方法和正则表达式的应用 三.实验环境:IDLE(Python 3.9 6 ...
随机推荐
- BY组态-低代码web可视化组件
简介 BY组态是贵州九元四方科技完全自主研发的集实时数据展示.动态交互等一体的全功能可视化平台.帮助物联网.工业互联网.电力能源.水利工程.智慧农业.智慧医疗.智慧城市等场景快速实现数字孪生.大屏可视 ...
- 怎么搭建web组态
web组态是指通过可视化拖拽组件的方式,低代码搭建监控大屏.web页面.物联网各行业的数据以及监控场景,每个行业的业务不同,需要展示的页面也不同.组态快速搭建页面的优势,能更好的满足不同定制化监控页面 ...
- 文心一言 VS 讯飞星火 VS chatgpt (101)-- 算法导论9.3 7题
七.用go语言,设计一个 O(n)时间的算法,对于一个给定的包含n个互异元素的集合 S 和一个正整数k≤n,该算法能够确定 S 中最接近中位数的k个元素. 文心一言: 要设计一个 O(n) 时间的算法 ...
- 解密Prompt系列16. LLM对齐经验之数据越少越好?LTD & LIMA & AlpaGasus
LLM Agent中间插个队,总结下指令微调.对齐数据相关的方案,已经凑够7篇论文可以召唤神龙啦!论文都是以优化指令样本为核心,Data-Centric的观点比较一致:指令微调也就是对齐阶段的数据质量 ...
- 初探富文本之React实时预览
初探富文本之React实时预览 在前文中我们探讨了很多关于富文本引擎和协同的能力,在本文中我们更偏向具体的应用组件实现.在一些场景中比如组件库的文档编写时,我们希望能够有实时预览的能力,也就是用户可以 ...
- oauth2单点登录集成
单点登陆 概念: 单点登录其实就是在多个系统之间建立链接, 打通登录系统, 让同一个账号在多个系统中通用 举个例子: 登录Gmail的时候可以用账号密码登录, 也可以用google账号登录, 而使用g ...
- 2022/7/26 暑期集训 pj组第6次%你赛
个人第3次 又是下午打,旁边那帮 不知好歹的 入门组小孩们又在吵吵... T1 老师是不是放反了? T1 是蓝题诶 理所应当地 跳过 然后就忘了写了,连样例也没打...样例可是有7分诶! 到现在也没写 ...
- P4156 [WC2016]论战捆竹竿 题解
题目链接 题意描述 给定一个字符串 \(s\),你初始拥有一个空串 \(t\),每次可以选择这个字符串的一个 Border,去掉它后接在 \(t\) 的后面,操作后 \(s\) 不变,给出一个上限 \ ...
- IDEA的Maven换源
打开IDEA安装路径,然后打开下面的文件夹 plugins\maven\lib\maven3\conf 在conf文件目录下出现一个setting.xml的文件.(ps:如果没有,请忽略本文,自行创建 ...
- 如何系统学习Python?
学习 Python 可以通过以下系统性的步骤进行: 1. 设定学习目标 确定你学习 Python 的主要目的,是为了编写脚本.数据分析.Web 开发.机器学习还是其他应用?理解这个目标可以帮助你更有针 ...