`Python`的`加密`:`cryptography`库的`高级`用法。

Python cryptography 库高级用法讲座

大家好,今天我们来深入探讨 Python 的 cryptography 库的高级用法。cryptography 是一个强大且灵活的加密库,它提供了多种加密算法和安全协议的实现,可以用于保护数据的机密性、完整性和真实性。我们今天的内容将涵盖以下几个方面:

  1. 密钥派生函数 (KDFs):PBKDF2HMAC, Scrypt, Argon2
  2. 对称加密的高级模式:AEAD模式 (GCM, ChaCha20Poly1305)
  3. 非对称加密的深入应用:RSA, ECC
  4. 数字签名与证书管理:签名算法,证书的创建与验证
  5. 高级 API 使用技巧: Fernet, Secret 框架
  6. 一些最佳实践与安全建议

让我们开始吧。

1. 密钥派生函数 (KDFs)

密钥派生函数 (Key Derivation Functions, KDFs) 的作用是从一个主密钥(通常是用户提供的密码)派生出一个或多个加密密钥。相比直接使用密码作为密钥,KDFs 可以增加密钥的安全性,防止彩虹表攻击等。cryptography 库提供了多种 KDFs 的实现。

1.1 PBKDF2HMAC

PBKDF2 (Password-Based Key Derivation Function 2) 是最常用的 KDF 之一。它使用 HMAC (Hash-based Message Authentication Code) 算法进行迭代计算。

from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
from cryptography.hazmat.backends import default_backend
import os

# 1. 准备参数
password = b"my_secret_password"  # 用户提供的密码
salt = os.urandom(16)  # 随机盐值,每个密码都需要一个唯一的盐值
iterations = 100000  # 迭代次数,越大越安全,但计算时间越长

# 2. 创建 PBKDF2HMAC 对象
kdf = PBKDF2HMAC(
    algorithm=hashes.SHA256(),
    length=32,  # 密钥长度,例如 32 字节 (256 位)
    salt=salt,
    iterations=iterations,
    backend=default_backend()
)

# 3. 派生密钥
key = kdf.derive(password)

# 4. 验证密钥 (可选,但强烈建议)
# 存储 salt 和 iterations,以便以后验证密码
# 存储 derived_key,用于后续加密解密操作

# 验证密码的例子:
try:
    kdf.verify(password, key)
    print("密码验证成功!")
except Exception as e:
    print("密码验证失败:", e)

# 打印密钥、盐和迭代次数(请勿在生产环境中直接打印密钥!)
print(f"派生的密钥: {key.hex()}")
print(f"盐: {salt.hex()}")
print(f"迭代次数: {iterations}")
  • password: 用户提供的密码,必须是 bytes 类型。
  • salt: 随机盐值,每个密码都需要一个唯一的盐值。使用 os.urandom(16) 生成 16 字节的随机盐。
  • iterations: 迭代次数,越大越安全,但计算时间越长。建议至少设置为 100000。
  • length: 密钥长度,例如 32 字节 (256 位)。
  • algorithm: 使用的哈希算法,例如 hashes.SHA256()

1.2 Scrypt

Scrypt 是一种内存密集型的 KDF,它可以有效地抵抗硬件加速的攻击。

from cryptography.hazmat.primitives.kdf.scrypt import Scrypt
from cryptography.hazmat.backends import default_backend
import os

# 1. 准备参数
password = b"my_secret_password"
salt = os.urandom(16)

# Scrypt 特有的参数
n = 2**14  # CPU/内存成本参数,越大越安全,但计算时间越长
r = 8  # 块大小参数
p = 1  # 并行参数

# 2. 创建 Scrypt 对象
kdf = Scrypt(
    salt=salt,
    length=32,
    n=n,
    r=r,
    p=p,
    backend=default_backend()
)

# 3. 派生密钥
key = kdf.derive(password)

# 4. 验证密钥 (可选,但强烈建议)
# 存储 salt, n, r, p,以便以后验证密码

# 验证密码的例子:
try:
    kdf.verify(password, key)
    print("密码验证成功!")
except Exception as e:
    print("密码验证失败:", e)

