Python进阶之-hashlib详解

✨前言:

🌟什么是hash?

在计算机科学中,“哈希” (Hash) 是一种算法,它接受输入(或者“消息”),并返回一个固定长度的字符串,这个字符串称为输入的 “哈希值” 或者 “消息摘要” (Message Digest)。哈希函数的设计目的是尽可能快地将任意长度的数据转换为固定长度的输出结果,通常输出的哈希值远小于输入数据。

🌟哈希有以下几个重要特性:

高效: 对任何长度的数据计算哈希值都应该是快速的。
确定性: 相同的输入必须产生相同的哈希值。
不可逆: 在计算上应该不可行从哈希值得知原始输入(单向性)。
抗碰撞: 找到两个不同的输入但产生相同哈希值(称为碰撞)的难度应该非常高。

🌟哈希的应用场景:

数据完整性验证:检查文件或数据在传输过程中是否未被篡改。
密码存储:安全地存储用户密码的哈希值,而非明文密码。
查找和索引:哈希表数据结构使用哈希函数快速检索数据。
加密和安全:数字签名和验证消息的完整性依赖于哈希算法。
分布式系统:例如一致性哈希在处理分布式缓存和负载均衡时非常有用。

🌟hashlib基本用法

⭐️计算字符串的MD5值
import hashlib# 创建md5对象
m = hashlib.md5()# 更新哈希对象以字符串参数
m.update(b"hello, world!")# 获取16进制格式的摘要
print(m.hexdigest()) # b10a8db164e0754105b7a99be72e3fe5
⭐️计算文件的SHA-256值

为了计算大文件的哈希值,建议以块的形式读取文件内容,逐步更新哈希对象。

import hashlibsha256 = hashlib.sha256()with open("example.txt", "rb") as f:# 一次读取并处理1024字节for chunk in iter(lambda: f.read(1024), b""):sha256.update(chunk)print(sha256.hexdigest())  # 88573b5d4539c29ee60b1acfab2928ca5231c4448b6e8c3fca773e52794ab1e9

🌟常用的哈希算法

MD5: 生成128比特(16字节)的哈希值,使用hashlib.md5()。 SHA-1:
生成160比特(20字节)的哈希值,使用hashlib.sha1()。 SHA-256:
生成256比特(32字节)的哈希值,属于SHA-2家族的一种,使用hashlib.sha256()。 SHA-512:
生成512比特(64字节)的哈希值,使用hashlib.sha512()。

