طَبِّقْهاتعلّم المبدأ، وطبّقه بيدكمقرر 243 · أمن الويب
الدرس 24 · الوحدة 10: تقنيات التشفير

التوقيع الرقمي وحماية البيانات الحساسة

كيف نثبت أن ملفًا من مصدره ولم يُعبث به، دون إخفائه؟ ⏱ نحو 45 دقيقة.

بعد هذا الدرس ستستطيع أن:
  • تشرح التوقيع الرقمي وعكسه لأدوار المفاتيح.
  • تستخدم التوقيع لضمان سلامة البيانات والتحديثات.
  • تصمّم حماية البيانات الحسّاسة نقلًا وتخزينًا.
  • تطبّق مبدأ تقليل البيانات.

١التوقيع الرقمي: من أرسل، وهل عُبث؟

التشفير يخفي المحتوى، لكن أحيانًا لا نريد إخفاءه بل إثبات مصدره وسلامته علنًا: أن هذا التحديث من الشركة فعلًا، ولم يُعدَّل. هذا التوقيع الرقمي، ويعكس أدوار المفاتيح غير المتماثلة:

التشفير غير المتماثلالتوقيع الرقمي
يوقّع/يشفّر بـالمفتاح العامالمفتاح الخاص (للموقِّع وحده)
يفكّ/يتحقق بـالمفتاح الخاصالمفتاح العام (للجميع)
يحققالسريةالأصل والسلامة وعدم الإنكار

الموقِّع يوقّع ببصمة بياناته بمفتاحه الخاص، والجميع يتحقق بمفتاحه العام. من لا يملك الخاص لا يزوّر توقيعًا، وأي تعديل في البيانات يُفسد التحقق:

const express = require('express');const app = express();app.use(express.json());app.use(express.urlencoded({ extended: false })); app.get('/demo', async (req, res) => {  const { subtle } = globalThis.crypto;  // زوج مفاتيح للتوقيع (في الواقع يُولَّد مرة ويُحفظ المفتاح العام للنشر)  const pair = await subtle.generateKey({ name: 'ECDSA', namedCurve: 'P-256' }, true, ['sign', 'verify']);  const data = new TextEncoder().encode('تحديث رسمي v2');  const sig = await subtle.sign({ name: 'ECDSA', hash: 'SHA-256' }, pair.privateKey, data);   const ok  = await subtle.verify({ name: 'ECDSA', hash: 'SHA-256' }, pair.publicKey, sig, data);  const bad = await subtle.verify({ name: 'ECDSA', hash: 'SHA-256' }, pair.publicKey, sig,    new TextEncoder().encode('تحديث مزوّر'));    // بيانات مختلفة  res.json({ validSignature: ok, tamperedData: bad });}); app.listen(3000);

التوقيع على البيانات الأصلية صحيح (validSignature=true). والتحقق من التوقيع نفسه على بيانات مزوّرة يفشل (tamperedData=false). التوقيع يربط البيانات بموقّعها، ويكشف أي عبث.

٢سلامة البيانات والتحديثات

فئة A08 في OWASP: إخفاقات سلامة البرمجيات والبيانات. الثقة بتحديث أو حزمة أو بيانات دون التحقق من توقيعها تسمح للمهاجم بحقن شيفرة خبيثة. لذلك:

الموضعالحماية بالتوقيع
تحديثات البرامجوقّعها، وتحقق المتلقّي قبل التثبيت
الحزم والمكتباتتحقق من تواقيع المصدر (A06 و A08)
رموز JWTتوقيع يمنع العبث بالمطالبات (الدرس 18)
الوثائق الرسميةتوقيع يثبت المصدر وعدم التعديل

التوقيع يقدّم ما لا يقدّمه التشفير وحده: عدم الإنكار — لا يستطيع الموقِّع إنكار أنه وقّع، لأن أحدًا سواه لا يملك مفتاحه الخاص.

٣حماية البيانات الحساسة

تجمع الدروس في سياسة واحدة للبيانات الحسّاسة (أرقام الهوية، العناوين، سجلّات الدفع):

الحالةالحماية
أثناء النقلTLS (الدرس 20)
أثناء التخزينتشفير متماثل (AES) للحقول الحسّاسة
كلمات المرورتجزئة بـ bcrypt لا تشفير (الدرس 11)
ما لا يلزملا تجمعه ولا تخزّنه أصلًا (تقليل البيانات)

توقّع وتحقّق

التوقيع الرقمي يتم بـ:

التوقيع يقدّم:

كلمات المرور تُحمى بـ:

أقوى حماية للبيانات الحسّاسة:

الخلاصة

تحدٍّ تصميمي: سياسة حماية البيانات

متوسط

يحفظ متجر «رفيق»: كلمات مرور العملاء، وأرقام هويّاتهم، ويتلقّى تحديثات لنظامه من المورّد. ضع سياسة الحماية بملء الحقول.

المطلوب:
  • كيف تُحمى كلمات المرور، ولماذا تختلف عن أرقام الهوية.
  • كيف تُحمى أرقام الهوية أثناء التخزين وأثناء النقل.
  • كيف نضمن أن تحديث المورّد لم يُعبث به، وبأي مفتاح نتحقق.
✓ التحقق الآلي: يفحص المختبر بنية مستندك وصياغته (لا يحكم على جودة الفكرة؛ هذا دور معلمك)
  • كلمات المرور بالتجزئة
  • أرقام الهوية بالتشفير و TLS
  • التحديث بالتوقيع
  • التحقق بالمفتاح العام

💡 تلميح 1
كلمات المرور: تجزئة bcrypt لا تشفير (لا نستعيدها).
💡 تلميح 2
أرقام الهوية: تشفير AES عند التخزين، و TLS عند النقل (نستعيدها).
💡 تلميح 3
التحديث: المورّد يوقّع بالخاص، والمتجر يتحقق بالعام.

نموذج واحد من إجابات كثيرة صحيحة.

حماية كلمات المرور وسببها
تُجزّأ بـ bcrypt البطيئة المملّحة، لا تُشفَّر؛ لأننا لا نحتاج استعادتها بل مقارنتها فقط، والتجزئة أحادية تمنع كشفها إن سُرّبت القاعدة.
حماية أرقام الهوية (تخزين ونقل)
عند التخزين تُشفَّر تشفيرًا متماثلًا (AES) لأننا قد نحتاج استعادتها، وأثناء النقل يحميها TLS من التنصّت والعبث.
ضمان سلامة تحديث المورّد
يوقّع المورّد التحديث بمفتاحه الخاص، ويتحقق المتجر من التوقيع بمفتاح المورّد العام قبل التثبيت؛ فأي عبث يُفسد التحقق.
انتقل إلى تقييم الدرساختيار من متعدد، وصح وخطأ، وأكمل الفراغ، وتتبّع الناتج.ابدأ التقييم ←

📝 معلم؟ أرسل ملاحظة للمؤلف عن هذا الدرس