ویژگی تصویر

آشنایی با کتابخانه argon2-cffi در پایتون

  /  پایتون   /  کتابخانه 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

ویژگیArgon2bcrypt / scrypt
مصرف حافظهقابل تنظیم بالا (بهبود مقاومت سخت‌افزاری)bcrypt کم، scrypt قابل تنظیم ولی قدیمی‌تر
امنیت مدرنطراحی‌شده پس از رقابت PHCbcrypt قدیمی ولی اثبات‌شده، scrypt کمتر متداول
پشتیبانی در پایتونargon2-cffibcrypt (bcrypt)، scrypt (خود پایتون یا کتابخانه)

نکات پیشرفته و توصیه‌های نهایی

  • همیشه Argon2id را به‌عنوان گزینهٔ پیش‌فرض برای هش پسورد انتخاب کنید مگر نیاز خاصی وجود داشته باشد.
  • پارامترها را روی سرور هدف بنچمارک کنید؛ اعداد توصیه‌شده ممکن است برای محیط شما سنگین یا سبک باشند.
  • استفاده از secret یا associated data در لایهٔ هش می‌تواند لایهٔ اضافی امنیتی فراهم کند، اما مدیریت کلید مخفی نیاز به دقت بیشتری دارد.
  • از کتابخانه‌های معتبر و آپدیت‌شده استفاده کنید و تغییرات امنیتی در مستندات Argon2 را دنبال کنید.

جمع‌بندی

argon2-cffi یک ابزار قدرتمند و ساده برای پیاده‌سازی هش امن کلمات عبور در پایتون است. با انتخاب مناسب پارامترها، استفادهٔ درست از متدهای کتابخانه و توجه به موارد عملیاتی (ذخیرهٔ امن، مدیریت خطا، بازه‌گذاری)، می‌توانید امنیت احراز هویت برنامهٔ خود را به‌طور قابل توجهی افزایش دهید.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: