当前位置: 首页>后端>正文

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 hashlib

sha256 = 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

🌟常用的哈希算法

🌟hashlib校验文件一致性

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/5/8
# @Author  : Summer
# @File    : 
# @describe:
"""
import hashlib


def 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库对密码进行哈希处理(带盐)

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

#!/usr/bin/env python
# coding=utf-8
"""
# @Time    : 2024/5/8
# @Author  : Summer
# @File    : 
# @describe:
"""
import hashlib
import os


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


def 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等更安全的算法所替代。
哈希算法是单向不可逆的,从原理上讲,不可能从哈希值直接反向算出原始数据。
哈希算法的设计原则之一是“抗碰撞”,理想情况下,任意两个不同的输入数据产生相同的输出(哈希值冲突)的概率极低。


https://www.xamrdz.com/backend/3jy1948233.html

相关文章: