# Cryptography .Fernet模块--python加解密详解
Cryptography .Fernet模块介绍
前言
cryptography
是一个用于加密、解密和签名等操作的 Python 库。它的设计目标是为开发者提供易用且安全的加密工具。cryptography
库分为 **高级 API (Fernet)**和 低级 API(hazmat)。
Fernet
:提供一种简化的加密机制,适用于需要高安全性和简易实现的对称加密场景。hazmat(hazardous materials)
:为有经验的开发者提供更底层的加密原语,允许开发者手动配置和定制加密操作。
Fernet API介绍
Fernet
是 cryptography
库提供的一种高层加密工具,它为对称加密提供了简单且安全的解决方案。Fernet 提供了一种方式,可以保证数据的机密性和完整性。它使用 AES 算法加密,结合了 HMAC 来验证消息的完整性。
特点:
- 简单易用:只需生成密钥并使用它来加密或解密数据。
- 自动管理密钥和数据完整性:Fernet 自动为每条消息附加 HMAC,用于验证消息是否被篡改。
- 使用 AES 算法:Fernet 默认使用 AES-128-CBC(不是256位),同时结合 HMAC(SHA256)保证消息的完整性。
相关属性方法:
- 构造方法
Fernet()
:Fernet类
是该模块的核心,提供加密和解密的功能。
from cryptograhpy.fernet import Fernet
class Fernet:def __init__(self,key: Bytes) -> None:"""创建一个新的 Fernet 对象,传入密钥。:param key: 32字节的 Base64 编码密钥"""self.key = key
if __name == '__main__':fernet = Fernet(key)
Fernet.generate_key()
- 生成一个随机
32bytes
的Base64 编码秘钥
- 生成一个随机
from cryptograhpy.fernet import Fernet"""生成一个随机 32 bytes Base64编码的秘钥"""key = Fernet.generate_key()print(key)
Fernet().key
- 返回
Fernet
对象使用的秘钥。
- 返回
Fernet().is_valid_key(key)
- 验证给定秘钥是否有效
Fernet().decrypt(ciphertext: bytes)
- 使用生成的加解密实例对
ciphertext
进行解密(必须要是ciphertext),解密返回的也是plaintext数据,需要使用decode将bytes进行字符编码转换为字符串。
- 使用生成的加解密实例对
from cryptography.fernet import Fernet"""对加密的数据(ciphertext)进行解密(plaintext)"""plaintext = Fernet.decrypt(ciphertext)
Fernet().encrypt(plaintext)
- 使用生成的加解密实例对
plaintext
进行加密,返回ciphertext1
数据。 - 加密数据必须是
bytes
流,
- 使用生成的加解密实例对
解密流程:
- 生成密钥
使用 Fernet.generate_key()
生成一个 对称密钥。
- 生成随机 IV
Fernet
会自动生成一个 随机的初始化向量(IV),这是 AES-CBC 模式所需的。
- 加密数据
使用 AES-CBC 加密模式加密数据。Fernet
会:
用生成的 IV 对数据进行加密。
使用 HMAC 对密文进行完整性校验,确保数据未被篡改。
- 生成密文
将 IV、加密数据 和 HMAC 合并,最终形成密文。
将密文以 Base64 编码格式返回。
简单总结:
生成密钥 → 生成 IV → AES 加密 → HMAC 验证 → 合并为密文
密文包括 IV、加密数据、HMAC,最后以 Base64 编码格式输出。
from cryptography.fernet import Fernet# 1. 生成密钥
key = Fernet.generate_key()
cipher_suite = Fernet(key)# 2. 明文数据
message = b"这是一个秘密消息"# 3. 加密数据
encrypted_message = cipher_suite.encrypt(message)# 4. 输出加密后的密文
print(f"加密后的消息:{encrypted_message}")
Fernet 的解密流程如下:
- 获取密文和密钥
从存储或传输中获取密文和密钥。密文包括加密数据、IV 和 HMAC。
- 解析密文
Fernet
会自动解析密文,提取出:
IV:初始化向量。
加密数据:使用 AES-CBC 加密的密文部分。
HMAC:用来验证数据完整性。
- 解密数据
使用 Fernet
提供的密钥:
验证 HMAC:确保密文没有被篡改。
使用 IV 和密钥 进行 AES 解密操作。
- 输出解密结果
返回原始的明文数据。
简单总结:
获取密文 → 解析密文,提取 IV 和加密数据 → 使用密钥、IV 和 HMAC 验证解密数据 → 返回原始的明文数据
from cryptography.fernet import Fernet# 从安全地方获取密钥
key = b'你的密钥'
cipher_suite = Fernet(key)# 获取密文
encrypted_message = b"从文件或其他地方获取密文"# 解密数据
decrypted_message = cipher_suite.decrypt(encrypted_message)# 输出解密后的消息
print(f"解密后的消息:{decrypted_message.decode()}")
注:
Fernet
加密的数据只能使用Fernet
解密。由于Fernet
内部处理了 IV、填充和 HMAC,它的加密格式是专门为Fernet
解密器设计的,因此其他加密库(如AES
、Cipher
等)无法解密Fernet
加密的数据。
总结:
- 密钥管理:密钥要安全存储,避免暴露。
- 加解密一致性:加密和解密必须使用相同的密钥。
- IV 自动管理:不用手动管理 IV,
Fernet
会自动处理。 - 错误处理:捕获并处理加解密异常。
- 存储和传输:密文采用 Base64 编码存储,密钥与密文分开传输。