Python 密码学库概览
设置 hazmat 和高级原语,并理解库的结构
Python 密码学库概览 是 CoddyKit 上的免费 Cryptology Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Cryptology Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Cryptology Academy 课程共包含 4 节课。
为什么使用 cryptography 库
Python 的 cryptography 库(由 PyCA 提供)同时提供高级 Fernet 接口和低级 hazmat 原语。它封装了 OpenSSL,是 Python 生产环境中加密技术的社区标准。
安装与结构
安装:pip install cryptography。分为两层:cryptography.fernet(安全且具有明确设计取向的对称加密)和 cryptography.hazmat.primitives(AES、RSA、EC、哈希、HMAC——请谨慎使用)。
Fernet:安全的对称加密
Fernet 使用带时间戳的 AES-128-CBC + HMAC-SHA256。它会自动处理 IV 生成、填充和 MAC。非常适合加密配置值、令牌或小型数据块。
from cryptography.fernet import Fernet
# Generate a URL-safe base64-encoded 32-byte key
key = Fernet.generate_key()
f = Fernet(key)
token = f.encrypt(b"my secret data")
print("Encrypted:", token[:40], "...")
plain = f.decrypt(token)
print("Decrypted:", plain)Hazmat 原语:哈希
hazmat 层提供 SHA-2、SHA-3、BLAKE2 等哈希算法:
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.backends import default_backend
digest = hashes.Hash(hashes.SHA256(), backend=default_backend())
digest.update(b"Hello, ")
digest.update(b"world!")
result = digest.finalize()
print("SHA-256:", result.hex())Hazmat 原语:HMAC
使用 HMAC 进行消息认证:
from cryptography.hazmat.primitives import hmac, hashes
import os
key = os.urandom(32)
h = hmac.HMAC(key, hashes.SHA256())
h.update(b"authenticated message")
signature = h.finalize()
print("HMAC-SHA256:", signature.hex())
# Verify
h2 = hmac.HMAC(key, hashes.SHA256())
h2.update(b"authenticated message")
h2.verify(signature) # raises if invalid密钥序列化
将密钥序列化为 PEM/DER,以便存储或传输:
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
pem = private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.PKCS8,
encryption_algorithm=serialization.BestAvailableEncryption(b"passphrase")
)
print(pem[:60])从 PEM 加载密钥
从磁盘加载 PEM 密钥:
from cryptography.hazmat.primitives.serialization import load_pem_private_key
with open("private_key.pem", "rb") as f:
pem_data = f.read()
key = load_pem_private_key(pem_data, password=b"passphrase")
print("Key loaded, size:", key.key_size, "bits")X.509 证书处理
解析并检查 TLS 证书:
from cryptography import x509
import datetime
with open("cert.pem", "rb") as f:
cert = x509.load_pem_x509_certificate(f.read())
print("Subject:", cert.subject)
print("Issuer:", cert.issuer)
print("Not valid after:", cert.not_valid_after_utc)
print("Serial:", cert.serial_number)随机字节生成
对于密码学随机数,请始终使用 os.urandom 或 secrets:
import os, secrets
# Cryptographically secure 32-byte key
key = os.urandom(32)
print("Random key:", key.hex())
# secrets module: URL-safe token
token = secrets.token_urlsafe(32)
print("URL-safe token:", token)避免 Hazmat 陷阱
hazmat API 被称为“危险材料”是有原因的。常见错误包括:重复使用随机数、使用 ECB 模式、跳过认证标签,以及使用 == 比较 MAC。请尽可能使用高级 API。
知识检查
Fernet 加密提供了哪些 raw AES-CBC 不具备的功能?
课程回顾
cryptography 库分为两层:安全的 Fernet 和灵活的 hazmat。对称加密请使用 Fernet;AES-GCM、RSA、ECDSA 和证书处理请使用 hazmat。请始终使用 os.urandom 生成密钥。避免 hazmat 陷阱——优先使用带认证的模式。
常见问题解答
「Python 密码学库概览」课时是免费的吗?
是的 — 「Python 密码学库概览」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Cryptology Academy 课程的其余内容,请升级到 CoddyKit PRO。 Cryptology Academy 课程共包含 4 节课。
「Python 密码学库概览」这节课中我会学到什么?
设置 hazmat 和高级原语,并理解库的结构 你通过在浏览器中直接运行的动手代码来练习 Cryptology Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Cryptology Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Cryptology Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「Python 密码学库概览」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Cryptology Academy 课中编写并运行代码吗?
能。每节 Cryptology Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。