# 打印密钥、盐和 Scrypt 参数(请勿在生产环境中直接打印密钥!)
print(f"派生的密钥: {key.hex()}")
print(f"盐: {salt.hex()}")
print(f"Scrypt 参数: n={n}, r={r}, p={p}")
  • n: CPU/内存成本参数,越大越安全,但计算时间越长。
  • r: 块大小参数。
  • p: 并行参数。

1.3 Argon2

Argon2 是一种现代的 KDF,它在 Scrypt 的基础上进行了改进,提供了更好的安全性和灵活性。cryptography 库提供了 Argon2id 和 Argon2i 两种变体。Argon2id 是推荐的通用选择。

from cryptography.hazmat.primitives.kdf.argon2 import Argon2id
from cryptography.hazmat.backends import default_backend
import os

# 1. 准备参数
password = b"my_secret_password"
salt = os.urandom(16)

# Argon2 特有的参数
t = 2  # 迭代次数
m = 2**16  # 内存大小 (KB)
p = 1  # 并行度

# 2. 创建 Argon2id 对象
kdf = Argon2id(
    salt=salt,
    length=32,
    time_cost=t,
    memory_cost=m,
    parallelism=p,
    backend=default_backend()
)

# 3. 派生密钥
key = kdf.derive(password)

# 4. 验证密钥 (可选,但强烈建议)
# 存储 salt, t, m, p,以便以后验证密码

# 验证密码的例子:
try:
    kdf.verify(password, key)
    print("密码验证成功!")
except Exception as e:
    print("密码验证失败:", e)

# 打印密钥、盐和 Argon2 参数(请勿在生产环境中直接打印密钥!)
print(f"派生的密钥: {key.hex()}")
print(f"盐: {salt.hex()}")
print(f"Argon2 参数: t={t}, m={m}, p={p}")
  • time_cost: 迭代次数,越大越安全,但计算时间越长。
  • memory_cost: 内存大小 (KB),越大越安全,但需要更多内存。
  • parallelism: 并行度。

KDF 选择建议:

KDF 优点 缺点 推荐使用场景
PBKDF2HMAC 广泛支持,简单易用 安全性相对较低 (相对于 Scrypt 和 Argon2) 对安全性要求不高的场景,或者需要兼容旧系统的场景
Scrypt 内存密集型,可以抵抗硬件加速攻击 计算速度较慢 对安全性要求较高,但对计算速度要求不高的场景
Argon2id 安全性高,灵活性好,推荐的通用选择 实现相对复杂 对安全性要求高,且需要灵活调整参数的场景

重要提示:

  • 始终使用随机盐值,并且每个密码都应该有唯一的盐值。
  • 选择合适的迭代次数 (或 time_cost, memory_cost),以平衡安全性和计算时间。
  • 安全地存储盐值和 KDF 参数,以便以后验证密码。
  • 不要在生产环境中直接打印密钥

2. 对称加密的高级模式:AEAD 模式

Authenticated Encryption with Associated Data (AEAD) 是一种对称加密模式,它不仅提供机密性,还提供完整性和认证。这意味着 AEAD 模式可以检测到数据是否被篡改,并验证数据的来源。cryptography 库提供了两种常用的 AEAD 模式:GCM 和 ChaCha20Poly1305。

2.1 GCM (Galois/Counter Mode)

GCM 是一种广泛使用的 AEAD 模式,它基于 AES (Advanced Encryption Standard) 加密算法。

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

# 1. 准备参数
key = os.urandom(32)  # 32 字节 (256 位) 的 AES 密钥
iv = os.urandom(12)  # 12 字节的初始化向量 (IV)
associated_data = b"authenticated but not encrypted payload"  # 关联数据
plaintext = b"this is my secret message"

# 2. 创建 Cipher 对象
cipher = Cipher(algorithms.AES(key), modes.GCM(iv), backend=default_backend())

# 3. 创建 encryptor 对象
encryptor = cipher.encryptor()

# 4. 添加关联数据 (可选)
encryptor.authenticate_additional_data(associated_data)

# 5. 加密数据
ciphertext = encryptor.update(plaintext) + encryptor.finalize()

# 6. 获取认证标签
tag = encryptor.tag

