Python hashlib 模块详细教程:安全哈希与数据完整性保护

512791425bdf03d27af30964d302dc55.jpeg

更多Python学习内容:ipengtao.com

大家好,我是涛哥,今天为大家分享 Python hashlib 模块详细教程,文章6500字,阅读大约17分钟,大家enjoy~~

hashlib模块为Python提供了一种简便的方式来使用各种哈希算法,如MD5、SHA-1、SHA-256等。哈希函数广泛用于密码学、数据完整性验证和安全存储等领域。

哈希算法的基础

哈希算法,又称散列函数,是一种将任意大小的数据映射为固定大小散列值的函数。其核心特性是:

  • 不可逆性(单向性): 无法通过散列值反推出原始数据。

  • 固定输出长度: 无论输入数据大小,哈希算法生成的散列值长度是固定的。

  • 碰撞概率低: 不同的输入数据生成相同散列值的概率很小。

hashlib模块的基本用法

首先,使用hashlib模块计算字符串的MD5散列值:

import hashlibdata = "Hello, hashlib!"
md5_hash = hashlib.md5(data.encode()).hexdigest()print(f"MD5 Hash: {md5_hash}")

这段代码将字符串"Hello, hashlib!"转换为MD5散列值并打印出来。可以替换字符串并尝试其他哈希算法,比如SHA-256。

文件哈希

hashlib模块不仅适用于字符串,还可以用于计算文件的哈希值。以下是一个读取文件并计算SHA-256哈希的示例:

import hashlibdef calculate_file_hash(file_path, algorithm='sha256'):hasher = hashlib.new(algorithm)with open(file_path, 'rb') as file:while chunk := file.read(8192):hasher.update(chunk)return hasher.hexdigest()file_path = 'example.txt'
file_hash = calculate_file_hash(file_path)print(f"{file_path} SHA-256 Hash: {file_hash}")

这个示例演示了如何逐块读取文件以避免一次性加载整个文件到内存中,这对于处理大文件非常有用。

消息摘要和加盐

在真实的应用中,为了增加安全性,通常会将哈希值与“盐”结合使用。盐是一个随机生成的字符串,与原始数据混合在一起进行哈希。这样做可以防止彩虹表攻击。

import hashlib
import secretsdef hash_with_salt(data, salt_length=16, algorithm='sha256'):salt = secrets.token_hex(salt_length)data_with_salt = f"{data}{salt}".encode()hasher = hashlib.new(algorithm)hasher.update(data_with_salt)return {'hash': hasher.hexdigest(),'salt': salt}user_password = 'secure_password'
hashed_data = hash_with_salt(user_password)print(f"Hashed Password: {hashed_data['hash']}")
print(f"Salt: {hashed_data['salt']}")

在这个例子中,secrets模块用于生成随机的盐,然后将密码和盐组合在一起进行哈希。

安全散列与密码存储

在真实的应用中,为了存储用户密码,通常会使用更安全的散列算法,例如bcrypt。以下是一个使用bcrypt库的示例:

import bcryptuser_password = 'secure_password'
hashed_password = bcrypt.hashpw(user_password.encode(), bcrypt.gensalt())# 在验证密码时使用 bcrypt.checkpw()
entered_password = 'secure_password'
if bcrypt.checkpw(entered_password.encode(), hashed_password):print("Password is correct!")
else:print("Incorrect password.")

bcrypt不仅使用哈希函数,还包括工作因子(work factor)等机制,以增加攻击的难度,提高安全性。

哈希算法的应用场景与示例代码

1. 数据完整性验证

哈希算法常被用于验证数据的完整性。通过对数据进行哈希运算,生成唯一的散列值(哈希值),在数据传输或存储后,可以再次计算哈希值并与原始哈希值比对,从而检测数据是否被篡改。

import hashlibdef generate_hash(data):return hashlib.sha256(data.encode()).hexdigest()# 数据传输前
original_data = "Hello, Hashing!"
original_hash = generate_hash(original_data)# 数据传输后
received_data = "Hello, Hashing!"
received_hash = generate_hash(received_data)if original_hash == received_hash:print("数据完整性验证通过")
else:print("数据可能被篡改")

2. 密码存储

在安全领域中,哈希算法广泛应用于密码存储。而不是直接存储用户的明文密码,系统会将密码经过哈希运算后存储为哈希值。这样即使数据库泄露,攻击者也难以还原出原始密码。

