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

news2024/9/27 23:25:03

512791425bdf03d27af30964d302dc55.jpeg

更多Python学习内容:ipengtao.com

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

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

哈希算法的基础

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

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

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

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

hashlib模块的基本用法

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

import hashlib

data = "Hello, hashlib!"
md5_hash = hashlib.md5(data.encode()).hexdigest()

print(f"MD5 Hash: {md5_hash}")

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

文件哈希

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

import hashlib

def 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 secrets

def 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 bcrypt

user_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 hashlib

def 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 hashlib

def 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 hashlib

def 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 hashlib

def 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 = key
        self.value = value
        self.next = None

class HashMap:
    def __init__(self, size):
        self.size = size
        self.table = [None] * size

    def _hash_function(self, key):
        return hash(key) % self.size

    def 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.next
            current_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.value
            current_node = current_node.next
        return 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_shards
    return 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.coloradmin.cn/o/1223184.html

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

相关文章

ACM练习——第五天

还有两天就要比赛了&#xff0c;进入正题吧 题目一&#xff1a;小红的签到题 小红的签到题 (nowcoder.com) 这道题也就是热身水平&#xff0c;机会很清楚的发现只需要c/a就可以得出答案了 参考代码&#xff1a; #include <iostream>using namespace std;int main(){int a…

SecureCRT的“New line mode“

New line mode选中与不选中啥区别 在SecureCRT中&#xff0c;"New line mode"是一个关键配置项&#xff0c;主要用于解决不同操作系统之间的换行问题。当不选中"New line mode"时&#xff0c;SecureCRT会将接收到的数据按照原样发送&#xff0c;不会对数据…

腾讯智影数字人工具

腾讯智影数字人工具 腾讯智影数字人的形象风格多样&#xff0c;包括写实、卡通等&#xff0c;可以满足不同年龄层观众的喜好。同时&#xff0c;腾讯智影数字人也提供了灵活的驱动方案&#xff0c;可以通过文本或配音直接生成视频&#xff0c;并支持数字人做出与视频一样的动作…

计算机网络——WLAN简解

1. WLAN的发展历程 ❓ WLAN和WIFI有什么区别。 &#x1f604; 具体来说&#xff0c;WALN是抽象的概念&#xff0c;代表这无线局域网这一类技术&#xff0c;而WIFI则是具体的具体技术标准&#xff0c;虽然在生活中&#xff0c;二者的表现是强相关的&#xff08;因为是使用的wifi…

talbay---贝叶斯网络分析工具产品介绍

一 简介 talbay是拥有独立知识产权的国产软件&#xff0c;主要功能是贝叶斯网络建模、决策网络建模、概率计算、决策支持、敏感性分析、网络模型验证、机器学习等。talbay以用户为中心&#xff0c;简单易用, 计算准确高效&#xff0c;分析全面多样&#xff0c;在应用成熟理论及…

基础模型的自然语言处理能力综述

NLP作为一个领域为基础模型开辟了道路。虽然这些模型在标准基准测试中占据主导地位&#xff0c;但这些模型目前获得的能力与那些将语言描述为人类交流和思维的复杂系统的能力之间存在明显的差距。针对这一点&#xff0c;我们强调语言变异的全部范围&#xff08;例如&#xff0c…

西南科技大学814考研一

C语言基础 字节大小 char&#xff1a;1 字节 unsigned char&#xff1a;1 字节 short&#xff1a;2 字节 unsigned short&#xff1a;2 字节 int&#xff1a;通常为 4 字节&#xff08;32 位平台&#xff09;或 8 字节&#xff08;64 位平台&#xff09; unsigned int&#x…

汽车音响静音检测电路芯片D3703F,适用于汽车音响系统,采用封装形式SOP8

D3703F是-块汽车音响静音检测电路。用于音响系统检测在放音或快进/退时进行静音检测。D3703F的电压范围: 6V~16V&#xff0c; 信号检测和静音时间可通过外围电阻、电容来改变。 主要特点&#xff1a; ● 快进退时也可进行静音检测 ● 信号检测和静音时间可通过外围元件值来改…

机器学习笔记 - 使用 PyTorch 的多任务学习和 HydraNet