# 打印密文、标签和初始化向量(请勿在生产环境中直接打印密钥!)
print(f"密文: {ciphertext.hex()}")
print(f"标签: {tag.hex()}")
print(f"初始化向量: {iv.hex()}")
print(f"关联数据:{associated_data.decode()}")

# 解密过程
# 1. 创建 Cipher 对象 (与加密时相同)
cipher = Cipher(algorithms.AES(key), modes.GCM(iv, tag), backend=default_backend())

# 2. 创建 decryptor 对象
decryptor = cipher.decryptor()

# 3. 添加关联数据 (与加密时相同)
decryptor.authenticate_additional_data(associated_data)

# 4. 解密数据
try:
    plaintext = decryptor.update(ciphertext) + decryptor.finalize()
    print("解密成功:", plaintext.decode())
except Exception as e:
    print("解密失败:", e)
  • key: 32 字节 (256 位) 的 AES 密钥。
  • iv: 12 字节的初始化向量 (IV),必须是随机且唯一的。
  • associated_data: 关联数据,它会被认证,但不会被加密。这可以用于存储一些元数据,例如文件类型或版本号。
  • tag: 认证标签,用于验证数据的完整性和真实性。

2.2 ChaCha20Poly1305

ChaCha20Poly1305 是一种流密码 AEAD 模式,它比 AES-GCM 更快,并且在某些硬件平台上可能更安全。

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

# 1. 准备参数
key = os.urandom(32)  # 32 字节 (256 位) 的 ChaCha20 密钥
nonce = os.urandom(12)  # 12 字节的 nonce (与 IV 类似,但不能重复使用)
associated_data = b"authenticated but not encrypted payload"
plaintext = b"this is my secret message"

# 2. 创建 Cipher 对象
cipher = Cipher(algorithms.ChaCha20(key, nonce), modes.Poly1305(), backend=default_backend())

# 3. 创建 encryptor 对象
encryptor = cipher.encryptor()

# 4. 添加关联数据 (可选)
encryptor.authenticate_additional_data(associated_data)

# 5. 加密数据
ciphertext = encryptor.update(plaintext) + encryptor.finalize()

# 6. 获取认证标签
tag = encryptor.tag

# 打印密文、标签和 nonce(请勿在生产环境中直接打印密钥!)
print(f"密文: {ciphertext.hex()}")
print(f"标签: {tag.hex()}")
print(f"Nonce: {nonce.hex()}")
print(f"关联数据:{associated_data.decode()}")

# 解密过程
# 1. 创建 Cipher 对象 (与加密时相同)
cipher = Cipher(algorithms.ChaCha20(key, nonce), modes.Poly1305(tag), backend=default_backend())

# 2. 创建 decryptor 对象
decryptor = cipher.decryptor()

# 3. 添加关联数据 (与加密时相同)
decryptor.authenticate_additional_data(associated_data)

# 4. 解密数据
try:
    plaintext = decryptor.update(ciphertext) + decryptor.finalize()
    print("解密成功:", plaintext.decode())
except Exception as e:
    print("解密失败:", e)
  • key: 32 字节 (256 位) 的 ChaCha20 密钥。
  • nonce: 12 字节的 nonce (与 IV 类似,但不能重复使用)。每个 nonce 只能用于加密一个消息。
  • associated_data: 关联数据,与 GCM 相同。
  • tag: 认证标签,与 GCM 相同。

AEAD 模式选择建议:

AEAD 模式 优点 缺点 推荐使用场景
AES-GCM 广泛支持,硬件加速支持良好 对于短消息,可能不如 ChaCha20Poly1305 效率高 大部分场景,特别是需要硬件加速支持的场景
ChaCha20Poly1305 速度快,在某些硬件平台上可能更安全,适合短消息加密 支持不如 AES-GCM 广泛 移动设备,嵌入式系统,或者需要高速加密的场景

重要提示:

  • 始终使用随机且唯一的 IV 或 nonce
  • 安全地存储密钥、IV/nonce 和标签
  • 在解密时,必须使用与加密时相同的密钥、IV/nonce 和关联数据
  • 在解密后,必须验证认证标签,以确保数据的完整性和真实性。
  • 不要在生产环境中直接打印密钥

3. 非对称加密的深入应用:RSA, ECC