import hashlibdef hash_password(password, salt):hashed_password = hashlib.pbkdf2_hmac("sha256", password.encode(), salt.encode(), 100000)return hashed_password# 用户注册
user_password = "my_secure_password"
user_salt = "random_salt"
hashed_password = hash_password(user_password, user_salt)
print("哈希后的密码:", hashed_password)# 用户登录验证
input_password = "user_input_password"
if hash_password(input_password, user_salt) == hashed_password:print("密码验证通过")
else:print("密码错误")

3. 防止文件篡改

哈希算法用于生成文件的校验值,确保文件在传输或存储中未被篡改。任何文件的改动都会导致其哈希值的变化,从而提供了一种简单而有效的文件完整性验证机制。

import hashlibdef generate_file_hash(file_path):hasher = hashlib.sha256()with open(file_path, "rb") as file:while chunk := file.read(8192):hasher.update(chunk)return hasher.hexdigest()# 文件传输前
original_file_path = "example.txt"
original_file_hash = generate_file_hash(original_file_path)# 文件传输后
received_file_path = "received_example.txt"
received_file_hash = generate_file_hash(received_file_path)if original_file_hash == received_file_hash:print("文件完整性验证通过")
else:print("文件可能被篡改")

4. 数字签名

在数字签名领域,哈希算法被用于生成消息摘要。数字签名中,私钥用于对消息的哈希值进行签名,而公钥用于验证签名的合法性。这确保了消息的完整性和真实性。以下是简化的示例:

from Crypto.PublicKey import RSA
from Crypto.Signature import pkcs1_15
from Crypto.Hash import SHA256# 生成密钥对
key = RSA.generate(2048)
private_key = key.export_key()
public_key = key.publickey().export_key()# 签名
message = "Hello, Digital Signature!"
hash_value = SHA256.new(message.encode())
signer = pkcs1_15.new(RSA.import_key(private_key))
signature = signer.sign(hash_value)# 验证签名
verifier = pkcs1_15.new(RSA.import_key(public_key))
try:verifier.verify(hash_value, signature)print("数字签名验证通过")
except (ValueError, TypeError):print("数字签名验证失败")

5. 数据唯一标识

哈希算法可以用于为数据生成唯一的标识符。在分布式系统中,通过对数据的内容进行哈希运算,可以将数据分散存储在不同节点,实现数据的均衡分布。

import hashlibdef generate_unique_identifier(data):return hashlib.sha256(data.encode()).hexdigest()# 数据标识生成
data_identifier = generate_unique_identifier("Unique Data Identifier")
print("数据唯一标识:", data_identifier)

6. 散列表(Hash Table)

在计算机科学中,哈希算法被广泛应用于散列表中。通过将关键字映射到表中的位置,哈希表提供了一种高效的数据检索结构,使得在平均情况下能够以常数时间进行查找、插入和删除操作。以下是一个简单的示例:

# 创建一个散列表
hash_table = {}# 添加元素
hash_table["key1"] = "value1"
hash_table["key2"] = "value2"
hash_table["key3"] = "value3"# 查找元素
search_key = "key2"
if search_key in hash_table:print(f"{search_key} 对应的值是 {hash_table[search_key]}")
else:print(f"{search_key} 未找到")# 删除元素
delete_key = "key1"
if delete_key in hash_table:del hash_table[delete_key]print(f"{delete_key} 已删除")
else:print(f"{delete_key} 未找到")

7. 哈希链表

在编程中,哈希算法经常与链表结合,用于处理哈希冲突。通过在哈希表的每个槽中使用链表存储多个元素,解决了不同关键字映射到相同位置的问题。

class HashLinkedListNode:def __init__(self, key, value):self.key = keyself.value = valueself.next = Noneclass HashMap:def __init__(self, size):self.size = sizeself.table = [None] * sizedef _hash_function(self, key):return hash(key) % self.sizedef add_element(self, key, value):index = self._hash_function(key)if not self.table[index]:self.table[index] = HashLinkedListNode(key, value)else:current_node = self.table[index]while current_node.next:current_node = current_node.nextcurrent_node.next = HashLinkedListNode(key, value)def find_element(self, key):index = self._hash_function(key)current_node = self.table[index]while current_node:if current_node.key == key:return current_node.valuecurrent_node = current_node.nextreturn None# 使用哈希链表
hash_map = HashMap(size=10)
hash_map.add_element("key1", "value1")
hash_map.add_element("key2", "value2")
hash_map.add_element("key3", "value3")search_key = "key2"
result = hash_map.find_element(search_key)
if result:print(f"{search_key} 对应的值是 {result}")
else:print(f"{search_key} 未找到")

8.数据分片与分区

哈希算法也用于数据分片和分区。通过对数据进行哈希运算,可以将数据均匀分布到不同的分片或分区中,实现数据的分布式存储和处理。