一、HydraNet简述 特斯拉使用了一个模型可以解决他们正在处理的每一项可能的任务。 例如:物体检测、道路曲线估计、深度估计、3D重建、视频分析、物体追踪、ETC等等。 以下是在 NVIDIA GPU 上以 3 种不同配置运行的 2 个计算机视觉模型的基准测试。 在第一个配置中,我…

贝叶斯AB测试

AB测试是用来评估变更效果的有效方法&#xff0c;但很多时候会运行大量AB测试&#xff0c;如果能够在测试中复用之前测试的结果&#xff0c;将有效提升AB测试的效率和有效性。原文: Bayesian AB Testing[1] 随机实验&#xff0c;又称AB测试&#xff0c;是行业中评估因果效应的既…

iframe父子页面通信相互调用传递参数多个postMessage

效果 如何运行 父页面代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>…

再也不用担心忘记密码了!如何在Windows 10或11中重置被遗忘的密码

​如果你忘记了Windows电脑的密码,不要惊慌。Windows 10和Windows 11都允许你重置忘记的密码,无论你使用的是Microsoft帐户还是本地帐户。你所要做的就是回答你的安全问题以重置密码。另一种选择是创建一个密码重置盘,你可以在任何U盘上进行。 除了使用密码之外,你还应该启…

CCF ChinaSoft 2023 论坛巡礼|软件测试产教研融合论坛

2023年CCF中国软件大会&#xff08;CCF ChinaSoft 2023&#xff09;由CCF主办&#xff0c;CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办&#xff0c;将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

基于DOTween插件实现金币飞行到指定位置功能

文章目录 前言一、DOTween是什么&#xff1f;二、使用步骤1.导入DOTween插件在Unity官方插件商店找到DOTween插件导入DOTween插件启用DOTween插件 2.代码逻辑金币飞行代码控制飞行效果代码 3.物体配置1.物体上装配CoinEffect脚本2.在金币预制体上装配FlyControl脚本 三、效果展…

Pytorch torch.normal()的用法

该函数原型如下&#xff1a; normal(mean, std, *, generatorNone, outNone) 该函数返回从单独的正态分布中提取的随机数的张量&#xff0c;该正态分布的均值是mean&#xff0c;标准差是std。 用法如下&#xff1a;我们从一个标准正态分布N&#xff5e;(0,1)&#xff0c;提取…

YOLOv8-Seg改进:渐近特征金字塔网络(AFPN)

🚀🚀🚀本文改进:AFPN通过融合两个相邻的Low-Level特征来启动的,并渐进地将High-Level特征纳入融合过程,提升分割能力。 🚀🚀🚀AFPN小目标分割首选,暴力涨点 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻…

QTableWidget——表格的合并与拆分

一、整体思路 表格的操作使用QTableView::setSpan可以实现表格的行和列的合并 表格拆分没有对应的处理函数 主要思路&#xff1a;对表格的属性、内容、拆分与合并的参数进行存储&#xff0c;在进行拆分时对表格内容进行重新创建&#xff08;不考虑效率问题&#xff09; 二、效…

电脑技巧:低配置的旧电脑也可以使用Win11系统了

目录 一、优点和适用场景 二、下载以及版本说明 三、安装说明 四、Tiny11 设置安装简体中文语言方法 Windows 11&#xff0c;作为微软最新一代操作系统&#xff0c;固然有其强大的功能和卓越的性能&#xff0c;但有时&#xff0c;更轻、更小、更快速的需求也在用户的考虑范…

企业视频数字人有哪些应用场景

来做个数字人吧&#xff0c;帮我干点活吧。 国内的一些数字人&#xff1a; 腾讯智影 腾讯智影数字人是一种基于人工智能技术的数字人物形象&#xff0c;具有逼真的外观、语音和行为表现&#xff0c;可以应用于各种场景&#xff0c;如新闻播报、文娱推介、营销、教育等。 幻…

链路追踪,助您洞悉数据联动分析的奥秘

前言 在当今复杂的分布式系统中&#xff0c;了解请求在不同服务之间的传递路径和性能情况对于系统的性能优化至关重要。链路追踪通过记录和分析请求在系统中的传递路径和性能数据&#xff0c;为实现数据联动分析提供了重要的支持。我们曾谈论观测云提供火焰图能够实现链路追踪…