非对称加密使用一对密钥:公钥和私钥。公钥可以公开分发,用于加密数据或验证签名。私钥必须保密,用于解密数据或生成签名。cryptography 库提供了 RSA 和 ECC (Elliptic Curve Cryptography) 两种常用的非对称加密算法。

3.1 RSA

RSA 是一种经典的非对称加密算法。

from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization

# 1. 生成 RSA 密钥对
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
    backend=default_backend()
)
public_key = private_key.public_key()

# 2. 序列化公钥 (用于存储或传输)
pem = public_key.public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo
)

# 3. 加载公钥
loaded_public_key = serialization.load_pem_public_key(
    pem,
    backend=default_backend()
)

# 4. 加密数据
plaintext = b"this is my secret message"
ciphertext = public_key.encrypt(
    plaintext,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

# 5. 解密数据
plaintext = private_key.decrypt(
    ciphertext,
    padding.OAEP(
        mgf=padding.MGF1(algorithm=hashes.SHA256()),
        algorithm=hashes.SHA256(),
        label=None
    )
)

# 打印密文和公钥(请勿在生产环境中直接打印私钥!)
print(f"密文: {ciphertext.hex()}")
print(f"公钥: {pem.decode()}")
print("解密成功:", plaintext.decode())
  • rsa.generate_private_key(): 生成 RSA 私钥。
    • public_exponent: 公钥指数,通常设置为 65537。
    • key_size: 密钥长度,建议至少设置为 2048 位。
  • public_key.encrypt(): 使用公钥加密数据。
    • padding: 填充方案,用于增加安全性。建议使用 padding.OAEP
  • private_key.decrypt(): 使用私钥解密数据。
    • padding: 必须与加密时使用的填充方案相同。

3.2 ECC (Elliptic Curve Cryptography)

ECC 是一种更现代的非对称加密算法,它在相同安全级别下,密钥长度更短,计算速度更快。

from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import utils
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization

# 1. 生成 ECC 密钥对
private_key = ec.generate_private_key(
    ec.SECP256R1(),  # 选择一个椭圆曲线
    default_backend()
)
public_key = private_key.public_key()

# 2. 序列化公钥 (用于存储或传输)
pem = public_key.public_bytes(
    encoding=serialization.Encoding.PEM,
    format=serialization.PublicFormat.SubjectPublicKeyInfo
)

# 3. 加载公钥
loaded_public_key = serialization.load_pem_public_key(
    pem,
    backend=default_backend()
)

# 4. 使用 ECDH (Elliptic Curve Diffie-Hellman) 密钥交换协议
# A 方
shared_key_a = private_key.exchange(
    ec.ECDH(),
    loaded_public_key
)

# B 方 (假设 B 方拥有 A 方的公钥)
shared_key_b = private_key.exchange(
    ec.ECDH(),
    public_key
)

# 使用 KDF 派生密钥
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.hkdf import HKDF

hkdf = HKDF(
    algorithm=hashes.SHA256(),
    length=32,
    salt=None,
    info=b'my app info',
    backend=default_backend()
)
key_a = hkdf.derive(shared_key_a)

hkdf = HKDF(
    algorithm=hashes.SHA256(),
    length=32,
    salt=None,
    info=b'my app info',
    backend=default_backend()
)
key_b = hkdf.derive(shared_key_b)

# 打印公钥和共享密钥(请勿在生产环境中直接打印私钥!)
print(f"公钥: {pem.decode()}")
print(f"共享密钥 A: {key_a.hex()}")
print(f"共享密钥 B: {key_b.hex()}")
  • ec.generate_private_key(): 生成 ECC 私钥。
    • ec.SECP256R1(): 选择一个椭圆曲线。常用的曲线还有 ec.SECP384R1(), ec.SECP521R1(), ec.BrainpoolP256R1() 等。
  • private_key.exchange(): 使用 ECDH 密钥交换协议生成共享密钥。
  • HKDF(): 使用 KDF (例如 HKDF) 从共享密钥派生出一个对称密钥。

非对称加密选择建议:

非对称加密算法 优点 缺点 推荐使用场景
RSA 广泛支持,易于理解和实现 相同安全级别下,密钥长度较长,计算速度较慢 需要兼容旧系统的场景,或者对性能要求不高的场景
ECC 相同安全级别下,密钥长度较短,计算速度较快 实现相对复杂,支持不如 RSA 广泛 对性能要求高,且需要更小密钥长度的场景,例如移动设备,嵌入式系统

重要提示:

  • 始终安全地存储私钥
  • 选择合适的密钥长度 (RSA) 或椭圆曲线 (ECC),以满足安全需求。
  • 使用填充方案 (RSA) 或 KDF (ECC),以增加安全性。
  • 不要在生产环境中直接打印私钥

4. 数字签名与证书管理

数字签名用于验证数据的完整性和真实性。它使用私钥对数据进行签名,然后使用公钥验证签名。cryptography 库提供了多种签名算法和证书管理功能。

4.1 数字签名

from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.backends import default_backend

# 1. 生成 RSA 密钥对
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
    backend=default_backend()
)
public_key = private_key.public_key()

