尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
AES 加密解密实战:基于 Fernet 的文件加密教程
1. 引言在数字化时代数据安全已成为开发者必须掌握的核心技能。AESAdvanced Encryption Standard高级加密标准作为全球最广泛使用的对称加密算法被广泛应用于文件加密、网络传输、数据库存储等场景。本文将基于 Python 的cryptography库中的 Fernet 模块深入讲解 AES 加密与解密的核心原理并通过完整的代码示例帮助你快速掌握文件加密的实战技巧。2. AES 加密算法核心概念2.1 什么是 AES 加密AES 是一种对称分组加密算法由美国国家标准与技术研究院NIST于 2001 年发布用于替代已不安全的 DES 算法。AES 支持 128 位、192 位和 256 位三种密钥长度其中 AES-128 在安全性与性能之间取得了最佳平衡。2.2 Fernet 与 AES 的关系Fernet 是cryptography库提供的高级加密接口它基于 AES-128-CBC 模式并额外集成了 HMAC 认证机制。这意味着 Fernet 不仅提供加密Confidentiality还提供完整性校验Integrity能够有效防止密文被篡改。2.3 对称加密的工作流程对称加密使用同一个密钥进行加密和解密其基本流程如下明文数据AES 加密密文数据网络传输或存储AES 解密还原明文密钥 Key3. 环境准备与依赖安装在开始编写代码之前需要先安装cryptography库。推荐使用 Python 3.7 及以上版本。pipinstallcryptography安装完成后可以通过以下命令验证是否安装成功python-cfrom cryptography.fernet import Fernet; print(Fernet 导入成功)4. 完整代码实现下面是一个完整的 AES 文件加密与解密工具包含密钥生成、文件加密、文件解密三个核心功能。fromcryptography.fernetimportFernet# AES-128importosimportpathlibdefgenerate_key(): 生成密钥 :return: 返回字符串形式的密钥 keyFernet.generate_key().decode()print(生成的密钥:,key)returnkeydefencrypt_file(fullPath,key): 加密文件 :param fullPath: 文件路径 :param key: 加密密钥 :return: None withopen(fullPath,rb)asf:dataf.read()encrypt_dataFernet(key).encrypt(data)withopen(str(fullPath).locked,wb)asf:f.write(encrypt_data)os.remove(fullPath)defdecrypt_file(fullPath,key): 解密文件 :param fullPath: 文件路径含 .locked 后缀 :param key: 解密密钥 :return: None withopen(fullPath,rb)asf:dataf.read()encrypt_dataFernet(key).decrypt(data)withopen(str(fullPath).replace(.locked,),wb)asf:f.write(encrypt_data)os.remove(fullPath)if__name____main__:# 使用示例keygenerate_key()encrypt_file(example.txt,key)decrypt_file(example.txt.locked,key)5. 代码逐段解析5.1 密钥生成函数generate_key()函数调用Fernet.generate_key()生成一个 URL 安全的 Base64 编码密钥。该密钥长度为 32 字节实际包含 128 位 AES 密钥和 128 位 HMAC 签名密钥。5.2 文件加密函数encrypt_file()函数以二进制模式读取原始文件使用Fernet(key).encrypt(data)对数据进行加密然后将密文写入带有.locked后缀的新文件最后删除原始文件以确保数据安全。5.3 文件解密函数decrypt_file()函数读取.locked密文文件使用Fernet(key).decrypt(data)进行解密将明文写入去除.locked后缀的文件并删除密文文件。6. 关键安全注意事项6.1 密钥管理密钥是 AES 加密体系中最核心的资产。建议将密钥存储在环境变量或专用的密钥管理服务KMS中切勿硬编码在代码里或提交到版本控制系统。6.2 加密模式选择Fernet 默认使用 AES-128-CBC 模式并自动处理填充和初始化向量IV。对于需要更高安全等级的场景可以考虑使用 AES-256-GCM 模式它同时提供加密和认证功能。6.3 文件删除的可靠性代码中使用os.remove()删除原始文件但在某些文件系统上删除操作可能只是标记为可回收。对于高安全需求场景建议使用安全删除工具覆盖文件内容后再删除。7. 性能优化与最佳实践7.1 大文件分块加密对于超大文件如视频、数据库备份一次性读取整个文件会占用大量内存。建议采用分块读取和加密的方式defencrypt_large_file(fullPath,key,chunk_size64*1024):fFernet(key)withopen(fullPath,rb)assrc,open(fullPath.locked,wb)asdst:whileTrue:chunksrc.read(chunk_size)ifnotchunk:breakdst.write(f.encrypt(chunk))7.2 多线程并行加密对于多个小文件的批量加密可以使用concurrent.futures实现多线程并行处理显著提升效率。8. 常见问题与解决方案8.1 密钥不匹配导致解密失败如果使用错误的密钥进行解密Fernet 会抛出InvalidToken异常。建议在解密前先验证密钥的正确性。8.2 文件损坏或篡改由于 Fernet 内置 HMAC 认证任何对密文的篡改都会导致解密失败这实际上是安全机制在起作用。8.3 跨平台兼容性Fernet 生成的密钥和密文格式是跨平台兼容的可以在 Windows、Linux、macOS 之间自由传输和解密。9. 总结本文详细介绍了基于 Python Fernet 模块的 AES 文件加密与解密实现涵盖了密钥生成、文件加密、文件解密、安全注意事项和性能优化等多个方面。AES 加密是保障数据安全的基础技能掌握它能够帮助你在实际项目中构建更可靠的安全体系。10. 参考资料cryptography 官方文档NIST AES 标准文档Python 官方文档
RELATED

