ما الذي يجعل صيغة التخزين قابلة للاسترداد
أربع صيغ تخزين، مرتبة حسب قابلية الاسترداد:
| الصيغة | قابلة للاسترداد؟ | مثال | طريقة الاسترداد |
|---|---|---|---|
| نص عادي | نعم | password: hunter2 | قراءة الملف |
| Base64 | نعم | cGFzc3dvcmQ= | base64 --decode |
| تشفير عكوس (AES) | نعم | ENC[AES256:...] | فك التشفير باستخدام المفتاح |
| تجزئة أحادية الاتجاه (bcrypt) | لا | $2b$12$... | لا يمكن عكسها؛ يجب استخدام هجوم القوة الغاشمة |
النص الواضح، Base64، والتشفير العكوس: جميعها قابلة للاسترداد. تسريب واحد لقاعدة بيانات بيانات الاعتماد يمنح المهاجم جميع كلمات المرور بنص واضح، لجميع المستخدمين، في وقت واحد. خرق واحد؛ تعرض كامل.
مثال Mailman 2.x
Mailman 2.x (مدير قوائم البريد الإلكتروني من GNU): كان يخزن كلمات مرور المشتركين بنص واضح. رسالة تذكير كلمة المرور الشهرية: ترسل لجميع المشتركين كلمة مرورهم بنص واضح. عيبان منفصلان، كلاهما MOAD-0006:
1. التخزين: نص واضح في قاعدة بيانات القائمة. اختراق الخادم يعرض جميع كلمات مرور المشتركين.
2. البث: البريد الإلكتروني الشهري يرسل كلمة المرور بنص واضح عبر SMTP إلى خادم البريد الإلكتروني للمشترك. ينتقل البريد الإلكتروني بنص واضح عبر عدة قفزات SMTP.
صمّم فريق Mailman كلا السلوكين. كانت الاستعادة هي الميزة: يمكن للمشتركين استرجاع كلمات المرور المنسية. يأتي اسم Glass Safe من هذا: يحتفظ الخزنة ببيانات الاعتماد بشكل مرئي. أي شخص يصل إلى الخزنة يمكنه قراءة جميع المحتويات في وقت واحد.
مبدأ المسروق مسبقًا
بيان الاعتماد المخزن بشكل قابل للاستعادة هو بيان اعتماد مسروق بالفعل. لم يصل المهاجم بعد. لم يحدث الاختراق بعد. لكن البنية تضمن: عند حدوث الاختراق، تسقط جميع بيانات الاعتماد في وقت واحد. لا يحدث الاختراق بشكل منفصل؛ تنتقل كل بيانات الاعتماد في التخزين القابل للاستعادة إلى المهاجم في نفس العملية.
MOAD-0006 مقابل MOAD-0004
MOAD-0004 (السر المسجّل): بيانات الاعتماد المكتوبة في السجلات عن طريق الخطأ. لم تكن كتابة السجل هي النية؛ كانت أثرًا جانبيًا لتفعيل تسجيل الرؤوس لأغراض التصحيح.
MOAD-0006 (Glass Safe): بيانات الاعتماد المخزنة بشكل قابل للاستعادة عن قصد. كانت الاستعادة هي النية. تطلبت ميزة تذكير كلمة المرور تخزين كلمة المرور. تطلبت ميزة عرض كلمة المرور تخزينها. أدى الالتزام المعماري بالاستعادة إلى إنشاء العيب.
التمييز في سطر واحد: MOAD-0004 يضع بيانات الاعتماد في السجلات عن طريق الخطأ؛ MOAD-0006 يخزن بيانات الاعتماد بشكل قابل للاستعادة عن قصد. تعمل الإصلاحات على طبقات مختلفة.
هيكلي مقابل عرضي
يحدد التمييز المعماري بين MOAD-0006 و MOAD-0004 استراتيجية الإصلاح. سجل مكتوب عرضيًا: أصلح طبقة التسلسل. تخزين مصمم للاسترداد: أعد تصميم الميزة التي تطلبت الاسترداد.
لماذا يعمل bcrypt
تقبل دالة التجزئة أحادية الاتجاه كلمة مرور وتنتج ملخصًا بطول ثابت. بالنظر إلى الملخص، لا يمكن استعادة كلمة المرور الأصلية. ليس 'صعب الاستعادة': من المستحيل عكسها. تعمل الدالة في اتجاه واحد فقط.
ثلاث خصائص مطلوبة لتخزين بيانات الاعتماد:
1. أحادية الاتجاه (مقاومة الصورة الأصلية). عند إعطاء hash(password)، لا يوجد خوارزمية تستطيع استعادة password بسرعة أكبر من القوة الغاشمة. bcrypt و scrypt و argon2 جميعها تلبي هذه الخاصية.
2. الملح (Salt). قيمة عشوائية تُضاف إلى كلمة المرور قبل عملية التجزئة. نفس كلمة المرور مع ملح مختلف تنتج تجزئة مختلفة. الغرض: إحباط جداول قوس قزح (قواميس التجزئات المحسوبة مسبقًا). بدون ملح: يحسب المهاجم hash('password123') مرة واحدة ويتحقق من مليون مستخدم في وقت واحد. مع الملح: كل مستخدم لديه تجزئة فريدة حتى لو كانت كلمة المرور نفسها.
3. بطيئة بطبيعتها. يقبل bcrypt عامل عمل (work factor). كلما زاد عامل العمل: زاد عدد التكرارات وزاد وقت الحوسبة لكل محاولة تجزئة. عند تسجيل الدخول: 300 مللي ثانية للتجزئة مرة واحدة. مقبول. عند القوة الغاشمة: 300 مللي ثانية لكل محاولة. عند مليار محاولة: 9.5 سنوات لكل كلمة مرور. غير مقبول للمهاجم. البطء: ميزة وليس عيبًا.
import bcrypt
# التخزين: تجزئة أحادية الاتجاه مع ملح
def store_password(plaintext: str) -> bytes:
return bcrypt.hashpw(plaintext.encode(), bcrypt.gensalt(rounds=12))
# التحقق: تجزئة كلمة المرور المرشحة ومقارنة الملخصات
def verify_password(plaintext: str, stored_hash: bytes) -> bool:
return bcrypt.checkpw(plaintext.encode(), stored_hash)
# NEVER stored: كلمة المرور النصية
# لا يمكن استرجاع النص الأصلي من التجزئة أبدًا
# إعادة تعيين كلمة المرور، وليس تذكير كلمة المرور
المقايضة
تجعل التجزئة أحادية الاتجاه استعادة كلمة المرور مستحيلة. لا يمكن للمستخدم الذي ينسى كلمة مروره الحصول عليها مرة أخرى. لا يمكن وجود بريد إلكتروني لتذكير كلمة المرور. تتغير تجربة المستخدم: "نسيت كلمة المرور؟ أعد تعيينها." ليست تدهورًا: بل حد أمني. النظام الذي لا يستطيع استعادة كلمة المرور لا يستطيع تسريبها.
خرق قاعدة بيانات يكشف تجزئات bcrypt: جميع التجزئات مرئية، ولا كلمات مرور مرئية. يجب على المهاجم مهاجمة كل تجزئة على حدة، بمعدل 300 مللي ثانية لكل محاولة، مع ملح لكل مستخدم يبطل الجداول المحسوبة مسبقًا. أما خرق يكشف كلمات المرور بنص واضح: تعرض فوري كامل.
التشفير القوي غير كافٍ
تحدد مراجعة أمنية نظام تخزين بيانات اعتماد. يتم تخزين كلمات المرور باستخدام تشفير AES-256-CBC مع مفتاح من جانب الخادم. يُصنف تقرير المراجعة هذا كعيب "الخزنة الزجاجية".
يرد فريق الهندسة: 'AES-256 هو أقوى خوارزمية تشفير متماثلة متاحة. يعيش المفتاح في وحدة أمان الأجهزة. لا يستطيع أي مهاجم فك تشفير كلمات المرور هذه.'