🌟hashlib校验文件一致性

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/5/8
# @Author  : Summer
# @File    : 
# @describe:
"""
import hashlibdef calculate_hash(file_path, algorithm=hashlib.sha256):"""计算文件的哈希值。:param file_path: 文件路径字符串。:param algorithm: 要使用的哈希算法,默认为sha256。:return: 文件内容的哈希值的十六进制字符串。"""hash_obj = algorithm()with open(file_path, 'rb') as file:while chunk := file.read(4096):  # 以4096字节为单位读取文件hash_obj.update(chunk)return hash_obj.hexdigest()def check_file_consistency(file1_path, file2_path, algorithm=hashlib.sha256):"""检查两个文件是否一致。:param file1_path: 第一个文件的路径。:param file2_path: 第二个文件的路径。:param algorithm: 要使用的哈希算法,默认为sha256。:return: 如果两个文件一致返回True,否则返回False。"""file1_hash = calculate_hash(file1_path, algorithm)file2_hash = calculate_hash(file2_path, algorithm)# 如果哈希值相同,那么文件就一致return file1_hash == file2_hash# 示例:检查两个文件是否一致
file1 = "D:\\PycharmProjects\\debug_test\\file1.txt"
file2 = "D:\\PycharmProjects\\debug_test\\file2.txt"if check_file_consistency(file1, file2):print("两个文件一致。")
else:print("两个文件不一致。")

在这个示例中,我们定义了两个函数:calculate_hash和check_file_consistency。calculate_hash函数用于计算指定文件的哈希值。而check_file_consistency函数则用来比较两个文件的哈希值,从而检查它们是否一致。
注意,在calculate_hash函数中使用了带赋值表达式的while循环(:=,也称为海象操作符),这需要Python 3.8及以上版本支持。
此外,你可以通过更改algorithm参数来使用不同的哈希算法,例如hashlib.md5、hashlib.sha1等,来适应不同的需要和安全性要求。然而,值得注意的是,MD5和SHA-1已经被证明不够安全,推荐使用SHA-256或SHA-3系列算法。

🌟使用hashlib和os库对密码进行哈希处理(带盐)

使用哈希保护密码的步骤:

选择一个强哈希函数:现代应用通常使用如SHA-256或更安全的哈希算法。
添加盐值(Salt):盐值是一个随机值,为了防止相同的密码产生相同的哈希值,我们在密码哈希过程中添加这么一个值。每个用户的盐值应该是唯一的并且保密的。
可选 - 使用密钥扩展函数:如PBKDF2、bcrypt或argon2等,这些算法在哈希密码时会使得攻击者尝试破解密码的代价大大提高。

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/5/8
# @Author  : Summer
# @File    : 
# @describe:
"""
import hashlib
import osdef hash_password(password, salt=None):if salt is None:# 生成随机盐。这里使用16字节的随机盐。salt = os.urandom(16)# 将密码和盐拼接并进行哈希处理pwd_hash = hashlib.pbkdf2_hmac('sha256', password.encode('utf-8'), salt, 100000)# 返回盐和哈希值。注意这里的盐和哈希值都需要存储在数据库中。return salt, pwd_hashdef verify_password(stored_salt, stored_hash, user_password):# 使用存储的盐和输入的密码生成哈希值salt, new_hash = hash_password(user_password, stored_salt)# 比较新的哈希值和存储的哈希值return new_hash == stored_hash# 示例:哈希密码和验证密码例子
password = "my_super_secure_password"
salt, pwd_hash = hash_password(password)print("盐:", salt)
print("哈希值:", pwd_hash)# 验证密码
assert verify_password(salt, pwd_hash, password)

这个示例演示了如何使用hashlib和os库来生成一个带盐的密码哈希,以及如何验证一个密码是否与其哈希值匹配。在实际应用中,你应该保存盐和密码的哈希值到数据库,以便将来验证用户密码。
请注意,尽管这个例子使用的是Python自带库,实际上在生产环境中,你可能会想要使用专门为密码存储设计的库,如bcrypt,因为这些库提供了更好的安全性特性(如自动处理盐和更强的哈希算法)。

🌟 HMAC的加密方式

HMAC(Keyed-Hash Message Authentication Code,带密钥的哈希消息认证码)是一种基于密钥的哈希算法消息认证码。在Python中,hmac模块提供了一种方法,可以基于任何提供给其的哈希算法(如MD5、SHA-1、SHA-256等)来创建HMAC。HMAC可以用于确保信息的完整性和验证消息的发送者身份。
HMAC的工作原理是结合一个密钥和一个消息,使用哈希函数产生一个摘要。因为HMAC同时依赖于密钥和消息内容,所以即使两个不同的消息具有相同的哈希值,只要它们使用的密钥不同,它们的HMAC也将是不同的。

⭐️HMAC的加密方式

HMAC加密实际上不是“加密”处理,而是一种基于哈希的消息认证码。它不涉及传统的加密和解密过程,而是以保证消息完整性和验证身份为目的。

⭐️使用HMAC进行消息验证的过程包括以下几个步骤:

