کتابخانه argon2-cffi در پایتون
Argon2 یک الگوریتم مدرن و استانداردشده برای هش کردن کلمات عبور است که در مسابقه رمزنگاری Password Hashing Competition (PHC) برنده شد. کتابخانهٔ argon2-cffi در پایتون یک رابط امن و ساده برای استفاده از Argon2 فراهم میکند تا توسعهدهندگان بتوانند بهصورت قابل اطمینان کلمات عبور را هش کنند، اعتبارسنجی انجام دهند و نیاز به بازهبندی پارامترها را مدیریت کنند.
چرا Argon2 و چرا argon2-cffi؟
- مقاومت در برابر حملات سختافزاری: Argon2 با مصرف حافظه بالا و پارالل مناسب احتمال حملات با GPU/ASIC را کاهش میدهد.
- تنوع حالتها: سه حالت Argon2d، Argon2i و Argon2id وجود دارد که برای سناریوهای مختلف کاربردیاند. معمولاً Argon2id برای هش کلمه عبور توصیه میشود.
- رابط کاربری ساده: argon2-cffi شیء-محور و توابع سادهای برای هش، تأیید و بازسازی هش فراهم میکند.
نصب
pip install argon2-cffiاین دستور کتابخانه را نصب میکند. در برخی سیستمها ممکن است به ابزارهای توسعه (مثل build-essential در لینوکس) نیاز داشته باشید تا وابستگیهای باینری ساخته شوند.
نمونهٔ پایه: هش و اعتبارسنجی
from argon2 import PasswordHasher
from argon2.exceptions import VerifyMismatchError
ph = PasswordHasher()
# ساخت هش
hash = ph.hash("my_secure_password")
# اعتبارسنجی
try:
ph.verify(hash, "my_secure_password")
print("Password is correct")
except VerifyMismatchError:
print("Password is incorrect")در این مثال، یک نمونهٔ PasswordHasher با تنظیمات پیشفرض ساخته میشود، سپس رشتهٔ رمز عبور هش میگردد و با استفاده از verify اعتبارسنجی انجام میشود. متد verify در صورت نامطابقت خطای VerifyMismatchError پرتاب میکند.
پارامترهای مهم و انتخاب مقدار مناسب
پارامترهای اصلی که باید توجه شوند:
- time_cost: تعداد تکرار محاسبات؛ افزایش باعث افزایش زمان محاسبه میشود.
- memory_cost: میزان حافظه مصرفی (در کیلوبایت یا مقدار مورد استفاده توسط پیادهسازی)؛ افزایش باعث سختتر شدن حملات سختافزاری میشود.
- parallelism: تعداد رشتههای همزمان (threads) که عمل هش را اجرا میکنند.
- hash_len و salt_len: طول خروجی و طول سالت به بایت.
- type: نوع Argon2 (Argon2i, Argon2d, Argon2id). برای رمزهای کاربری معمولاً Argon2id توصیه میشود.
پیشنهاد عملی: بهجای کپی کردن اعداد از اینترنت، پارامترها را روی سختافزار هدف بسنجید تا تعادلی بین امنیت و تجربهٔ کاربری (latency) برقرار شود.
نمونهٔ پیشرفته با پارامترهای سفارشی و بازهگذاری
from argon2 import PasswordHasher, Type
from argon2.exceptions import VerifyMismatchError
ph = PasswordHasher(time_cost=3, memory_cost=65536, parallelism=4, hash_len=32, salt_len=16, type=Type.ID)
hash = ph.hash("another_password")
# بررسی نیاز به rehash (وقتی پارامترها تغییر کنند)
if ph.check_needs_rehash(hash):
new_hash = ph.hash("another_password")
# ذخیرهٔ new_hash در پایگاه دادهدر این کد، از حالت Argon2id استفاده شده و پارامترها بهصورت سفارشی تعیین شدهاند. متد check_needs_rehash به شما میگوید که آیا هش ذخیرهشده با پارامترهای فعلی مطابقت دارد یا باید دوباره هش شود (مثلاً بعد از آپگرید کردن پارامترها).
ذخیرهٔ هش در پایگاه داده — نکات عملی
- خروجی
ph.hash()یک رشتهٔ قابل ذخیره شامل پارامترها، سالت و هش است؛ کافی است همان رشته را در ستون متنی ذخیره کنید. - هرگز سالت را جداگانه مدیریت نکنید مگر موقع نیاز خاص؛ argon2-cffi بهصورت خودکار سالت امن تولید میکند.
- هرگز مقدار خام کلمه عبور را لاگ یا در فایلهای دیباگ ذخیره نکنید.
مدیریت خطاها و مسائل امنیتی
- از استثناهای کتابخانه (مثل
VerifyMismatchErrorوVerificationError) برای پاسخهای مناسب استفاده کنید. - زمان پاسخ را ثابت نگه دارید تا امکان حملات زمانبندی کاهش یابد؛ argon2-cffi خود عملیات بررسی را بهصورت امن انجام میدهد، اما لایهٔ اپلیکیشن باید مراقب پیامها و زمانبندی باشد.
- در صورت مهاجرت کاربران از الگوریتم قدیمی، از
check_needs_rehashبرای هش مجدد هنگام لاگین موفق استفاده کنید.
مقایسهٔ کوتاه با bcrypt و scrypt
| ویژگی | Argon2 | bcrypt / scrypt |
|---|---|---|
| مصرف حافظه | قابل تنظیم بالا (بهبود مقاومت سختافزاری) | bcrypt کم، scrypt قابل تنظیم ولی قدیمیتر |
| امنیت مدرن | طراحیشده پس از رقابت PHC | bcrypt قدیمی ولی اثباتشده، scrypt کمتر متداول |
| پشتیبانی در پایتون | argon2-cffi | bcrypt (bcrypt)، scrypt (خود پایتون یا کتابخانه) |
نکات پیشرفته و توصیههای نهایی
- همیشه Argon2id را بهعنوان گزینهٔ پیشفرض برای هش پسورد انتخاب کنید مگر نیاز خاصی وجود داشته باشد.
- پارامترها را روی سرور هدف بنچمارک کنید؛ اعداد توصیهشده ممکن است برای محیط شما سنگین یا سبک باشند.
- استفاده از secret یا associated data در لایهٔ هش میتواند لایهٔ اضافی امنیتی فراهم کند، اما مدیریت کلید مخفی نیاز به دقت بیشتری دارد.
- از کتابخانههای معتبر و آپدیتشده استفاده کنید و تغییرات امنیتی در مستندات Argon2 را دنبال کنید.
جمعبندی
argon2-cffi یک ابزار قدرتمند و ساده برای پیادهسازی هش امن کلمات عبور در پایتون است. با انتخاب مناسب پارامترها، استفادهٔ درست از متدهای کتابخانه و توجه به موارد عملیاتی (ذخیرهٔ امن، مدیریت خطا، بازهگذاری)، میتوانید امنیت احراز هویت برنامهٔ خود را بهطور قابل توجهی افزایش دهید.
آیا این مطلب برای شما مفید بود ؟




