کتابخانه passlib در پایتون
passlib یک کتابخانهٔ قدرتمند و کاربردی برای هَشکردن و مدیریت پسوردها در پایتون است. این کتابخانه مجموعهای از الگوریتمهای رمزنگاری پسورد (مثل bcrypt، argon2، pbkdf2 و غیره) را با رابطی یکپارچه فراهم میکند و مسائلی مثل نمکگذاری (salting)، هزینهٔ محاسباتی (cost/work factor)، و مهاجرت بین الگوریتمها را به شکل امن مدیریت میکند.
چرا از passlib استفاده کنیم؟
- رابط ساده و یکپارچه برای انواع الگوریتمها
- پیشفرضهای امن و امکانات ارتقای خودکار هش کاربران
- پشتیبانی از عملیات verify و update (مناسب برای مهاجرت به الگوریتمهای جدید)
- انجام مقایسهٔ امن و مقاوم در برابر حملات timing
نصب و شروع سریع
pip install passlib
# برای استفاده از argon2 نیاز به argon2-cffi:
pip install passlib[argon2]دستور بالا passlib را نصب میکند و در صورت نیاز به argon2، بستهٔ تکمیلی argon2-cffi را هم نصب میکند. استفاده از argon2 توصیه میشود در صورت امکان، زیرا امتیازات امنیتی و مقاومت بالاتری در برابر حملات دارد.
CryptContext — مدیریت سیاستهای هش
یکی از مفیدترین امکانات passlib، کلاس CryptContext است که به شما اجازه میدهد مجموعهای از الگوریتمها و پارامترها را تعریف کنید و برای عملیات هش/بررسی از آن استفاده کنید.
from passlib.context import CryptContext
pwd_context = CryptContext(
schemes=["argon2", "bcrypt_sha256", "pbkdf2_sha256"],
default="argon2",
deprecated="auto",
)در این مثال یک CryptContext تعریف شده که به ترتیب از argon2 به عنوان الگوریتم پیشفرض، سپس bcrypt با پیشهَش SHA-256 (مناسب مقابله با محدودیت طول bcrypt) و pbkdf2_sha256 پشتیبانی میکند. گزینه deprecated=”auto” باعث میشود هشهای قدیمیتر بهصورت خودکار قابل تشخیص و ارتقا باشند.
مثالهای عملی
هَشکردن و تأیید پسورد
# ایجاد هش
hash = pwd_context.hash("my_secure_password")
# بررسی پسورد
is_valid = pwd_context.verify("my_secure_password", hash)در این کد ابتدا با متد hash از pwd_context، هش امنی تولید میشود. سپس با verify بررسی میکنیم آیا مقدار ورودی با هش تطابق دارد یا خیر. passlib بهصورت داخلی مقایسهٔ امن انجام میدهد تا در مقابل حملات timing مقاوم باشد.
ارتقا (migrate) هشها به روش ایمن
# verify_and_update هم بررسی میکند و هم در صورت نیاز هش را به الگوریتم/پارامتر جدید ارتقا میدهد
new_hash = pwd_context.hash("old_password")
valid = pwd_context.verify_and_update("old_password", new_hash)
# اگر valid[0] True باشد و valid[1] شامل هش جدید شود، میتوانید هش جدید را در DB ذخیره کنیدverify_and_update مقدار ورودی را بررسی میکند و در صورت شناسایی هش با الگوریتم قدیمی، هش جدیدی با الگوریتم/پارامترهای فعلی تولید میکند. این روش برای مهاجرت نرم به پارامترهای قویتر بسیار مفید است: هنگام ورود موفق کاربر، هش در دیتابیس بهروز میشود.
نمونه ذخیره در دیتابیس و عملیات ورود
# فرض: user.password_hash از دیتابیس خوانده میشود
stored_hash = user.password_hash
if pwd_context.verify_and_update(candidate_password, stored_hash):
# اگر هش جدید تولید شده، آن را ذخیره کنید
user.password_hash = pwd_context.hash(candidate_password)
save(user)در این الگو ابتدا verify_and_update اجرا میشود تا هم بررسی و هم ارتقا انجام شود. اگر هش نیاز به ارتقا داشت، مقدار جدید را ذخیره میکنیم. دقت کنید که هنگام ذخیره، مجدداً از hash استفاده نشود تا از پارامترهای داخل context بهره ببرید یا میتوان از خروجی verify_and_update برای دریافت هش جدید استفاده کرد.
مقایسهٔ رایج الگوریتمها
| الگوریتم | مزایا | معایب |
|---|---|---|
| Argon2 | مقاومت بالا، پارامترهای حافظهای و زمانی قابل تنظیم | نیاز به کتابخانهٔ اضافی (argon2-cffi)، پیکربندی کمی پیچیدهتر |
| bcrypt / bcrypt_sha256 | پایدار و شناختهشده؛ bcrypt_sha256 برای دور زدن محدودیت طول | محدودیت طول 72 بایت در bcrypt معمولی |
| pbkdf2_sha256 | قابل اجرا روی همهٔ پلتفرمها، بدون نیاز به ماژولهای بومی | کندتر در برابر حملات مدرن نسبت به argon2، و معمولاً نیاز به هزینهٔ بالاتر |
نکات ایمنی و بهترین روشها (Expert Tips)
- همیشه از CryptContext استفاده کنید تا بتوانید سیاستها را متمرکز مدیریت کنید.
- در صورت امکان، argon2 را بهعنوان پیشفرض انتخاب کنید.
- برای bcrypt محدودیت 72 بایت را درنظر بگیرید؛ یا از bcrypt_sha256 استفاده کنید.
- از verify_and_update برای مهاجرت تدریجی کاربران به پارامترهای جدید استفاده کنید.
- هشها را همراه با شناسهٔ الگوریتم و پارامترها ذخیره کنید (passlib اینکار را در رشتهٔ هش انجام میدهد).
- هرگز پسوردها را بهصورت متن ساده در لاگ یا دیتابیس ذخیره نکنید.
- برای APIها یا سرویسهای حساس، نرخ محدودیت لاگین (rate limiting) و قفل حساب را لحاظ کنید.
مثال پیشرفته: پیکربندی دقیق پارامترها
pwd_context = CryptContext(
schemes=["argon2"],
default="argon2",
argon2__time_cost=3,
argon2__memory_cost=65536, # KB => 64 MB
argon2__parallelism=2,
)در این مثال پارامترهای argon2 بهصورت دقیق تنظیم شدهاند: time_cost (تعداد تکرارها)، memory_cost (حافظه بر حسب کیلوبایت) و parallelism (موازیسازی). توجه کنید که افزایش این پارامترها باعث افزایش امنیت اما بالاتر رفتن مصرف حافظه و زمان خواهد شد؛ باید توازن بین امنیت و کارایی در سرور خود پیدا کنید.
پرسشهای متداول مختصر
- آیا passlib مقایسهٔ امن انجام میدهد؟ بله، مقایسهها بهگونهای هستند که در برابر timing attacks مقاوم باشند.
- آیا باید همیشه argon2 را انتخاب کنم؟ در صورت امکان بله، ولی اگر محیط شما نصب کتابخانهٔ بومی را محدود میکند، bcrypt_sha256 یا pbkdf2_sha256 نیز گزینههای قابل قبولاند.
- چطور هشهای قدیمی را بهروز کنم؟ با verify_and_update هنگام ورود کاربر یا اجرای اسکریپت مهاجرت که رمز عبور را دوباره درخواست میکند.
passlib ابزاری بالغ و عملی برای مدیریت پسوردهاست که با رعایت بهترین شیوهها و تنظیم پارامترها میتواند بخش مهمی از امنیت اپلیکیشن شما را تضمین کند. استفادهٔ هوشمندانه از CryptContext و روشهای ارتقا، همراه با انتخاب الگوریتم مناسب، بهترین ترکیب برای حفظ امنیت طولانیمدت است.
آیا این مطلب برای شما مفید بود ؟