# 2. 准备要签名的数据
message = b"this is my message to be signed"

# 3. 使用私钥对数据进行签名
signature = private_key.sign(
    message,
    padding.PSS(
        mgf=padding.MGF1(hashes.SHA256()),
        salt_length=padding.PSS.MAX_LENGTH
    ),
    hashes.SHA256()
)

# 4. 使用公钥验证签名
try:
    public_key.verify(
        signature,
        message,
        padding.PSS(
            mgf=padding.MGF1(hashes.SHA256()),
            salt_length=padding.PSS.MAX_LENGTH
        ),
        hashes.SHA256()
    )
    print("签名验证成功!")
except Exception as e:
    print("签名验证失败:", e)

# 打印签名(请勿在生产环境中直接打印私钥!)
print(f"签名: {signature.hex()}")
  • private_key.sign(): 使用私钥对数据进行签名。
    • padding: 填充方案,建议使用 padding.PSS
    • hashes: 哈希算法,例如 hashes.SHA256()
  • public_key.verify(): 使用公钥验证签名。
    • padding: 必须与签名时使用的填充方案相同。
    • hashes: 必须与签名时使用的哈希算法相同。

4.2 证书管理

cryptography 库可以用于创建、加载和验证 X.509 证书。

from cryptography import x509
from cryptography.x509.oid import NameOID
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives import serialization
import datetime

# 1. 生成 RSA 密钥对
private_key = rsa.generate_private_key(
    public_exponent=65537,
    key_size=2048,
    backend=default_backend()
)
public_key = private_key.public_key()

# 2. 创建证书请求 (CSR)
builder = x509.CertificateBuilder()
builder = builder.subject_name(x509.Name([
    x509.NameAttribute(NameOID.COMMON_NAME, u"example.com")
]))
builder = builder.issuer_name(x509.Name([
    x509.NameAttribute(NameOID.COMMON_NAME, u"example.com")
]))
builder = builder.not_valid_before(datetime.datetime.today() - datetime.timedelta(days=1))
builder = builder.not_valid_after(datetime.datetime.today() + datetime.timedelta(days=365))
builder = builder.serial_number(x509.random_serial_number())
builder = builder.public_key(public_key)
builder = builder.add_extension(
    x509.SubjectAlternativeName([x509.DNSName(u"example.com")]),
    critical=False,
)

# 3. 使用私钥对证书请求进行签名
certificate = builder.sign(
    private_key, hashes.SHA256(), default_backend()
)

# 4. 序列化证书 (用于存储或传输)
pem = certificate.public_bytes(encoding=serialization.Encoding.PEM)

# 5. 加载证书
loaded_certificate = x509.load_pem_x509_certificate(pem, default_backend())

# 6. 验证证书 (例如,验证签名是否有效)
try:
    public_key.verify(
        loaded_certificate.signature,
        loaded_certificate.tbs_certificate_bytes,
        padding.PKCS1v15(),
        loaded_certificate.signature_algorithm
    )
    print("证书验证成功!")
except Exception as e:
    print("证书验证失败:", e)

# 打印证书(请勿在生产环境中直接打印私钥!)
print(f"证书: {pem.decode()}")
  • x509.CertificateBuilder(): 创建证书构建器。
  • builder.subject_name(): 设置证书的主题名称。
  • builder.issuer_name(): 设置证书的颁发者名称。
  • builder.not_valid_before(): 设置证书的生效时间。
  • builder.not_valid_after(): 设置证书的过期时间。
  • builder.public_key(): 设置证书的公钥。
  • builder.sign(): 使用私钥对证书进行签名。
  • x509.load_pem_x509_certificate(): 加载证书。
  • public_key.verify(): 验证证书的签名。

