Cryptography,一个加密与安全工具库 Python 库!

文摘   2025-01-13 14:45   福建  

Cryptography 是一个功能强大且流行的 Python 库,用于实现加密和安全功能。它提供了一套高效、易用的 API,支持多种加密算法,包括对称加密、非对称加密、哈希算法,以及数字签名等功能。


主要特点

  1. 对称加密:支持 AES、ChaCha20 等现代对称加密算法。
  2. 非对称加密:支持 RSA、ECDSA、Ed25519 等非对称加密算法。
  3. 哈希算法:支持 SHA 系列哈希函数(如 SHA-256)。
  4. 数字签名:支持创建和验证数字签名,确保消息的完整性和真实性。
  5. 证书操作:支持 X.509 证书的创建、解析和验证。
  6. 现代 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",
    )

适用场景

  1. 数据加密:保护敏感信息,如密码、机密文件等。
  2. 安全通信:在网络通信中加密数据,如 HTTPS。
  3. 身份验证:使用数字签名验证消息来源和完整性。
  4. 证书管理:创建和验证 SSL/TLS 证书。
  5. 哈希校验:检查文件或数据的完整性。

总结

Cryptography 是一个功能强大的 Python 加密库,适合多种加密和安全需求。它提供了高级的 API,让开发者可以轻松实现现代加密功能,同时支持更底层的细粒度控制。

优点

  • 支持多种加密算法,功能全面。
  • 安全性高,符合现代加密标准。
  • API 简洁易用,适合初学者和专业开发者。

缺点

  • 需要一定的加密学基础知识。
  • 对某些功能(如 X.509)的学习曲线稍高。

如果你有具体的需求或问题,随时告诉我,我可以帮助你更深入地使用 Cryptography

 最新文章