news 2026/8/3 2:45:14

Python模块:内置模块hashlib哈希与加密入门

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python模块:内置模块hashlib哈希与加密入门

Python模块:内置模块hashlib哈希与加密入门

一、开篇:把任意数据变成固定长度的"指纹"

哈希(Hash)函数接受任意长度的数据,输出固定长度的"摘要"——就像数据的指纹。相同的输入永远产生相同的输出,但输出无法反推出输入,输入的任何微小变化都会导致输出完全不同(雪崩效应)。

⌨️ 最简单的例子:

importhashlib# 对字符串做SHA256哈希message="Hello, World!"result=hashlib.sha256(message.encode()).hexdigest()print(f"'{message}'的SHA256:")print(f"{result}")# 输出(64个十六进制字符):# dffd6021bb2bd5b0af676290809ec3a53191dd81c7f70a4b28688a362182986f# 同样的输入,永远产生同样的输出result2=hashlib.sha256(message.encode()).hexdigest()print(result==result2)# True# 输入有微小变化——输出完全不同message2="Hello, world!"# w变成小写result3=hashlib.sha256(message2.encode()).hexdigest()print(f"'{message2}'的SHA256:")print(f"{result3}")# 完全不同!

二、hashlib支持的算法

importhashlib# 查看支持的算法print("支持的算法:",hashlib.algorithms_guaranteed)# {'sha256', 'sha384', 'sha224', 'sha512', 'sha1', 'md5', 'blake2b', 'blake2s', ...}# 常用算法及输出长度algorithms={"MD5":hashlib.md5,"SHA1":hashlib.sha1,"SHA224":hashlib.sha224,"SHA256":hashlib.sha256,"SHA384":hashlib.sha384,"SHA512":hashlib.sha512,}data="Python hashlib 示例".encode()forname,funcinalgorithms.items():h=func(data)print(f"{name}:{h.digest_size}字节,{h.hexdigest()[:40]}...")# 💡 安全性排名(从低到高):# MD5(已破解,不推荐用于安全)< SHA1(已破解)< SHA256 < SHA512

三、基本使用模式

3.1 三种使用方式

importhashlib# 方式一:一次性哈希(数据量小时)result=hashlib.sha256(b"Hello").hexdigest()# 方式二:分步update()(数据量大时,如大文件)h=hashlib.sha256()h.update(b"Hello")h.update(b", ")h.update(b"World!")result=h.hexdigest()# 方式三:一行链式调用result=hashlib.sha256(b"Hello, World!").hexdigest()# 💡 update()是累加的——等价于把数据拼接后一起哈希h1=hashlib.sha256(b"Hello, World!").hexdigest()h2=hashlib.sha256()h2.update(b"Hello, ")h2.update(b"World!")print(h1==h2.hexdigest())# True# digest()返回二进制摘要,hexdigest()返回十六进制字符串h=hashlib.sha256(b"test")print(f"二进制:{h.digest()}")print(f"十六进制:{h.hexdigest()}")

3.2 大文件哈希

importhashlibdeffile_sha256(filepath,chunk_size=8192):"""计算文件的SHA256哈希值(适合任意大小文件)"""h=hashlib.sha256()try:withopen(filepath,'rb')asf:whileTrue:chunk=f.read(chunk_size)ifnotchunk:breakh.update(chunk)returnh.hexdigest()exceptFileNotFoundError:returnNone# file_hash = file_sha256("large_video.mp4")# print(f"文件哈希: {file_hash}")# 💡 逐块读取:每次只加载chunk_size字节到内存# 这样即使是几个GB的文件也不会撑爆内存

四、实际应用

4.1 密码的加盐哈希存储

importhashlibimportos# ⚠️ 永远不要明文存储密码!# ⚠️ 不要只用哈希存储密码(彩虹表攻击)!# ✅ 正确做法:加盐哈希defhash_password(password,salt=None):"""安全的密码哈希(加盐+多次迭代)"""ifsaltisNone:salt=os.urandom(32).hex()# 随机32字节盐# PBKDF2等效:多次迭代h=hashlib.sha256()h.update(salt.encode())h.update(password.encode())digest=h.hexdigest()# 简单迭代10万次(增加暴力破解成本)for_inrange(100_000):h=hashlib.sha256()h.update(digest.encode())h.update(salt.encode())digest=h.hexdigest()returnf"{salt}${digest}"# 格式:盐$哈希值defverify_password(password,stored):"""验证密码"""salt,_=stored.split("$",1)returnhash_password(password,salt)==stored# 使用hashed=hash_password("my_secret_password")print(f"存储的哈希:{hashed}")print(f"正确密码:{verify_password('my_secret_password',hashed)}")# Trueprint(f"错误密码:{verify_password('wrong_password',hashed)}")# False# 💡 生产环境建议使用专门库:# import bcrypt # pip install bcrypt# import argon2 # pip install argon2-cffi# Python 3.4+标准库有 hashlib.pbkdf2_hmac()

4.2 文件完整性校验

