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

更多资料获取

📚 个人网站: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.mfbz.cn/a/199760.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Prometheus的详细部署

普罗米修斯下载网址: Download | Prometheus 准备两台机器: 192.168.58.152 prometheus 192.168.58.142 node_exporter 关闭防火墙和selinux: [rootlocalhost ~]# setenforce 0 && systemctl stop firewalld[rootlocalhost ~]# seten…

Ubuntu:安装Powershell

Powershell的安装与使用: 1)安装Powershell:在终端依次运行以下命令即可: $ sudo apt-get update $ sudo apt-get install -y wget apt-transport-https software-properties-common $ wget -q "https://packages.microsof…

基于ArcGIS Pro、R、INVEST等多技术融合下生态系统服务权衡与协同动态分析实践应用

生态系统服务是指生态系统所形成的用于维持人类赖以生存和发展的自然环境条件与效用,是人类直接或间接从生态系统中得到的各种惠益。联合国千年生态系统评估(Millennium ecosystem assessment,MA)提出生态系统服务包括供给、调节、…

【Vue】绝了!还有不懂生命周期的?

生命周期 Vue.js 组件生命周期: 生命周期函数(钩子)就是给我们提供了一些特定的时刻,让我们可以在这个周期段内加入自己的代码,做一些需要的事情; 生命周期钩子中的this指向是VM 或 组件实例对象 在JS 中,…

分层理解Java字符串常量池

Java是一门计算机编程语言,但我们脑海中所理解的Java不仅仅是一门语言。它还包括Java虚拟机(JVM)的一系列规定,及具体Java产品(如Hotspot)的实现原理。 不管我们日常在Java中用到的任何一种语法&#xff0…

Ubuntu Linux玩童年小霸王插卡游戏

1.下载安装模拟器 在Windows平台模拟器非常多,而且效果也很优秀,Linux平台的用户常常很羡慕,却因为系统的缘故,无法使用这样的模拟器,但是随着时代的发展,Linux平台也出现了许多优秀的模拟器,现…

选择更灵活的设计工具:SOLIDWORKS 软件网络版与单机版的比较

随着科技的飞速发展,工程设计领域对于高效、灵活的设计工具需求日益增加。SOLIDWORKS 作为一款广受欢迎的三维设计软件,提供了网络版和单机版两种选择。在本文中,我们将深入探讨这两个版本的区别,并为您详细介绍它们的价格差异。 …

基于单片机的烟雾检测报警装置(论文+源码)

1.系统设计 (1)利用传感器实现环境中温度、烟雾浓度的实时检测; (2)系统检测的各项数据信息通过液晶模块进行显示,提高设计可视化; (3)系统可以根据实际情况利用按键模…

20天GMV超过百万美金!桌下迷你跑步机在TikTok Shop美国站热销

上周总GMV达到1.59亿美元,达到历史新高,是美国站自开通以来首次单周出单达到亿级;日均出单1660万美元,单日出单最高达2820万美元; 截至11月19日,GMV Top 5 的商品分类排名依次为:美妆个护、女士…

《深入理解计算机系统》学习笔记 - 第三课 - 位,字节和整型

Lecture 03 Bits,Bytes, and Integer count 位,字节,整型 文章目录 Lecture 03 Bits,Bytes, and Integer count 位,字节,整型运算:加,减,乘,除加法乘法取值范围乘法结果 使用无符号注…

交流负载的功能实现原理

交流负载的功能实现原理主要涉及到电力电子技术、电机控制技术和电力系统保护技术等多个方面。 交流负载的功能实现需要通过电力电子器件进行电能的转换和控制,电力电子器件主要包括开关器件和电力电子变压器等。开关器件主要用于实现电能的通断控制,如晶…

消息队列进阶-1.消息队列的应用场景与选型

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码、Kafka原理🔥如果感觉博主的文章还不错的话,请&#x1f44…

vue el-table表格中每行上传文件(上传简历)操作

1、HTML中 <el-table :data"formInfo.userListDto" border stripe max-height"400"><el-table-column type"index" label"序号" width"50"> </el-table-column><el-table-column prop"realName&q…

【Udemy】AWS CLF - 01 题库 (英文版 + 中文版)目录

【挑战业余一周拿证】CSDN官方课程目录 【挑战业余一周拿证】AWS 认证云从业者 薅200美金羊毛 一、介绍 文章记录题库&#xff08;包含答案解释中文翻译&#xff09; 共计23章&#xff0c;每天更新 2-10 章习题&#xff0c;需要的客观请点赞收藏 来源Udemy&#xff0c;刷题…

Docker容器常用命令

文章目录 启动类命令帮助类命令镜像命令列出本地主机上的镜像在远程仓库中搜索镜像下载镜像保存镜像加载 tar 包为镜像查看占据的空间删除镜像 虚悬镜像命令自动补全新建启动容器启动交互式容器启动守护式容器 列出正在运行的容器容器其他启停操作启动已经停止的容器重启容器停…

【jupyter notebook中插件 nbextensions 安装失败分析与解决方法】

文章目录 问题描述分析与解决总结 问题描述 一开始在安装 notebook 中的插件 nbextensions 时根本没有注意到版本的适配问题&#xff0c;都是进行默认的安装&#xff0c;结果安装是最新版本的 notebook7.x&#xff0c;恰好 notebook7.x 版本不再适应插件 nbextensions&#xf…

智能优化算法应用:基于头脑风暴算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于头脑风暴算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于头脑风暴算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.头脑风暴算法4.实验参数设定5.算法结果6.参考…

大数据平台/大数据技术与原理-实验报告--部署ZooKeeper集群和实战ZooKeeper

实验名称 部署ZooKeeper集群和实战ZooKeeper 实验性质 &#xff08;必修、选修&#xff09; 必修 实验类型&#xff08;验证、设计、创新、综合&#xff09; 综合 实验课时 2 实验日期 2023.11.04-2023.11.05 实验仪器设备以及实验软硬件要求 专业实验室&#xff08…

leetcode:用栈实现队列(先进先出)

题目描述 题目链接&#xff1a;232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 题目分析 我们先把之前写的数组栈的实现代码搬过来 用栈实现队列最主要的是实现队列先进先出的特点&#xff0c;而栈的特点是后进先出&#xff0c;那么我们可以用两个栈来实现&…

flask 上传文件

from flask import Flask, request, render_template,redirect, url_for from werkzeug.utils import secure_filename import os from flask import send_from_directory # send_from_directory可以从目录加载文件app Flask(__name__)#UPLOAD_FOLDER media # 注意&#xff…
最新文章