Python hashlib库解析:数据安全加密必备指南

news2025/1/16 3:33:11

更多资料获取

📚 个人网站:ipengtao.com


哈希函数在计算机科学中扮演着重要的角色。它是一种能够将任意长度的数据转换成固定长度的唯一值的算法。Python提供了hashlib库,用于生成哈希摘要,提供了常见的哈希算法,如MD5、SHA-1、SHA-256等。

哈希函数在密码学中广泛应用,可用于密码哈希化以确保安全存储密码。另外,哈希函数还常用于验证文件完整性,在下载文件后,可以使用哈希值校验文件是否被篡改。此外,哈希函数也在各种安全性需求中扮演着关键角色,为数据完整性提供保障。

hashlib库的基本用法

计算字符串的哈希值

Python中的hashlib库提供了多种哈希算法,使得可以轻松地计算字符串的哈希值。

以下是使用不同算法计算字符串哈希值的示例:

import hashlib

data = "Hello, World!"

# 计算MD5哈希值
md5_hash = hashlib.md5(data.encode()).hexdigest()

# 计算SHA-1哈希值
sha1_hash = hashlib.sha1(data.encode()).hexdigest()

# 计算SHA-256哈希值
sha256_hash = hashlib.sha256(data.encode()).hexdigest()

print("MD5 Hash:", md5_hash)
print("SHA-1 Hash:", sha1_hash)
print("SHA-256 Hash:", sha256_hash)

以上代码演示了如何使用不同的哈希算法(MD5、SHA-1、SHA-256)计算给定字符串的哈希值。encode()方法将字符串转换为字节串,hexdigest()方法返回十六进制格式的哈希值。

生成哈希摘要

哈希摘要是哈希函数对输入数据计算得到的固定长度的字符串。hashlib库提供了digest()hexdigest()方法来生成哈希摘要。

下面是一个简单的示例:

import hashlib

data = b"Hello, World!"

# 创建SHA-256哈希对象
sha256 = hashlib.sha256()
sha256.update(data)

# 生成SHA-256哈希摘要
hash_digest = sha256.digest()

print("SHA-256 Digest:", hash_digest)

在此示例中,首先创建了一个SHA-256哈希对象,使用update()方法更新哈希对象,最后使用digest()方法生成哈希摘要。

哈希函数的应用

密码存储与验证

哈希函数在密码存储中扮演着重要角色。典型的密码存储方式是将用户密码经过哈希函数处理后存储。这样可以确保即使数据库泄露,黑客也无法直接获取用户的原始密码。

import hashlib

def hash_password(password):
    # 添加盐值(salt)以增加密码安全性
    salted_password = password + "somesalt"
    hashed_password = hashlib.sha256(salted_password.encode()).hexdigest()
    return hashed_password

# 假设用户输入的密码
user_password = "mypassword123"

# 存储密码的哈希值
stored_password = hash_password(user_password)

# 验证密码
def verify_password(entered_password, stored_password):
    return stored_password == hash_password(entered_password)

# 验证密码是否匹配
print(verify_password("mypassword123", stored_password))  # 输出True

文件完整性检查

哈希函数也可用于验证文件完整性,确保文件在传输或存储过程中未被篡改。

import hashlib

def hash_file(file_path):
    sha256 = hashlib.sha256()
    with open(file_path, 'rb') as file:
        while chunk := file.read(4096):
            sha256.update(chunk)
    return sha256.hexdigest()

# 获取文件的哈希值
file_hash = hash_file('file_to_check.txt')
print("File Hash:", file_hash)

上述示例展示了如何使用哈希函数验证文件的完整性。函数hash_file计算文件的SHA-256哈希值,以便后续与预期的哈希值进行比较,从而验证文件是否被篡改。

实际应用场景

数据校验和验证

在下载文件后,常常需要验证文件的完整性以确保文件在传输过程中未被篡改。这可以通过文件的哈希值进行验证。

import hashlib

