Python文件加密解密:保护数据安全的实用指南

Python文件加密解密:保护数据安全的实用指南

在数字化时代,数据安全至关重要。无论是个人隐私还是商业机密,对文件进行加密解密是防止未授权访问的有效手段。Python作为一门功能丰富的编程语言,提供了多种库来轻松实现文件加密。本文将带你逐步了解如何使用Python加密和解密文件,涵盖对称加密和非对称加密两种主流方法。

1. 对称加密:快速且高效

对称加密使用相同的密钥进行加密和解密。Python中常用的库是cryptography,它提供了简洁的API。以下是使用AES(高级加密标准)在CBC模式下加密文件的示例。

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
import os

# 生成随机密钥和初始化向量
key = os.urandom(32)  # AES-256
iv = os.urandom(16)

# 加密函数
def encrypt_file(input_path, output_path, key, iv):
    cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())
    encryptor = cipher.encryptor()

    # 填充函数,因为AES需要块大小对齐
    def pad(s):
        return s + (16 - len(s) % 16) * chr(16 - len(s) % 16)

    with open(input_path, 'rb') as f_in:
        plaintext = f_in.read()
    ct = encryptor.update(pad(plaintext).encode()) + encryptor.finalize()

    with open(output_path, 'wb') as f_out:
        # 存储iv和密文
        f_out.write(iv + ct)

# 解密函数
def decrypt_file(input_path, output_path, key):
    with open(input_path, 'rb') as f_in:
        data = f_in.read()
    iv = data[:16]
    ct = data[16:]

    cipher = Cipher(algorithms.AES(key), modes.CBC(iv), backend=default_backend())
    decryptor = cipher.decryptor()
    plaintext = decryptor.update(ct) + decryptor.finalize()

    # 去除填充
    pad_len = plaintext[-1]
    plaintext = plaintext[:-pad_len]

    with open(output_path, 'wb') as f_out:
        f_out.write(plaintext)

使用时,只需调用上述函数并传入文件路径。

2. 非对称加密:安全的密钥分发

非对称加密使用公钥加密,私钥解密,适合在不安全通道上交换密钥。RSA是常见的算法。以下示例使用cryptography库生成RSA密钥对并加密文件(注意:RSA不适合加密大文件,通常用于加密对称密钥,此处演示小文件加密)。

from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import serialization, hashes

# 生成私钥
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
    backend=default_backend()
)
public_key = private_key.public_key()

# 保存公钥和私钥(略)

# 加密函数(仅适用于小数据)
def rsa_encrypt_file(input_path, output_path, public_key):
    with open(input_path, 'rb') as f:
        plaintext = f.read()
    ciphertext = public_key.encrypt(
        plaintext,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    with open(output_path, 'wb') as f:
        f.write(ciphertext)

# 解密函数
def rsa_decrypt_file(input_path, output_path, private_key):
    with open(input_path, 'rb') as f:
        ciphertext = f.read()
    plaintext = private_key.decrypt(
        ciphertext,
        padding.OAEP(
            mgf=padding.MGF1(algorithm=hashes.SHA256()),
            algorithm=hashes.SHA256(),
            label=None
        )
    )
    with open(output_path, 'wb') as f:
        f.write(plaintext)

3. 最佳实践

  • 密钥管理:密钥务必安全存储,可以使用密钥管理服务或环境变量。
  • 大文件处理:对于大文件,对称加密更高效,且应分块加密以防止内存溢出。
  • 完整性验证:考虑添加HMAC或数字签名来检测篡改。

总结

Python为文件加密解密提供了强大的工具。通过本文的示例,你可以轻松实现文件保护。根据场景选择合适的加密方式:对称加密适用于大部分情况,非对称加密用于密钥交换。务必注意密钥的安全,否则加密形同虚设。