重要提示:

  • 始终安全地存储私钥
  • 选择合适的签名算法和哈希算法,以满足安全需求。
  • 验证证书的有效性,包括签名、有效期和颁发者。
  • 不要在生产环境中直接打印私钥

5. 高级 API 使用技巧: Fernet, Secret 框架

cryptography 库提供了一些高级 API,可以简化加密操作。

5.1 Fernet

Fernet 是一种对称加密方案,它基于 AES-GCM,并提供了一种简单易用的 API。

from cryptography.fernet import Fernet

# 1. 生成 Fernet 密钥
key = Fernet.generate_key()
f = Fernet(key)

# 2. 加密数据
plaintext = b"this is my secret message"
ciphertext = f.encrypt(plaintext)

# 3. 解密数据
plaintext = f.decrypt(ciphertext)

# 打印密文和密钥(请勿在生产环境中直接打印密钥!)
print(f"密文: {ciphertext.hex()}")
print(f"密钥: {key.decode()}")
print("解密成功:", plaintext.decode())
  • Fernet.generate_key(): 生成 Fernet 密钥。
  • Fernet(key): 创建 Fernet 对象。
  • f.encrypt(): 加密数据。
  • f.decrypt(): 解密数据。

5.2 Secret 框架 (Symmetric Encryption Routines and Tool)

Secret 框架是 cryptography 39.0版本以后新增的API,它简化了密码参数的复杂性,提供了更高级别的API来简化使用对称加密的过程。

from cryptography.secret import Secret
from cryptography.hazmat.primitives.hashes import SHA256
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

# 1. 创建 Secret 对象并指定密钥长度
secret = Secret.new(length=32)  # 32 bytes for AES-256

# 2. 派生一个AESGCM对象
aead = secret.derive_aead(AESGCM, SHA256)

# 3. 加密数据
nonce = os.urandom(12)
associated_data = b"this is authenticated but unencrypted data"
plaintext = b"this is my secret message"
ciphertext = aead.encrypt(nonce, plaintext, associated_data)

# 4. 解密数据
decrypted_plaintext = aead.decrypt(nonce, ciphertext, associated_data)

# 打印密文和密钥(请勿在生产环境中直接打印密钥!)
print(f"密文: {ciphertext.hex()}")
print("解密成功:", decrypted_plaintext.decode())
  • Secret.new(length=32): 创建 Secret 对象,并指定密钥长度。
  • secret.derive_aead(AESGCM, SHA256): 从Secret对象派生出一个AEAD对象。

重要提示:

  • 安全地存储 Fernet 密钥
  • Secret 框架更加安全,推荐使用

6. 一些最佳实践与安全建议

  • 使用最新的 cryptography 库版本,以获得最新的安全修复和功能。
  • 仔细阅读 cryptography 库的文档,了解每个算法和 API 的安全注意事项。
  • 避免使用过时的或不安全的算法,例如 DES, MD5, SHA1。
  • 定期审查您的加密代码,以确保其符合最佳实践和安全标准。
  • 进行安全测试,以识别潜在的漏洞。
  • 寻求安全专家的帮助,以确保您的加密方案是安全的。
  • 了解您所在地区的法律法规,以确保您的加密方案符合法律要求。
  • 不要在生产环境中直接打印密钥
  • 使用强密码,并定期更改密码。
  • 启用双因素身份验证,以增加安全性。
  • 使用防火墙,以保护您的服务器免受攻击。
  • 定期备份您的数据,以防止数据丢失。

好了,以上就是今天关于 cryptography 库高级用法的全部内容。希望今天的讲解对大家有所帮助。

关键点回顾:选择合适的工具并安全使用

今天我们深入探讨了 cryptography 库的高级用法,包括 KDFs, AEAD 模式,非对称加密,数字签名,证书管理和高级API。记住,选择合适的加密工具并安全地使用它们至关重要,这样才能有效地保护您的数据。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注