Cryptography
是一个功能强大且流行的 Python 库,用于实现加密和安全功能。它提供了一套高效、易用的 API,支持多种加密算法,包括对称加密、非对称加密、哈希算法,以及数字签名等功能。
主要特点
对称加密:支持 AES、ChaCha20 等现代对称加密算法。 非对称加密:支持 RSA、ECDSA、Ed25519 等非对称加密算法。 哈希算法:支持 SHA 系列哈希函数(如 SHA-256)。 数字签名:支持创建和验证数字签名,确保消息的完整性和真实性。 证书操作:支持 X.509 证书的创建、解析和验证。 现代 API:提供易用的、高级的 API,同时支持底层操作。
安装 Cryptography
通过 pip
安装 Cryptography
:
pip install cryptography
基本用法
以下是 Cryptography
的常见功能及其实现方式:
1. 对称加密
对称加密是一种加密方法,使用相同的密钥来加密和解密数据。
使用 AES-GCM 加密和解密
AES-GCM 是一种安全且高效的加密模式,提供了认证加密功能。
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
import os
# 生成密钥
key = AESGCM.generate_key(bit_length=128)
# 加密
aesgcm = AESGCM(key)
nonce = os.urandom(12) # GCM 要求 96 位的随机值
data = b"Secret data"
aad = b"Additional authenticated data" # 可选,认证附加数据
ciphertext = aesgcm.encrypt(nonce, data, aad)
# 解密
decrypted_data = aesgcm.decrypt(nonce, ciphertext, aad)
print(f"Ciphertext: {ciphertext}")
print(f"Decrypted: {decrypted_data.decode()}")
2. 非对称加密
非对称加密使用公钥和私钥进行加密和解密。
使用 RSA 加密和解密
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.hazmat.primitives import hashes
# 生成 RSA 密钥对
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
)
public_key = private_key.public_key()
# 加密
message = b"Secret message"
ciphertext = public_key.encrypt(
message,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None,
),
)
# 解密
plaintext = private_key.decrypt(
ciphertext,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(),
label=None,
),
)
print(f"Ciphertext: {ciphertext}")
print(f"Plaintext: {plaintext.decode()}")
3. 数字签名
数字签名用于验证数据的完整性和来源。
创建和验证数字签名(RSA 签名)
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
# 数据签名
message = b"Important message"
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("Signature is valid.")
except:
print("Signature is invalid.")
4. 哈希函数
哈希函数将数据转换为固定长度的哈希值,用于数据完整性检查。
生成 SHA-256 哈希
from cryptography.hazmat.primitives import hashes
digest = hashes.Hash(hashes.SHA256())
digest.update(b"Hello ")
digest.update(b"World!")
hash_value = digest.finalize()
print(f"SHA-256 Hash: {hash_value.hex()}")
5. X.509 证书操作
可以使用 Cryptography
创建、解析和验证 X.509 证书。
创建自签名证书
from cryptography import x509
from cryptography.x509.oid import NameOID
from datetime import datetime, timedelta
# 创建私钥
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=2048,
)
# 创建证书
subject = x509.Name([
x509.NameAttribute(NameOID.COUNTRY_NAME, u"US"),
x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, u"California"),
x509.NameAttribute(NameOID.LOCALITY_NAME, u"San Francisco"),
x509.NameAttribute(NameOID.ORGANIZATION_NAME, u"My Company"),
x509.NameAttribute(NameOID.COMMON_NAME, u"mycompany.com"),
])
issuer = subject # 自签名证书,发行者与主题相同
cert = x509.CertificateBuilder().subject_name(
subject
).issuer_name(
issuer
).public_key(
private_key.public_key()
).serial_number(
x509.random_serial_number()
).not_valid_before(
datetime.utcnow()
).not_valid_after(
datetime.utcnow() + timedelta(days=365)
).sign(private_key, hashes.SHA256())
# 将证书保存到文件
with open("certificate.pem", "wb") as f:
f.write(cert.public_bytes(serialization.Encoding.PEM))
print("Certificate created and saved as 'certificate.pem'")
6. 密钥序列化
可以将公钥和私钥保存到文件中,方便后续使用。
保存和加载私钥
# 保存私钥
with open("private_key.pem", "wb") as f:
f.write(
private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.PKCS8,
encryption_algorithm=serialization.BestAvailableEncryption(b"password"),
)
)
# 加载私钥
with open("private_key.pem", "rb") as f:
loaded_private_key = serialization.load_pem_private_key(
f.read(),
password=b"password",
)
适用场景
数据加密:保护敏感信息,如密码、机密文件等。 安全通信:在网络通信中加密数据,如 HTTPS。 身份验证:使用数字签名验证消息来源和完整性。 证书管理:创建和验证 SSL/TLS 证书。 哈希校验:检查文件或数据的完整性。
总结
Cryptography
是一个功能强大的 Python 加密库,适合多种加密和安全需求。它提供了高级的 API,让开发者可以轻松实现现代加密功能,同时支持更底层的细粒度控制。
优点:
支持多种加密算法,功能全面。 安全性高,符合现代加密标准。 API 简洁易用,适合初学者和专业开发者。
缺点:
需要一定的加密学基础知识。 对某些功能(如 X.509)的学习曲线稍高。
如果你有具体的需求或问题,随时告诉我,我可以帮助你更深入地使用 Cryptography
!