def hash_based_sharding(data, num_shards):hash_value = hash(data)shard_index = hash_value % num_shardsreturn shard_index# 数据分片
data = "Shard me!"
num_shards = 5
shard_index = hash_based_sharding(data, num_shards)
print(f"数据 {data} 被分配到分片 {shard_index}")

总结

在本文中,深入探讨了哈希算法的基础概念、原理以及常见应用场景。哈希算法作为一种广泛应用的计算机科学技术,具有不可逆性、固定输出长度和碰撞概率低等特性,使其在数据完整性验证、密码存储和防止文件篡改等方面发挥着关键作用。介绍了常见的哈希算法,包括MD5和SHA-256,并提及了安全性考量,如对抗彩虹表攻击和哈希长度扩展攻击。

最后,强调了哈希算法的应用场景,包括数据完整性验证、密码存储和防止文件篡改等,以及在这些场景中的最佳实践。通过本文的学习,大家将更全面地了解哈希算法,为保障数据安全性提供更可靠的基础。

如果你觉得文章还不错,请大家 点赞、分享、留言 下,因为这将是我持续输出更多优质文章的最强动力!

更多Python学习内容:ipengtao.com

干货笔记整理

  100个爬虫常见问题.pdf ,太全了!

Python 自动化运维 100个常见问题.pdf

Python Web 开发常见的100个问题.pdf

124个Python案例,完整源代码!

PYTHON 3.10中文版官方文档

耗时三个月整理的《Python之路2.0.pdf》开放下载

最经典的编程教材《Think Python》开源中文版.PDF下载

27c98feb17b08c3028fb7846b4b22932.png

点击“阅读原文”,获取更多学习内容

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

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

相关文章

leetcode系列(双语)003——GO无重复字符的最长子串

文章目录 003、Longest Substring Without Repeating Characters个人解题官方解题扩展 003、Longest Substring Without Repeating Characters 无重复字符的最长子串 Given a string s, find the length of the longest substring without repeating characters. 给定一个字符…

【Linux】进程替换|exec系列函数

文章目录 一、看一看单进程版的进程替换二、进程替换的原理三、多进程版——验证各种程序替换接口exec系列函数execlexeclpexecvexecvp tipsexecleexecve 四、总结 一、看一看单进程版的进程替换 #include<stdio.h> #include<unistd.h> #include<stdlib.h>i…

