أساسيات الأمن و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) الاتصال المشفر
النقاط الرئيسية للمقابلات
- TLS 1.3 هو المعيار الحالي (TLS 1.2 لا يزال مقبولاً)
- مصافحة 1-RTT في TLS 1.3 (كانت 2-RTT في 1.2)
- استئناف 0-RTT ممكن لكن له مخاطر إعادة التشغيل
- السرية التامة للأمام عبر مفاتيح مؤقتة
- تثبيت الشهادة يمنع 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 أو أعلى" أفضل بكثير.
في الوحدة التالية، سنغطي أمان التطبيقات بما في ذلك مراجعة الكود الآمن ونمذجة التهديدات. :::