Python密码学指南 | AI生成和翻译

Home 2025.05

密码学包简介

cryptography 是一个流行的 Python 库,提供密码学原语和安全协议实现方案。该库注重易用性和安全性,实现了 AES、RSA 等标准。它并非用于直接实现 SSH 或 TLS 等高级协议——请将其作为基础构建模块使用。务必确保及时更新以获取安全补丁。

安装

通过 pip 安装:

pip install cryptography

如需更好性能(特别是处理大密钥或频繁操作),可安装 OpenSSL 支持:

pip install cryptography[openssl]

注意:在某些系统上可能需要单独安装 OpenSSL 头文件(例如 Ubuntu 系统使用 apt install libssl-dev)。

基本概念

导入库:

from cryptography.fernet import Fernet
from cryptography.hazmat.primitives import serialization, hashes, asyncioc as a
from cryptography.hazmat.primitives.asymmetric import rsa, padding

示例

1. 使用 Fernet 进行对称加密(最适合初学者)

Fernet 采用 AES-128 CBC 模式配合 HMAC 确保完整性,非常适合加密存储数据。

from cryptography.fernet import Fernet

# 生成密钥(请安全存储,如环境变量)
key = Fernet.generate_key()
cipher = Fernet(key)

# 加密
plaintext = b"这是秘密信息"
token = cipher.encrypt(plaintext)
print("加密结果:", token)

# 解密
decrypted = cipher.decrypt(token)
print("解密结果:", decrypted)

2. 使用 RSA 进行非对称加密

生成公私钥对,加密数据后仅私钥持有者可解密。

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

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

# 序列化存储
pem_private = private_key.private_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PrivateFormat.PKCS8,
    encryption_algorithm=serialization.NoEncryption()  # 密码保护请使用 BestAvailableEncryption()
)

# 获取并序列化公钥
public_key = private_key.public_key()
pem_public = public_key.public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo
)

# 使用公钥加密
plaintext = b"秘密信息"
ciphertext = public_key.encrypt(
    plaintext,
    padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None)
)

# 使用私钥解密
decrypted = private_key.decrypt(
    ciphertext,
    padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None)
)
print("解密结果:", decrypted)

3. 生成和使用哈希

用于完整性校验或密码哈希。

from cryptography.hazmat.primitives import hashes

# 哈希计算
digest = hashes.Hash(hashes.SHA256())
digest.update(b"待处理数据")
hash_result = digest.finalize()
print("SHA256 哈希:", hash_result.hex())

密码处理请使用 cryptography.hazmat.primitives.kdf.pbkdf2 进行密钥派生(例如使用 PBKDF2 进行加盐慢哈希)。

4. 使用 RSA 进行数字签名

对数据签名以验证真实性。

# 使用前述 RSA 密钥
message = b"待签名数据"
signature = private_key.sign(
    message,
    padding.PSS(mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH),
    hashes.SHA256()
)

# 使用公钥验证
try:
    public_key.verify(
        signature,
        message,
        padding.PSS(mgf=padding.MGF1(hashes.SHA256()), salt_length=padding.PSS.MAX_LENGTH),
        hashes.SHA256()
    )
    print("签名有效")
except Exception:
    print("签名无效")

最佳实践

扩展阅读

如有具体使用场景(如文件加密或 API 安全),提供详细信息可获取针对性示例。


Back

x-ai/grok-code-fast-1

Donate