# 下载文件后计算哈希值
def calculate_file_hash(downloaded_file):
    sha256 = hashlib.sha256()
    with open(downloaded_file, 'rb') as file:
        while chunk := file.read(4096):
            sha256.update(chunk)
    return sha256.hexdigest()

# 下载文件
# ...

# 从服务器获取文件的哈希值
expected_hash = "7c112e41182cc09ed8a100dd9ed09f77bdf7246d5d69a96bfe7336cfc88e1a29"

# 对下载的文件进行哈希验证
downloaded_file = "downloaded_file.txt"
downloaded_file_hash = calculate_file_hash(downloaded_file)

if downloaded_file_hash == expected_hash:
    print("文件完整,未被篡改")
else:
    print("文件可能已被篡改")

密码存储

哈希函数在存储密码时也发挥着重要作用。一般而言,存储用户密码的最佳做法是将其哈希化并加盐处理,从而保护用户密码的安全性。

import hashlib
import secrets

def hash_password(password):
    salt = secrets.token_hex(8)
    salted_password = password + salt
    hashed_password = hashlib.sha256(salted_password.encode()).hexdigest()
    return (hashed_password, salt)

# 存储用户密码
user_password = "mysecurepassword123"
hashed_password, salt = hash_password(user_password)

# 将哈希密码和盐值存储在数据库中
# ...

# 验证用户密码
def verify_password(entered_password, stored_password, stored_salt):
    salted_password = entered_password + stored_salt
    hashed_entered_password = hashlib.sha256(salted_password.encode()).hexdigest()
    return hashed_entered_password == stored_password

# 验证密码是否匹配
print(verify_password("mysecurepassword123", hashed_password, salt))  # 输出True

上述示例演示了哈希函数在存储密码时的应用。密码首先哈希化,并与盐值一起存储在数据库中,随后验证时再次哈希用户输入的密码,并与存储的哈希密码进行比较。

最佳实践和注意事项

密码哈希化

在存储用户密码时,采用适当的盐(salt)对密码进行哈希处理是一种重要的安全实践。盐是一个随机的额外值,将其与密码结合起来进行哈希处理,增加了密码哈希值的唯一性。这样即使两个用户使用相同密码,其哈希值也不同,提高了密码的安全性。

import hashlib
import secrets

def hash_password(password):
    salt = secrets.token_hex(8)  # 生成盐值
    salted_password = password + salt
    hashed_password = hashlib.sha256(salted_password.encode()).hexdigest()
    return (hashed_password, salt)

# 存储哈希密码和盐值
user_password = "mysecurepassword123"
hashed_password, salt = hash_password(user_password)

选择合适的哈希算法

根据特定的需求选择适当的哈希算法是非常重要的。不同的哈希算法具有不同的特性,例如MD5快速但不安全,SHA-256更安全但计算开销更大。因此,根据实际情况平衡性能和安全性是非常必要的。

import hashlib

data = "Hello, World!"

# 使用不同的哈希算法
md5_hash = hashlib.md5(data.encode()).hexdigest()
sha256_hash = hashlib.sha256(data.encode()).hexdigest()

print("MD5 Hash:", md5_hash)
print("SHA-256 Hash:", sha256_hash)

在上述代码中,展示了如何使用不同的哈希算法计算数据的哈希值。根据需求选择合适的算法以满足特定的安全性和性能要求。

总结

hashlib库是Python中用于哈希函数操作的强大工具,提供了多种哈希算法的支持。本教程详细介绍了hashlib库的基本用法和实际应用场景。

通过教程,了解到哈希函数在密码存储和数据完整性验证中的重要性。在密码存储方面,哈希函数可通过加盐处理来增加安全性,确保即使用户使用相同密码,其哈希值也不同。而在验证文件完整性方面,哈希函数能够通过比较哈希值来确保文件未被篡改。最佳实践指出,密码哈希化应该结合适当的盐以提高安全性,并且需要根据特定需求选择合适的哈希算法以平衡性能和安全性。

