Python文件加密案例:如何安全加密本地文件(实战指南)
目录导读
-
为什么需要加密本地文件?

-
Python加密工具库选择与安装
-
- 基础案例:使用
cryptography库加密文件
- 基础案例:使用
-
进阶案例:基于密码的对称加密(AES)
-
实战:加密/解密整个文件夹
-
常见问题与问答(Q&A)
-
安全建议与最佳实践
为什么需要加密本地文件?
在数字化时代,本地文件可能包含敏感信息(如密码、合同、个人照片),如果笔记本丢失、硬盘被盗或共享设备被人访问,未加密的文件将直接暴露,加密将文件内容变为乱码,只有持有正确密钥的人才能还原,Python提供了便捷的加密库,让开发者可以快速实现文件保护。
核心需求: 文件加密 ≠ 复杂,使用Python,你可以在5分钟内写一个加密脚本。
Python加密工具库选择与安装
目前最主流的加密库包括:
- cryptography:现代、安全、官方推荐(支持AES、RSA等)
- PyCryptodome:功能全面,适合高级操作
- simple-crypt:极简封装,适合新手
推荐: PyCryptodome 或 cryptography。
安装命令:
pip install cryptography pip install pycryptodome
基础案例:使用cryptography库加密单个文件
目标: 加密一个文本文件secret.txt,生成加密文件secret.enc。
from cryptography.fernet import Fernet
# 生成密钥并保存(务必保存密钥,否则文件无法解密!)
key = Fernet.generate_key()
with open('secret.key', 'wb') as key_file:
key_file.write(key)
# 加密文件
fernet = Fernet(key)
with open('secret.txt', 'rb') as file:
original = file.read()
encrypted = fernet.encrypt(original)
with open('secret.enc', 'wb') as encrypted_file:
encrypted_file.write(encrypted)
print("文件已加密为 secret.enc")
解密脚本:
from cryptography.fernet import Fernet
with open('secret.key', 'rb') as key_file:
key = key_file.read()
fernet = Fernet(key)
with open('secret.enc', 'rb') as encrypted_file:
encrypted = encrypted_file.read()
decrypted = fernet.decrypt(encrypted)
with open('secret_decrypted.txt', 'wb') as decrypted_file:
decrypted_file.write(decrypted)
print("文件已解密为 secret_decrypted.txt")
注意: 该方案使用对称加密(同一密钥加密/解密),安全性高,但密钥文件必须妥善保管。
进阶案例:基于密码的对称加密(AES)
使用密码(如mypassword123)代替随机密钥文件,更贴合实际场景。
from Crypto.Cipher import AES
from Crypto.Protocol.KDF import scrypt
import os
# 用户输入的密码
password = b"mypassword123"
salt = os.urandom(16) # 随机盐值,防止彩虹表攻击
# 从密码派生密钥(使用scrypt增强安全性)
key = scrypt(password, salt, key_len=32, N=2**14, r=8, p=1)
# 加密过程
cipher = AES.new(key, AES.MODE_EAX)
nonce = cipher.nonce # 随机一次性数
with open('secret.txt', 'rb') as f:
plaintext = f.read()
ciphertext, tag = cipher.encrypt_and_digest(plaintext)
# 保存加密文件(含nonce和salt)
with open('secret.enc', 'wb') as f:
f.write(salt + nonce + tag + ciphertext)
print("加密完成!使用密码:mypassword123")
解密时需读取salt+nonce+tag并还原密钥,安全性更高。
实战:加密/解密整个文件夹
以下脚本递归加密指定文件夹下的所有文件(排除.py和.key本身)。
import os
from cryptography.fernet import Fernet
def encrypt_folder(folder_path, key):
fernet = Fernet(key)
for root, dirs, files in os.walk(folder_path):
for filename in files:
if filename.endswith(('.py', '.key')):
continue
file_path = os.path.join(root, filename)
with open(file_path, 'rb') as f:
data = f.read()
encrypted = fernet.encrypt(data)
# 覆盖原文件(注意:危险操作,建议备份)
with open(file_path, 'wb') as f:
f.write(encrypted)
print(f"文件夹 {folder_path} 已加密完成")
# 使用
key = Fernet.generate_key()
encrypt_folder('/path/to/your/folder', key)
安全提示: 覆盖原文件有风险,建议先备份到新路径。
常见问题与问答(Q&A)
Q1:加密后的文件还能用原文件名打开吗?
A:不能,加密文件是二进制乱码,必须解密后才能使用原程序打开。
Q2:如果忘记密钥或密码怎么办?
A:无法恢复,除非暴力破解(几乎不可能),否则文件永久丢失,请务必备份密钥或使用密码管理器。
Q3:加密大型文件(如视频)会不会很慢?
A:会,AES-256加密1GB文件约需数秒(视CPU而定),建议对大文件分块加密,或仅加密文件头。
Q4:加密文件后,如何安全传输密钥?
A:使用非对称加密(如RSA)加密密钥,或通过物理介质(U盘)传输。永远不要将密钥与加密文件放在同一位置。
Q5:这些Python加密方法安全吗?
A:cryptography库使用行业标准(AES-256-CBC + HMAC),被全球安全专家信任,只要密钥管理得当,安全等级极高。
安全建议与最佳实践
- 密钥管理 > 加密算法:选用强随机密钥,存储在离线设备或密码管理器中。
- 使用盐值(salt):防止相同密码产生相同密文(见第4节)。
- 定期轮换密钥:避免长期使用同一密钥。
- 加密前清理内存:对于敏感数据,使用
bytearray并del后覆写。 - 避免硬编码密码:通过环境变量或配置文件读取密码(非Git提交)。
- 测试环境:先在测试文件上运行脚本,确认解密无误后再处理重要文件。
通过本文,你掌握了Python加密本地文件的三种方法:快速文件加密(Fernet)、密码增强型加密(AES+scrypt)和全文件夹加密,无论你是保护个人隐私还是企业数据,选择适合场景的方案并牢记密钥管理,就能用Python构建一道坚固的安全防线。
下一步行动: 现在就打开终端,安装cryptography库,加密你最重要的一个文件试试吧!