کتابخانه cryptography در پایتون
کتابخانه cryptography (توسعهی PyCA) یکی از محبوبترین و معتبرترین کتابخانههای رمزنگاری برای پایتون است. این کتابخانه مجموعهای از ابزارهای سطحبالا و پایینسطح را برای عملیاتهایی مثل رمزنگاری متقارن و نامتقارن، امضاهای دیجیتال، توابع هش، و مشتق کلید (KDF) فراهم میکند. در این مقاله بهصورت عملی و موجز به نصب، مثالهای رایج، نکات امنیتی و بهترین روشها میپردازیم.
نصب و شروع سریع
برای نصب آخرین نسخه از pip استفاده کنید:
pip install cryptographyبعد از نصب میتوانید از ماژولهای مختلف آن استفاده کنید؛ در ادامه مثالهای متداول را میبینید.
رمزنگاری سطحبالا: Fernet (رمزنگاری متقارن ایمن)
Fernet یک API سطحبالا برای رمزنگاری متقارن ارائه میدهد که طراحی شده تا استفادهی امن و سادهای داشته باشد (شامل IV، احراز وجود پیام و نسخهبندی).
from cryptography.fernet import Fernet
# تولید کلید
key = Fernet.generate_key()
f = Fernet(key)
# رمزنگاری و بازگشایی
message = b"Secret message"
token = f.encrypt(message)
plaintext = f.decrypt(token)
print(plaintext) # b"Secret message"توضیح: نمونه بالا نشان میدهد که با Fernet بهراحتی میتوان کلید تولید کرد، پیام را رمز کرد و سپس بازگرداند. Fernet تمام جزئیات مثل IV و HMAC را مدیریت میکند و برای اکثر نیازهای رمزنگاری متقارن کاربردی و امن است.
رمزنگاری متقارن پیشرفته: AES-GCM و ChaCha20-Poly1305
برای مواردی که به کنترل بیشتری روی پارامترها نیاز دارید میتوانید از AES-GCM یا ChaCha20-Poly1305 استفاده کنید که هر دو مدهای احراز وجود (AEAD) هستند.
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
import os
key = AESGCM.generate_key(bit_length=128)
aesgcm = AESGCM(key)
nonce = os.urandom(12) # 96-bit nonce برای AES-GCM
adata = b"associated data"
ct = aesgcm.encrypt(nonce, b"plaintext data", adata)
pt = aesgcm.decrypt(nonce, ct, adata)توضیح: در AES-GCM باید nonce (یا IV) را هر بار متفاوت تولید کنید. associated data (adata) برای احراز وجود بخشی از پیام بدون رمزنگاری آن کاربرد دارد. اگر nonce تکرار شود، امنیت به خطر میافتد.
رمزنگاری نامتقارن: ایجاد کلید، امضا و تأیید
برای احراز هویت و تبادل کلید، RSA و الگوریتمهای مدرنتر مثل Ed25519 کاربرد دارند. مثال RSA برای امضا/تصدیق:
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import hashes
# ساخت کلید
private_key = rsa.generate_private_key(public_exponent=65537, key_size=2048)
public_key = private_key.public_key()
# امضا
message = b"message to sign"
signature = private_key.sign(
message,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)
# تأیید امضا
public_key.verify(
signature,
message,
padding.PSS(
mgf=padding.MGF1(hashes.SHA256()),
salt_length=padding.PSS.MAX_LENGTH
),
hashes.SHA256()
)توضیح: در مثال بالا از PSS برای امضا استفاده شده که شیوهای امن برای RSA است. برای کاربردهای مدرن پیشنهاد میشود Ed25519 (که سادهتر و سریعتر است) را نیز بررسی کنید.
مشتق کلید از گذرواژه (KDF)
هیچگاه کلیدهای حساس را از گذرواژههای خام بدون مشتقسازی نساخت. از Scrypt یا PBKDF2 برای تبدیل گذرواژه به کلید استفاده کنید:
from cryptography.hazmat.primitives.kdf.scrypt import Scrypt
import os
password = b"my secret password"
salt = os.urandom(16)
kdf = Scrypt(salt=salt, length=32, n=2**14, r=8, p=1)
key = kdf.derive(password)توضیح: Scrypt پارامترهایی برای حافظه و محاسبه دارد که باید براساس منابع سیستم تنظیم شود. همیشه salt تصادفی و یکتا استفاده کنید و پارامترها را ثبت کنید تا در زمان تأیید، امکان مشتق مجدد وجود داشته باشد.
ذخیرهسازی کلید و سریالایزیشن
وقتی کلیدها را تولید میکنید احتمالاً نیاز دارید آنها را ذخیره یا منتقل کنید. از روشهای سریالایزیشن امن استفاده کنید و برای فایلهای کلید خصوصی از رمزنگاری روی دیسک (encryption) بهره ببرید.
from cryptography.hazmat.primitives import serialization
# سریالایزیشن کلید خصوصی (با رمز)
pem = private_key.private_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PrivateFormat.PKCS8,
encryption_algorithm=serialization.BestAvailableEncryption(b"password")
)توضیح: BestAvailableEncryption از رمزنگاری قوی برای محافظت از کلید خصوصی هنگام ذخیره استفاده میکند. از گذرواژه قوی و مدیریت کلید مناسب استفاده کنید.
بهترین شیوهها و نکات امنیتی
- از APIهای سطحبالا مثل Fernet یا AEAD (AES-GCM/ChaCha20-Poly1305) استفاده کنید و از طراحیهای سفارشی پرهیز کنید.
- هرگز IV/nonce را تکرار نکنید؛ برای nonce از os.urandom یا secrets استفاده کنید.
- برای مشتق کلید از گذرواژه از scrypt یا PBKDF2HMAC با salt تصادفی استفاده کنید.
- نسخههای کتابخانه را بهروز نگه دارید و به هشدارهای امنیتی توجه کنید.
- کلیدها را خارج از کد (مثل secret manager یا HSM) نگهداری کنید، نه در کد بیلد یا مخزن عمومی.
مقایسه سریع روشها
| روش | موارد استفاده | مزایا |
|---|---|---|
| Fernet | رمزنگاری متقارن آسان | ساده، شامل HMAC/IV |
| AES-GCM / ChaCha20-Poly1305 | AEAD برای دادههای حساس | سرعت و امنیت بالا، پشتیبانی از AAD |
| RSA / Ed25519 | امضا و تبادل کلید | امضا/تصدیق و مدیریت کلید عمومی |
موارد کاربردی و نمونههای واقعی
کتابخانه cryptography برای موارد زیر مناسب است:
- رمزنگاری فایلها و پیامها در برنامههای تحت وب یا دسکتاپ
- ایجاد و بررسی امضاهای دیجیتال برای اسناد
- مشتق کلید از گذرواژه و ذخیره امن رمزهای عبور
- پیادهسازی پروتکلهای TLS/SSH در لایههای بالاتر (با استفاده از primitives)
جمعبندی
کتابخانه cryptography ترکیبی از سادگی و امنیت را ارائه میدهد. برای استفادهی صحیح از آن، از APIهای سطحبالا استفاده کنید، مدیریت کلید و nonce را جدی بگیرید، و از KDFهای قوی برای تبدیل گذرواژه به کلید استفاده کنید. در نهایت همیشه مستندات رسمی را مطالعه کرده و کتابخانه را بهروز نگه دارید.
آیا این مطلب برای شما مفید بود ؟




