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

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

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

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

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

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

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

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

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

الإجابة:

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

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

الجانب التجزئة التشفير
قابلية العكس اتجاه واحد (لا يمكن استعادة المدخل) اتجاهين (يمكن فك التشفير)
حجم المخرج ثابت (مثل SHA-256 = 256 بت) متغير (يعتمد على المدخل)
حالات الاستخدام تخزين كلمات المرور، السلامة حماية البيانات
أمثلة SHA-256، bcrypt AES-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، bcrypt MD5، SHA1، SHA256
تشفير البيانات AES-256-GCM DES، 3DES، وضع ECB
التوقيعات الرقمية Ed25519، ECDSA P-256 RSA < 2048 بت
اشتقاق المفاتيح HKDF، PBKDF2 التجزئة البسيطة
الأرقام العشوائية وحدة secrets، /dev/urandom وحدة random

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

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

اختبار

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

خذ الاختبار