أساسيات الأمن وOWASP

أساسيات التشفير للمقابلات

4 دقيقة للقراءة

تظهر أسئلة التشفير في كل مقابلة أمنية تقريباً. يغطي هذا الدرس المفاهيم والمقارنات التي تحتاج لصياغتها بوضوح.

التشفير المتماثل مقابل غير المتماثل

سؤال مقابلة كلاسيكي:

الجانبالمتماثلغير المتماثل
المفاتيحنفس المفتاح يشفر/يفك التشفيرزوج مفتاح عام/خاص
السرعةسريعبطيء (100-1000 مرة أبطأ)
توزيع المفاتيحتحديالمفتاح العام يمكن مشاركته
حالات الاستخدامتشفير البيانات بالجملةتبادل المفاتيح، التوقيعات
أمثلةAES، ChaCha20RSA، ECC، Ed25519

سؤال المقابلة

س: "متى تستخدم التشفير المتماثل مقابل غير المتماثل؟"

الإجابة:

  • غير المتماثل: تبادل المفاتيح الأولي، التوقيعات الرقمية، مصافحة TLS
  • المتماثل: تشفير البيانات الفعلية بعد تبادل المفاتيح
  • النهج الهجين: TLS يستخدم غير المتماثل لتبادل مفاتيح الجلسة المتماثلة

التجزئة مقابل التشفير

الجانبالتجزئةالتشفير
قابلية العكساتجاه واحد (لا يمكن استعادة المدخل)اتجاهين (يمكن فك التشفير)
حجم المخرجثابت (مثل SHA-256 = 256 بت)متغير (يعتمد على المدخل)
حالات الاستخدامتخزين كلمات المرور، السلامةحماية البيانات
أمثلةSHA-256، bcryptAES-256-GCM
# التجزئة (اتجاه واحد)
import hashlib
hash_value = hashlib.sha256(b"data").hexdigest()

# التشفير (اتجاهين)
from cryptography.fernet import Fernet
key = Fernet.generate_key()
cipher = Fernet(key)
encrypted = cipher.encrypt(b"data")
decrypted = cipher.decrypt(encrypted)  # يمكن استعادة الأصلي

تعمق TLS/SSL

مفضل المقابلة: "اشرح مصافحة TLS."

مصافحة TLS 1.3 (مبسطة)

العميل                                الخادم
  |                                     |
  |-------- ClientHello --------------->|  (1) الإصدارات المدعومة، مجموعات التشفير
  |                                     |
  |<------- ServerHello ----------------|  (2) الإصدار المختار، مجموعة التشفير
  |<------- Certificate ----------------|  (3) شهادة الخادم
  |<------- CertificateVerify ----------|  (4) توقيع يثبت ملكية المفتاح
  |<------- Finished -------------------|  (5) MAC المصافحة
  |                                     |
  |-------- Finished ------------------>|  (6) MAC مصافحة العميل
  |                                     |
  |<======= Application Data ==========>|  (7) الاتصال المشفر

النقاط الرئيسية للمقابلات

  1. TLS 1.3 هو المعيار الحالي (TLS 1.2 لا يزال مقبولاً)
  2. مصافحة 1-RTT في TLS 1.3 (كانت 2-RTT في 1.2)
  3. استئناف 0-RTT ممكن لكن له مخاطر إعادة التشغيل
  4. السرية التامة للأمام عبر مفاتيح مؤقتة
  5. تثبيت الشهادة يمنع MITM مع CAs المارقة

تخزين كلمات المرور

لا تخزن أبداً كلمات المرور بنص واضح أو تجزئات بسيطة.

الخوارزميات الموصى بها

الخوارزميةملاحظاتالمعاملات
Argon2idالفائز بـ PHC، موصى بهالذاكرة: 64MB، التكرارات: 3، التوازي: 4
bcryptمدعوم على نطاق واسععامل التكلفة: 12+
scryptصعب على الذاكرةN=2^14، r=8، p=1

كود المقابلة

# تجزئة كلمات المرور الحديثة مع Argon2
from argon2 import PasswordHasher

ph = PasswordHasher(
    time_cost=3,          # عدد التكرارات
    memory_cost=65536,    # استخدام ذاكرة 64 MB
    parallelism=4,        # 4 خيوط متوازية
    hash_len=32,          # طول المخرج
    salt_len=16           # طول الملح
)

# تجزئة كلمة المرور
hashed = ph.hash("user_password")

# التحقق من كلمة المرور
try:
    ph.verify(hashed, "user_password")
    # كلمة المرور صحيحة
except argon2.exceptions.VerifyMismatchError:
    # كلمة المرور غير صحيحة

إدارة المفاتيح

سيناريو المقابلة: "أين ستخزن مفاتيح التشفير؟"

تسلسل تخزين المفاتيح

المستوىالحلحالة الاستخدام
التطويرمتغيرات البيئةالاختبار المحلي فقط
الإنتاجمدير الأسرار (AWS، Vault)أسرار التطبيق
الأمان العاليHSM (وحدة أمان الأجهزة)المفاتيح الرئيسية، مفاتيح التوقيع

تدوير المفاتيح

# نمط تدوير المفاتيح
class KeyManager:
    def __init__(self, secrets_client):
        self.current_key_id = "key-v2"
        self.previous_key_ids = ["key-v1"]

    def encrypt(self, data):
        key = self.get_key(self.current_key_id)
        return encrypt_with_key(data, key, self.current_key_id)

    def decrypt(self, encrypted_data, key_id):
        # دعم فك التشفير بالمفاتيح القديمة أثناء التدوير
        if key_id == self.current_key_id or key_id in self.previous_key_ids:
            key = self.get_key(key_id)
            return decrypt_with_key(encrypted_data, key)
        raise KeyNotFoundError(f"Unknown key: {key_id}")

مرجع سريع: اختيار الخوارزمية

الغرضموصى بهتجنب
كلمات المرورArgon2id، bcryptMD5، SHA1، SHA256
تشفير البياناتAES-256-GCMDES، 3DES، وضع ECB
التوقيعات الرقميةEd25519، ECDSA P-256RSA < 2048 بت
اشتقاق المفاتيحHKDF، PBKDF2التجزئة البسيطة
الأرقام العشوائيةوحدة secrets، /dev/urandomوحدة random

نصيحة المقابلة: عند سؤالك عن خيارات التشفير، اذكر دائماً الخوارزمية المحددة والمعاملات. "سأستخدم bcrypt" جيد؛ "سأستخدم bcrypt مع عامل تكلفة 12 أو أعلى" أفضل بكثير.

في الوحدة التالية، سنغطي أمان التطبيقات بما في ذلك مراجعة الكود الآمن ونمذجة التهديدات. :::

مراجعة سريعة: كيف تجد هذا الدرس؟

اختبار

الوحدة 2: أساسيات الأمن وOWASP

خذ الاختبار
نشرة أسبوعية مجانية

ابقَ على مسار النيرد

بريد واحد أسبوعياً — دورات، مقالات معمّقة، أدوات، وتجارب ذكاء اصطناعي.

بدون إزعاج. إلغاء الاشتراك في أي وقت.