Argon2-cffi: تشفير آمن لكلمات المرور في Python

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

ما هي مكتبة argon2-cffi

مكتبة argon2-cffi هي الغلاف الرسمي للغة Python لخوارزمية تشفير كلمات المرور Argon2، ويتم تنفيذها عبر واجهة CFFI (واجهة الدوال الأجنبية للغة C). Argon2 هي خوارزمية حديثة لتشفير كلمات المرور، فازت في مسابقة Password Hashing Competition عام 2015، وتُعتبر منذ ذلك الحين المعيار الذهبي للتخزين الآمن لكلمات المرور.

الميزة الرئيسية لـ argon2-cffi هي أنها توفر أداءً عاليًا بفضل تنفيذها بلغة C، مع توفير واجهة Python سهلة الاستخدام. المكتبة مدعومة بنشاط من قبل المجتمع ويتم تحديثها بانتظام وفقًا لأحدث معايير الأمان.

التثبيت والإعداد

التثبيت القياسي

pip install argon2-cffi

التثبيت مع التبعيات الإضافية

pip install argon2-cffi[dev]  # للتطوير
pip install argon2-cffi[tests]  # للاختبار

التحقق من التثبيت

import argon2
print(argon2.__version__)

أنواع خوارزمية Argon2

Argon2i (مستقل عن البيانات)

Argon2i مُحسّن للحماية من هجمات القنوات الجانبية (side-channel attacks). يصل إلى الذاكرة بشكل مستقل عن محتوى كلمة المرور، مما يجعله مقاومًا لهجمات وقت التنفيذ. يُوصى به في السيناريوهات التي تكون فيها الحماية من تحليل وقت التنفيذ مهمة.

Argon2d (معتمد على البيانات)

يوفر Argon2d أقصى حماية ضد هجمات GPU والهجمات باستخدام الأجهزة المتخصصة. يستخدم وصولاً إلى الذاكرة يعتمد على البيانات، مما يصعّب موازاة الهجمات. لكنه أقل حماية من هجمات القنوات الجانبية.

Argon2id (هجين)

Argon2id هو الوضع الهجين الذي يجمع مزايا كلا النوعين. يُستخدم افتراضيًا في argon2-cffi ويُوصى به لمعظم التطبيقات. يتم تنفيذ التمريرات الأولى كـ Argon2i، والباقي كـ Argon2d.

بداية سريعة

الاستخدام الأساسي

from argon2 import PasswordHasher

# إنشاء كائن التشفير
ph = PasswordHasher()

# تشفير كلمة المرور
password = "كلمة_المرور_الفائقة_السرية"
hash_result = ph.hash(password)
print(f"التشفير: {hash_result}")

# التحقق من كلمة المرور
try:
    ph.verify(hash_result, password)
    print("كلمة المرور صحيحة!")
except Exception as e:
    print(f"كلمة المرور خاطئة: {e}")

العمل مع أنواع بيانات مختلفة

from argon2 import PasswordHasher

ph = PasswordHasher()

# تشفير سلسلة نصية
string_hash = ph.hash("كلمة_مرور_نصية")

# تشفير بايتات
bytes_password = b"bytes_password"
bytes_hash = ph.hash(bytes_password)

# التحقق
ph.verify(string_hash, "كلمة_مرور_نصية")
ph.verify(bytes_hash, bytes_password)

إعدادات PasswordHasher

معاملات المُنشئ

from argon2 import PasswordHasher, Type

ph = PasswordHasher(
    time_cost=3,        # عدد التكرارات (الافتراضي 2)
    memory_cost=65536,  # حجم الذاكرة بالكيلوبايت (الافتراضي 51200)
    parallelism=2,      # عدد الخيوط (الافتراضي 1)
    hash_len=32,        # طول التشفير بالبايت (الافتراضي 32)
    salt_len=16,        # طول الملح بالبايت (الافتراضي 16)
    encoding="utf-8",   # الترميز (الافتراضي "utf-8")
    type=Type.ID        # نوع Argon2 (الافتراضي Type.ID)
)

تأثير المعاملات على الأمان

time_cost يزيد وقت التنفيذ خطيًا. كل زيادة بمقدار 1 تضاعف وقت التشفير.

memory_cost يحدد حجم الذاكرة بالكيلوبايت. القيم الكبيرة تصعّب الهجمات باستخدام الأجهزة المتخصصة.

توصيات