电子学会C/C++编程等级考试2021年12月(一级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:输出整数部分 输入一个双精度浮点数f, 输出其整数部分。 时间限制:1000 内存限制:65536输入 一个双精度浮点数f(0 < f < 100000000)。输出 一个整数,表示浮点数的整数部分。样例输入 3.8889样例输出 3 答案: //参…

vue项目中使用vant轮播图组件(桌面端)

一. 内容简介 vue使用vant轮播图组件(桌面端) 二. 软件环境 2.1 Visual Studio Code 1.75.0 2.2 chrome浏览器 2.3 node v18.14.0 三.主要流程 3.1 安装环境 3.2 添加代码 3.3 结果展示 四.具体步骤 4.1 安装环境 先安装包 # Vue 3 项目&#xff0c;安装最新版 Va…

获取虎牙直播源

为了今天得LOL总决赛 然后想着下午看看 但是网页看占用高 就想起来有个直播源 也不复杂看了大概一个小时 没啥问题 进入虎牙页面只有 直接F12 网络 然后 看这个长条 一直在获取 发送 那就选中这个区间 找到都是数字这一条 如果直接访问的话会一直下载 我这都取消了 然后 打开…

关于新版的Maven创建Maven项目的时候只有Maven Archetype,而找不到Maven的这个问题

问题情况 : 在最近的学习过程中&#xff0c;想要创建一个Maven模块用于分块设计&#xff0c;但是在idea里面创建Maven项目的时候&#xff0c;发现与maven相关的只有Maven Archetype这个模块&#xff0c;然后找不到单纯的Maven模块&#xff1b;就像下面这样 : 解决方案 : 其…

大数据Doris(二十五):数据导入演示和其他导入案例

文章目录 数据导入演示和其他导入案例 一、数据导入演示

【每日一题】—— C. Yarik and Array(Codeforces Round 909 (Div. 3))(贪心)

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

【STM32】RTC(实时时钟)

1.RTC简介 本质&#xff1a;计数器 RTC中断是外部中断&#xff08;EXTI&#xff09; 当VDD掉电的时候&#xff0c;Vbat可以通过电源--->实时计时 STM32的RTC外设&#xff08;Real Time Clock&#xff09;&#xff0c;实质是一个 掉电 后还继续运行的定时器。从定时器的角度…

科技创新 共铸典范 | 江西卫健办邓敏、飞图影像董事长洪诗诗一行到访拓世科技集团,提振公共卫生事业发展

2023年11月15日&#xff0c;拓世科技集团总部迎来了江西省卫健项目办项目负责人邓敏、江西飞图影像科技有限公司董事长洪诗诗一行的考察参观&#xff0c;集团董事长李火亮、集团高级副总裁方高强进行热情接待。此次多方交流&#xff0c;旨在共同探讨携手合作&#xff0c;激发科…

ClickHouse建表优化

1. 数据类型 1.1 时间字段的类型 建表时能用数值型或日期时间型表示的字段就不要用字符串&#xff0c;全String类型在以Hive为中心的数仓建设中常见&#xff0c;但ClickHouse环境不应受此影响。 虽然ClickHouse底层将DateTime存储为时间戳Long类型&#xff0c;但不建议存储Long…

【Java】ArrayList和LinkedList使用不当,性能差距会如此之大!

文章目录 前言源码分析ArrayList基本属性初始化新增元素删除元素遍历元素 LinkedList实现类基本属性节点查询新增元素删除元素遍历元素 分析测试 前言 在面试的时候&#xff0c;经常会被问到几个问题&#xff1a; ArrayList和LinkedList的区别&#xff0c;相信大部分朋友都能回…

自动化网络图软件

由于 IT 系统的发展、最近向混合劳动力的转变、不断变化的客户需求以及其他原因&#xff0c;网络监控变得更加复杂。IT 管理员需要毫不费力地可视化整个网络基础设施&#xff0c;通过获得对网络的可见性&#xff0c;可以轻松发现模式、主动排除故障、确保关键设备可用性等。 为…

SEnet注意力机制(逐行代码注释讲解)

目录 ⒈结构图 ⒉机制流程讲解 ⒊源码&#xff08;pytorch框架实现&#xff09;及逐行解释 ⒋测试结果 ⒈结构图 左边是我自绘的&#xff0c;右下角是官方论文的。 ⒉机制流程讲解 通道注意力机制的思想是&#xff0c;对于输入进来的特征层&#xff0c;我们在每一个通道学…

阿里云+宝塔部署项目(Java+React)

阿里云服务器宝塔面板部署项目&#xff08;SpringBoot React&#xff09; 1. 上传所需的文件到服务器 比如jdk包和java项目的jar&#xff1a;这里以上传jar 为例&#xff0c;创建文件夹&#xff0c;上传文件&#xff1b; 在创建的文件夹下上传jar包 上传jdk 2. 配置jdk环境 3.…

OpenAI 解雇了首席执行官 Sam Altman

Sam Altman 已被 OpenAI 解雇&#xff0c;原因是担心他与董事会的沟通和透明度&#xff0c;可能会影响公司的发展。该公司首席技术官 Mira Murati 将担任临时首席执行官&#xff0c;但 OpenAI 可能会从科技行业寻找新的首席执行官来领导未来的产品开发。Altman 的解雇给 OpenAI…

实验(二):存储器实验

一、实验内容与目的 实验要求&#xff1a; 利用 CP226 实验仪上的 K16..K23 开关做为 DBUS 的数据&#xff0c;其它开关做为控制信号&#xff0c;实现主存储器 EM 的读写操作&#xff1b;利用 CP226 实验仪上的小键盘将程序输入主存储器 EM&#xff0c;实现程序的自动运行。 实…

Gem5模拟器学习之旅——翻译自官网

文章目录 安装并使用gem5 模拟器支持的操作系统和环境依赖在 Ubuntu 22.04 启动(gem5 > v21.1)Docker获取代码用 SCons 构建用法首次构建 gem5gem5 二进制类型调试opt快速 常见错误错误的 gcc 版本Python 位于非默认位置未安装 M4 宏处理器Protobuf 3.12.3 问题 安装并使用g…

如何零基础自学AI人工智能

随着人工智能&#xff08;AI&#xff09;的快速发展&#xff0c;越来越多的有志之士被其强大的潜力所吸引&#xff0c;希望投身其中。然而&#xff0c;对于许多零基础的人来说&#xff0c;如何入门AI成了一个难题。本文将为你提供一份详尽的自学AI人工智能的攻略&#xff0c;帮…

Idea 创建 Spring 项目(保姆级)

描述信息 最近卷起来&#xff0c;系统学习Spring&#xff1b;俗话说&#xff1a;万事开头难&#xff1b;创建一个Spring项目在网上找了好久没有找到好的方式&#xff1b;摸索了半天产出如下文档。 在 Idea 中新建项目 填写信息如下 生成项目目录结构 pom添加依赖 <depende…