importhashlibdefverify_file_integrity(filepath,expected_hash,algorithm="sha256"):"""验证文件完整性——对比哈希值"""h=hashlib.new(algorithm)withopen(filepath,'rb')asf:whileTrue:chunk=f.read(8192)ifnotchunk:breakh.update(chunk)actual_hash=h.hexdigest()is_valid=actual_hash==expected_hashprint(f"文件:{filepath}")print(f"预期哈希:{expected_hash}")print(f"实际哈希:{actual_hash}")print(f"完整性:{'✓ 通过'ifis_validelse'✗ 失败'}")returnis_valid# verify_file_integrity("download.zip",# "abc123def456...", algorithm="sha256")

4.3 HMAC:带密钥的哈希

importhmacimporthashlib# HMAC(Hash-based Message Authentication Code)# 带密钥的哈希——验证数据完整性和来源secret_key=b"my_secret_api_key"message=b"important_data"# 创建HMACsignature=hmac.new(secret_key,message,hashlib.sha256).hexdigest()print(f"HMAC签名:{signature}")# 验证HMAC(使用compare_digest防止时序攻击)defverify_hmac(message,signature,secret_key):"""安全地验证HMAC签名"""expected=hmac.new(secret_key,message,hashlib.sha256).hexdigest()returnhmac.compare_digest(expected,signature)print(f"验证通过:{verify_hmac(message,signature,secret_key)}")# Trueprint(f"篡改检测:{verify_hmac(b'hacked',signature,secret_key)}")# False# 💡 HMAC的典型应用:API签名、Cookie签名、JWT

五、总结

hashlib是Python数据安全的基础工具。从简单的数据校验到密码安全存储,它都是不可或缺的。

💡核心要点:

  1. SHA256是安全场景的最低标准——MD5和SHA1已被淘汰
  2. 密码存储必须加盐——防止彩虹表、相同密码不同哈希
  3. 大文件逐块处理——用update()流式哈希
  4. 数据校验==完整性,HMAC==完整性+认证
  5. 加密用专门库——hashlib只管哈希,加密用cryptography

✅ 记住:hashlib.digest_size字节(长度),hashlib.hexdigest()输出(最常用)。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/3 2:42:11

在SenseCAP T1000-E网关部署MeshCore:构建去中心化LoRaWAN网状网络

1. 项目概述&#xff1a;为什么要在T1000-E上折腾MeshCore&#xff1f;如果你手头有一台SenseCAP T1000-E网关&#xff0c;并且正在寻找一种更灵活、更去中心化的方式来管理和扩展你的物联网设备网络&#xff0c;那么MeshCore绝对是一个值得你投入时间研究的选项。T1000-E本身是…

作者头像 李华
网站建设 2026/8/3 2:40:43

Protenix蛋白质结构预测:开源AI工具深度解析与高效部署指南

Protenix蛋白质结构预测&#xff1a;开源AI工具深度解析与高效部署指南 【免费下载链接】Protenix Toward High-Accuracy Open-Source Biomolecular Structure Prediction. 项目地址: https://gitcode.com/gh_mirrors/pr/Protenix Protenix是字节跳动开源的AlphaFold 3可…

作者头像 李华
网站建设 2026/8/3 2:34:42

Paper2Poster:5分钟AI智能海报生成,让学术展示从此高效

Paper2Poster&#xff1a;5分钟AI智能海报生成&#xff0c;让学术展示从此高效 【免费下载链接】Paper2Poster [NeurIPS 2025] Open-source Multi-agent Poster Generation from Papers 项目地址: https://gitcode.com/gh_mirrors/pa/Paper2Poster 深夜的实验室里&#…

作者头像 李华
网站建设 2026/8/3 2:30:03

Cocos Creator TypeScript编码规范:提升团队协作与代码质量

1. 项目概述&#xff1a;为什么我们需要一份专属的Cocos编码规范&#xff1f;如果你正在用Cocos Creator开发游戏&#xff0c;无论是TypeScript还是JavaScript&#xff0c;大概率都遇到过这样的场景&#xff1a;项目初期&#xff0c;代码写得飞快&#xff0c;一切看起来井井有条…

作者头像 李华
网站建设 2026/8/3 2:28:00

2026年应届生黑科技榜单9款AI论文网站横评!

前言&#xff1a;AI 写论文乱象频发&#xff0c;实测 8 款工具理清适配边界 每到毕业季&#xff0c;本科生、硕博生都会扎堆寻找 AI 论文辅助工具&#xff0c;市面上各类写作软件层出不穷&#xff0c;但普遍存在几类硬伤&#xff1a;虚假参考文献、无法匹配本校格式、不支持公式…

作者头像 李华
网站建设 2026/8/3 2:22:50

从零到一:OpenAI Codex API集成与AI代码生成实战指南

最近在尝试将AI代码生成能力集成到自己的开发工作流中&#xff0c;发现Codex是一个绕不开的强大工具。然而&#xff0c;无论是官方文档还是网络上的零散教程&#xff0c;要么过于简略&#xff0c;要么版本陈旧&#xff0c;对于想从零开始系统学习的开发者来说&#xff0c;总感觉…

作者头像 李华