总的来说,hashlib库为数据安全提供了强大的工具。了解哈希函数的基本原理和库的功能,有助于开发人员更好地保护数据、存储密码和验证文件的完整性。对哈希函数的理解和正确应用是保障数据安全的重要一环。


Python学习路线

在这里插入图片描述

更多资料获取

📚 个人网站:ipengtao.com

如果还想要领取更多更丰富的资料,可以点击文章下方名片,回复【优质资料】,即可获取 全方位学习资料包。

在这里插入图片描述
点击文章下方链接卡片,回复【优质资料】,可直接领取资料大礼包。

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

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

相关文章

查看mysql 或SQL server 的连接数,mysql超时、最大连接数配置

1、mysql 的连接数 1.1、最大可连接数 show variables like max_connections; 1.2、运行中连接数 show status like Threads_connected; 1.3、配置最大连接数, mysql版本不同可配置的最大连接数不同,mysql8.0的版本默认151个连接数,…

超声波清洗机器哪个品牌好用?这四款都夸的超声波清洗机

超声波清洗是一种先进的清洗技术,它利用高频振动产生微小气泡来对物体进行清洗。这些微小气泡在物体表面不断振动,使得污垢和油脂被震碎并脱落。这种方法可以有效地去除眼镜上的污垢、油脂和细菌,从而提高眼镜的清洁度。与传统的清洗方法相比…

Vue2 若依框架头像上传 全部代码

<template><div><div class"user-info-head" click"editCropper()"><img v-bind:src"options.img" title"点击上传头像"class"img-circle img-lg" /></div><el-dialog :title"title&…

不同路径(力扣LeetCode)动态规划

不同路径 题目描述 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&…

VT-MSPA1-12-1X/V0直动式比例压力阀放大器

适用于控制不带电位移反馈的比例压力阀、比例流量阀、比例方向阀的控制;差动输入;1个脉冲输出端口;函数发生器;带斜坡时间可调的斜坡生器&#xff08;可上升和下降斜坡&#xff09;; 可调电流调节器;电源带错极保护;LED 电磁铁动作显示;&#xff08;LED 的亮度与流过电磁铁的电…

Zip压缩包密码如何取消?有密码?无密码?

Zip压缩包可以进行加密&#xff0c;相信大家都很了解&#xff0c;那么zip压缩包取消密码&#xff0c;大家了解多少呢&#xff1f;有密码的情况下&#xff0c;有哪些方法可以取消密码&#xff1f;无密码又该如何取消密码&#xff1f;今天将方法总结分享给大家。 最原始的方法&a…

【100个Cocos实例】完蛋,你看我在刮刮乐中刮到了什么?

引言 什么&#xff1f;还能刮出这个&#xff1f; 相信大家对刮刮乐都不陌生&#xff0c;昨天听到小伙伴说花了20买了张刮刮乐&#xff0c;结果刮中了20&#xff0c;白忙活一场。 假如我们要在Cocos游戏开发中实现刮刮乐效果&#xff0c;应该怎么做呢&#xff1f; 本文将介绍…

Angular的Ng-Zorro组件库通知提醒框知识点

目录 系列文章目录 一、在angular中引入通知提醒框服务 二、创建通知提醒框 提示&#xff1a;在实际操作中根据id移除通知提醒框的方法尚未熟悉&#xff0c;根据此文档进行巩固 一、在angular中引入通知提醒框服务 constructor(private notifition: NzNotificationService) {}…

pip 安装软件出现 [No space left on device]

问题&#xff1a; /home文件下空间满了&#xff0c;安装软件可能会出现这个问题 解决方法&#xff1a; pip install --no-cache-dir 安装包名

跨链原子交换

原子交换的想法于 2013 年首次在 BitcoinTalk 论坛上提出&#xff0c;它可以实现两个区块链之间的代币交换。 这些交换是原子的&#xff0c;因为双方要么收到对方的硬币&#xff0c;要么都保留自己的硬币。 一方不可能欺骗另一方。 它不依赖任何可信赖的第三方&#xff0c;消除…