相关推荐

Java垃圾分类系统:树形分类建模与时间窗调度实战

Java垃圾分类系统:树形分类建模与时间窗调度实战

简介:这是一套已高分通过的Java毕业设计项目源码,面向计算机专业本科生及Java初学者,聚焦城市垃圾分类回收管理场景,提供从用户注册登录、垃圾类型分类录入、回收点信息维护、预约回收申请到后台数据统计的完整业务闭环&#xff0…

📅 2026/10/13 9:58:19
Source Insight 4.0 编码、Tab与Reformat:代码整洁度工作流实战

Source Insight 4.0 编码、Tab与Reformat:代码整洁度工作流实战

1. 为什么这些"边角料"设置值得单独写一篇Source Insight 4.0 这个工具,做嵌入式、驱动、大型 C/C 项目的人基本都绕不开。它的代码跳转、关系图、上下文窗口确实好用,但真正决定你每天敲代码舒不舒服的,往往不是那些大功能&#x…

📅 2026/10/13 9:58:19
四足机器人机械结构设计实战:从自由度配置到样机装配调试

四足机器人机械结构设计实战:从自由度配置到样机装配调试

做四足机器人这几年,我最大的感受是:控制算法决定一台机器能跑多快,机械结构决定它敢不敢跑快。很多人一上来就盯着运动控制和步态规划,结果算法调得再好,腿一落地机身就晃、关节就热、螺丝就松,最后只能把…

📅 2026/10/13 9:53:16
MORE NEWS

更多资讯

📰

中柏EZpad 7S/HB10驱动包安装与避坑指南

简介:这份驱动包面向中柏EZpad 7S与HB10平板电脑用户,尤其是需要重装系统或修复硬件异常的个人与教育场景使用者。资源针对Windows 10/11平台整理,重点解决触摸屏失灵、声卡无声、显卡与网络设备无法识别等常见兼容性问题,让设备恢…

📰

OPC客户端C#完整源码实战:从连接失败到稳定自愈的工程化拆解

简介:这份资源是一套用C#编写的OPC客户端完整源码,面向工业自动化方向的.NET开发者、工控软件学习者以及需要对接OPC服务器的工程师,帮助理解如何在C#环境中实现与OPC服务器的数据通信。压缩包共3个文件,以xml配置文件和rels关系文…

📰

基于哈希表的轻量级键值数据库:持久化与并发设计实践

1. 项目概述与核心动机马上要进入正题之前,我先聊聊为什么会做“基于哈希表结构的轻量级数据库”这个项目。如果你翻过一些开源代码,会发现市面上的轻量级存储方案其实不少——有纯文件存储的,有基于B树实现索引的,也有直接把整个…

📰

DETR端到端目标检测:论文笔记与源码逐行拆解

1. 从“论文笔记源码”这个组合说起:为什么DETR值得逐行拆第一次看到“论文笔记源码”这种组合,我下意识会把它归类成两种东西之一:要么是学生交作业式的论文摘要,要么是跑通官方脚本后截几张图就完事的“复现记录”。但DETR这个题…

📰

SpringBoot+Vue+MySQL物流管理系统毕设全解析:从数据库设计到部署

“【毕业设计】SpringBootVueMySQL 物流信息管理系统平台源码数据库论文部署文档”——这个标题我在各种资源站、毕设辅导群、高校论坛里见过不下几百次,但说实话,真正把系统本地跑起来、把论文逻辑讲清楚、把源码改出自己风格的人,可能不到三…

📰

考研择校与夏令营:信息战如何决定你的上岸概率

1. 为什么择校是考研路上第一个分水岭每年三四月份,总有一批学弟学妹来问我同一个问题:“学长,我想考某所学校的某个专业,你觉得我行不行?”说实话,这个问题我没法直接回答,因为“行不行”取决于…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