ما الذي يجعل تنسيق التخزين قابلًا للاسترجاع؟
أربعة تنسيقات تخزين، مرتبة حسب قابلية الاسترجاع:
| التنسيق | قابل للاسترجاع؟ | مثال | طريقة الاسترجاع |
|--------|-------------|---------|-----------------|
| نصي | نعم | password: hunter2 | قراءة الملف |
| Base64 | نعم | cGFzc3dvcmQ= | base64 --decode |
| تشفير قابل للعكس (AES) | نعم | ENC[AES256:...] | فك التشفير باستخدام المفتاح |
| حشو واحد الاتجاه (bcrypt) | لا | $2b$12$... | لا يمكن عكسها؛ يجب اختبارها عن طريق القوة |
النصي، Base64، وتشفير قابل للعكس: جميعها قابلة للاسترجاع. يمنح كشف ملف بيانات واحد المهاجم جميع كلمات المرور النصية، لكل مستخدم، في نفس الوقت. إخفاق واحد؛ كشف شامل.
مثال Mailman 2.x
Mailman 2.x (مدير قوائم البريد الإلكتروني GNU): احتفظت بتخزين كلمات المرور الخاصة بالقوائم في تنسيق نصي. إعادة تذكير كلمة المرور شهريًا: أرسل جميع مشتركي القائمة كلمتهم المرور النصية. كان هناك نقصانان separable، كلاهما MOAD-0006:
1. تخزين: تنسيق نصي في قاعدة بيانات القائمة. إختراق الخادم يكشف جميع كلمات المرور الخاصة بمشترك القائمة.
2. البث: يرسل البريد الإلكتروني شهريًا كلمة المرور النصية عبر SMTP إلى خادم البريد الإلكتروني الخاص بمشترك القائمة. يتنقل البريد الإلكتروني في تنسيق نصي عبر عدة hops SMTP.
فريق Mailman صمم كلا من هذه السلوكيات. كان الاسترجاع الميزة: يمكن للناشطين استعادة كلمات المرور المنسوخة. تأتي تسمية صندوق الزجاج من هذا: يحمل الصندوق كلمات المرور في شكل مرئي. يمكن لأي شخص الذي يصل إلى الصندوق قراءة محتوياته جميعًا في نفس الوقت.
المبدأ المسبق بالفعل
تخزين كلمة مرور في شكل قابل للاسترجاع يعني أن الكلمة قد تم سرقتها بالفعل. لم يصل المهاجم بعد. لم يحدث الاختراق بعد. لكن التصميم يضمن: عند حدوث اختراق، سينزلق جميع الكلمات المرور في نفس الوقت. لا يحدث الاختراق في孤ًا؛ كل كلمة مرور في التخزين القابل للبحث تنتقل إلى المهاجم في نفس العملية.
MOAD-0006 مقابل MOAD-0004
MOAD-0004 (Logged Secret): كلمات المرور مكتوبة في السجلات بشكل عشوائي. لم يكن كتابة السجل هو الهدف؛ كان ذلك تأثير الجانبي لتمكين التسجيل الرأسوي للبحث.
MOAD-0006 (Glass Safe): كلمات المرور مخزنة في شكل قابل للبحث بواسطة التصميم. كان الاسترجاع هو الهدف. كانت الميزة تذكير كلمة المرور. كانت الميزة عرض كلمة المرور. الالتزام المعماري بالاسترجاع خلق العيوب.
One-line distinction: MOAD-0004 puts credentials in logs by accident; MOAD-0006 stores credentials in recoverable form on purpose. The fixes operate at different layers.
الاختلاف الهيكلي مقابل العرض غير المتعمد
الفرق المعماري بين MOAD-0006 و MOAD-0004 يحدد استراتيجية الصيانة. كتابة محتوى سجل عشوائي: تصحيح طبقة الترميز. تخزين مخزن للاسترداد: إعادة تصميم الميزة التي تتطلب الاسترداد.
لماذا يعمل bcrypt
دالة الترميز في اتجاه واحد تقبل كلمة مرور وتصدر مخزن ثابت الطول. مع وجود المخزن، لا يمكن استعادة الكلمة المرور. ليس 'صعب الاسترداد': لا يمكن العكس. الدالة تعمل في اتجاه واحد فقط.
ثلاثة خصائص مطلوبة لتخزين بيانات الاعتماد:
1. اتجاه واحد (مقاومة الصورة الأصلية). مع hash(password), لا يمكن استرداد password أسرع من محاولة القوة المباشرة. bcrypt، scrypt، & argon2 كلها تفي بهذه الخاصية.
2. ملح. قيمة عشوائية مسبقة إلى كلمة المرور قبل الترميز. نفس الكلمة المرور، ملح مختلف، مخزن مختلف. الغرض: إبطال جدول قيم المخزنات (precomputed hash dictionaries). بدون ملح: يحتسب المهاجم hash('password123') مرة واحدة ويراقب جميع المستخدمين 1 مليون مرة. مع الملح: لكل مستخدم مخزن فريد حتى لو كانت كلمة المرور متطابقة.
3. Slow by design. bcrypt accepts a work factor. Higher work factor: more iterations, more compute time per hash attempt. Login: 300ms to hash once. Acceptable. Brute-force: 300ms per attempt. At 1 billion attempts: 9.5 years per password. Unacceptable for an attacker. The slowness: a feature, not a defect.
import bcrypt
# Store: one-way hash with salt
def store_password(plaintext: str) -> bytes:
return bcrypt.hashpw(plaintext.encode(), bcrypt.gensalt(rounds=12))
# Verify: hash the candidate & compare digests
def verify_password(plaintext: str, stored_hash: bytes) -> bool:
return bcrypt.checkpw(plaintext.encode(), stored_hash)
# NEVER stored: the plaintext password
# NEVER recovered: the plaintext from the hash
# Password reset, not password reminder
The Tradeoff
One-way hashing makes password recovery impossible. A user who forgets their password cannot receive it back. A password reminder email cannot exist. The user experience changes: 'forgot your password? reset it.' Not a degradation: a security boundary. The system that cannot recover a password cannot leak a password.
A database breach that exposes bcrypt hashes: all hashes visible, no passwords visible. An attacker must brute-force each hash individually, at 300ms per attempt, with per-user salt defeating precomputed tables. A breach that exposes plaintext passwords: total immediate exposure.
Strong Encryption Is Not Enough
A security audit identifies a credential storage system. Passwords are stored using AES-256-CBC encryption with a server-side key. The audit report flags it as a Glass Safe defect.
The engineering team responds: 'AES-256 is the strongest symmetric cipher available. The key lives in a hardware security module. No attacker can decrypt these passwords.'