TOD和PPS精确时间同步技术

介绍 PPS和TOD PPS和TOD是两种用于精确时间同步的技术&#xff0c;它们在许多领域都有广泛的应用&#xff0c;总的来说&#xff0c;PPS和TOD被广泛应用于各种需要高度精确时间同步的领域&#xff0c;包括通信、测量、测试、系统集成和计算机网络等。 一、PPS PPS&#xff08…

HCIP-十二、BGP常用属性

十二、BGP常用属性 实验拓扑实验需求及解法1.IP 地址已配置&#xff0c;自行测试直连。2.AS100 中运行 OSPF3.AS200 中运行 ISIS4.运行 BGP5.发布 BGP 路由6.修改起源属性 Origin7.修改 AS-path8.修改本地优先 Local-preference9.修改 MED 实验拓扑 实验需求及解法 本实验模拟…

java编程:数组代表着苹果期货在 9 天内的价格变化,其中第 n 个元素是苹果在第 n 天的 价格,你可以进行最多三次交易,设计算法,9 天内赚到最多的钱

1 题目 编程题&#xff1a;下面的数组代表着苹果期货在 9 天内的价格变化&#xff0c;其中第 n 个元素是苹果在第 n 天的 价格&#xff0c;你可以进行最多三次交易&#xff0c;设计一个算法&#xff0c;9 天内如何赚到最多的钱&#xff1f;价格数组&#xff1a; [8, 9, 2, 5, …

SSM训练营管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 训练营管理系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系 统主要采用B/S模…

【EasyExcel实践】导出多个sheet到多个excel文件,并压缩到一个zip文件

文章目录 前言正文一、项目依赖二、封装表格实体和Sheet实体2.1 表格实体2.2 Sheet实体 三、核心实现3.1 核心实现之导出为输出流3.2 web导出3.3 导出为字节数组 四、调试4.1 构建调试用的实体类4.2 控制器调用4.3 测试结果 五、注册大数转换器&#xff0c;长度大于15时&#x…

台灯哪种灯光对眼睛好?精选高品质的护眼台灯

近几年越来越多家长开始重视孩子的视力健康问题&#xff0c;要知道如今我国儿童青少年的近视率已经达到了52.7%&#xff0c;也就是说平均每十个儿童青少年中就有五个是存在视力问题的&#xff0c;而且近视的人群是越往高年级的学生占比越多。不过目前也发现了不少低年级的孩子出…

不要被各种专业术语吓倒

有一个东西&#xff0c;是如此奇妙&#xff0c;今天我们需要讲讲。 在不同的函数中&#xff0c;这个东西有着不同的名字&#xff0c;但实际它都是同一个东西。 例如&#xff0c; RegisterWaitForSingleObject 这个 API&#xff0c;它的原型如下&#xff1a; BOOL RegisterWai…

Maven——坐标和依赖

Maven的一大功能是管理项目依赖。为了能自动化地解析任何一个Java构件&#xff0c;Maven就必须将它们唯一标识&#xff0c;这就依赖管理的底层基础——坐标。将详细分析Maven坐标的作用&#xff0c;解释其每一个元素&#xff1b;在此基础上&#xff0c;再介绍如何配置Maven&…

embeddings

“embeddings”的中文翻译是“嵌入”或“嵌入向量”。在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;通常被称为“词向量”或“词嵌入”&#xff0c;它是表示词汇或令牌的一种方式&#xff0c;通过将这些词汇或令牌映射到一个向量空间中的点&#xff0c;以捕捉它们…

HTML5语法总结大全(持续更新中~)

参考书籍&#xff1a; 《HTML与CSS3基础教程》 参考视频&#xff1a; HTML5完整教学通俗易懂 2023新版前端Web开发HTML5CSS3移动web视频教程&#xff0c;前端web入门首选黑马程序员 参考网站&#xff1a; w3school 文章目录 零.开发环境准备1.需要的工具2.Vscode所需要插件3.其…