发送方使用密钥和原始消息生成HMAC,并将原始消息和HMAC一起发送给接收方。
接收方使用同样的密钥和收到的原始消息重新计算HMAC。
接收方比较自己计算出的HMAC与发送方提供的HMAC。如果两者相同,则消息被认为是完整且未被篡改的,并且确实是由持有密钥的发送方发送的。
以下是使用Python的hmac模块进行HMAC生成和验证的示例:

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/5/8
# @Author  : Summer
# @File    : 
# @describe:
"""
import hmac
import hashlib# 密钥(在实际应用中,密钥应该是保密的)
key = b"secret_key"# 待认证的消息
message = b"Hello, HMAC!"# 使用HMAC和SHA-256创建一个新的消息摘要对象
h = hmac.new(key, message, hashlib.sha256)# 获取HMAC摘要
hm = h.hexdigest()print("HMAC摘要:", hm)# 假设这是接收方计算的HMAC进行验证
h2 = hmac.new(key, message, hashlib.sha256)
hm2 = h2.hexdigest()# 比较HMAC以验证消息
if hmac.compare_digest(hm, hm2):print("消息验证成功,完整且未被篡改。")
else:print("消息验证失败。")

⚠️注意事项

MD5和SHA-1由于碰撞攻击的可能性,它们在需要高安全性的场合已逐渐被SHA-2和SHA-3等更安全的算法所替代。
哈希算法是单向不可逆的,从原理上讲,不可能从哈希值直接反向算出原始数据。
哈希算法的设计原则之一是“抗碰撞”,理想情况下,任意两个不同的输入数据产生相同的输出(哈希值冲突)的概率极低。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/8429.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET MVC 4升级迁移到ASP.NET MVC 5

背景:今天针对一个老项目进行框架升级,老项目使用的是MVC 4,现在要升级到MVC5。 备份项目.NET升级4.5以上版本通过Nuget,更新或者直接安装包 包名oldVersionnewVersionMicrosoft.AspNet.Mvc4.0.05.x.xMicrosoft.AspNet.Razor2.0…

树莓派4b测量PM2.5

1.GP2Y1010AU0F粉尘传感器连接图 2. GP2Y1010AU0F工作原理 工作原理 传感器中心有个洞可以让空气自由流过,定向发射LED光,通过检测经过空气中灰尘折射过后的光线来判断灰尘的含量。 3.源代码 main.py # coding=UTF-8 import RPi.GPIO as GPIO from ADC import ADS1015…

上传文件客户端签名直传

上传文件的客户端签名直传是一种常用的将文件直接上传到云存储服务如Amazon S3、阿里云OSS等云服务上的技术手段。这种方法通常用于减轻服务器负担,并提高上传效率。 以下是实现客户端签名直传的基本步骤: 1. 客户端请求上传权限 客户端(如…

如何让路由器分配固定网段ip

一.wan和lan wan广域网,负责连接互联网 lan局域网,负责保证一个区域内的设备可以互相通讯,比如wife就是让所有连接设备处于同一网段下 一.问题导入 1.我们平时在虚拟机和实体机通信时 必须让它们位于同一ip网段下。 通过winscp等软件进行…

链表的原理和实现python

为什么需要链表 数组的底层原理是顺序存储,是一块连续的内存空间,有了这块内存空间的首地址,就能直接通过索引计算出任意位置的元素地址。 链表不一样,一条链表并不需要一整块连续的内存空间存储元素。链表的元素可以分散在内存…

加速数据要素流通,“隐语杯”全国高校隐私计算大赛正式启动报名!

当前,我国数字经济正处在一个快速增长的阶段,数据要素逐渐成为促进社会经济繁荣的关键驱动力。随着国家对数据治理及隐私保护政策的不断完善,隐私计算技术的创新和实践应用变得愈发重要。面对数据安全与隐私保护的双重挑战,如何实…

高性价比开放式耳机有哪些?五大好评热卖开放式耳机推荐

近年来,开放式耳机凭借其独特的开放式声学设计,给用户带来了动态空间的音质享受。在佩戴等方面也带来了一定的舒适度。然而,面对满目的耳机品牌,新手小白往往会不知道如何挑选。那如何选择一款适合自己的产品呢?我整理…

了解如何有效地利用 Swagger UI

在讨论程序员职业生涯中的一些琐碎但必须的任务时,众所周知,编写和维护文档是他们最不喜欢的活动之一。程序员普遍不愿意编写注释和文档,同时又对那些没有留下适当文档的同事感到失望。这种矛盾主要是因为文档管理是一个繁琐的过程&#xff0…

Yolov8-pose关键点检测:卷积魔改 | 变形条状卷积,魔改DCNv3二次创新

💡💡💡本文独家改进: 变形条状卷积,DCNv3改进版本,小幅涨点的前提下相比较DCNv3大幅度运算速度 💡💡💡强烈推荐:先到先得,paper级创新,直接使用; 💡💡💡创新点:1)去掉DCNv3中的Mask;2)空间域上的双线性插值转改为轴上的线性插值; 💡💡💡如…

计算机专业全解析:热门方向与就业前景

在每年的高考填报中,计算机专业总是出现在填报热门专业榜单之中,可见计算机类专业的热门程度。 然而,随着时代和教育的发展,计算机大类下细分出越来越多的专业,除了核心的计算机科学与技术、软件工程外,还…

计算机毕业设计 | springboot+vue凌云在线阅读平台 线上读书系统(附源码)

1,绪论 随着社会和网络技术的发展,网络小说成为人们茶钱饭后的休闲方式,但是现在很多网络小说的网站都是收费的,高额的收费制度是很多人接受不了的,另外就是很多小说网站都会有大量的弹窗和广告,这极大的影…

代码随想录第四十七天|打家劫舍、打家劫舍Ⅱ、打家劫舍Ⅲ

题目链接:. - 力扣(LeetCode) 代码如下: 打家劫舍问题需要注意相邻房子不能偷,因此在偷与不偷的选择上可以归类为: 偷当前(i)的房子,则子问题变为前i-2个房子的偷取金额…

探秘编程之旅:Baidu Comate 智能代码助手的魔法揭秘

目录 Baidu Comate智能代码助手1.场景需求2.安装步骤3.功能介绍3.1 /指令3.2 插件3.3 #知识 4.使用体验5.总结 Baidu Comate智能代码助手 智能编程助手的意义在于提升编程体验和效率,使开发人员能够更轻松、更快速地完成编码任务,是如今人工智能技术的一…

【cpp题解】最大子数组和(53)

目录 前言我的思路思路一思路二 我的代码 前言 今天继续来学一学动态规划,一上来就遇到了网红题,据说是以前清北的考研题哈哈哈哈。挺难的,让我做的话,那就是双层循环暴力解,思路很巧妙,学到啦~ 我的思路…

yaml配置文件的在深度学习中的简单应用

1 .创作灵感 小伙伴们再阅读深度学习模型的代码的时候,经常会遇到yaml格式的配置文件。用这个配置文件是因为我们在训练模型的时候会涉及很多的参数,如果这些参数东一个,西一个,我们调起来的时候就会很不方便,所以用y…

数字电商人才孵化基地授牌仪式在天府锋巢直播产业基地隆重举行!

2024年4月25日,数字电商人才孵化基地授牌仪式在天府锋巢直播产业基地隆重举行。此次仪式不仅标志着德商锋巢与天府新区信息技术职业学院的紧密合作正式启动,更意味着双方在数字电商领域的人才培养和产业发展上迈出了坚实的步伐。 仪式现场,德…

WiFine通信与Wi-sun通信对比

调制速率 WiFine通信:(G)FSK 50Kbps~500Kbps ;LoRa 5Kbps~37.5Kbps Wi-Sun通信:(G)FSK 50Kbps~300Kbps ;QPSK/OFDM 计划中… 2、协议简介 WiFine通信:为低成本、低功耗、移动设备倾力打造 的轻量级、分布式无线移动…

初始C++(二)

前言: C相对于C语言还有很多区别,接下来我们继续介绍 函数重载: 很好理解,就是Java中的函数重载。C加了函数的修饰,通过函数修饰规则去找。C语言是直接通过函数名查找,C是通过修饰后的函数名去查找。 引用…

Java 运行的底层原理

Java是一种跨平台的编程语言,其底层原理涉及到了多个方面,包括Java虚拟机(JVM)、字节码、类加载机制、垃圾回收器等。让我们逐一深入了解Java运行的底层原理。 1. Java虚拟机(JVM) Java虚拟机是Java程序运…

pandas高级操作--复杂查询

pandas高级操作 一、复杂查询1.1 逻辑筛选数据1.2 函数筛选1.3 isin()函数1.4 查询df.query()1.5 df.filter()对行名和列名进行筛选 一、复杂查询 1.1 逻辑筛选数据 以下是切片([])的一些逻辑筛选示例: df[df[Q1] 8] # Q1等于8 df[~(d…