资讯动态

AES 加密解密实战:基于 Fernet 的文件加密教程

发布时间:2026/10/13 9:58:19 来源:尧图企业网站定制
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 官方文档

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