التوقيعات الرقمية للملفات: إثبات الأصالة والمصدر
تعلم كيف تتحقق التوقيعات الرقمية من أصالة الملفات وتمنع التلاعب. تأكد أن المستلم يعرف من أرسل الملف.
التوقيع الرقمي دليل تشفيري على أن شخصاً أو كياناً بعينه أنشأ ملفاً وأن الملف لم يتغيّر منذ ذلك الحين. من الناحية التقنية، تُجزّئ الملف بـ SHA-256 ثم "توقّع" البصمة بمفتاحك الخاص باستخدام RSA-PSS أو ECDSA أو Ed25519. يستطيع أي شخص يملك مفتاحك العام التحقّق من التوقيع — إن نجح التحقّق، عرف أنك أنت أنشأت الملف وأنه مطابق للبايت لما وقّعته. هذا ما تستخدمه macOS للتحقّق من تحديثات التطبيقات، وما يستخدمه Git لتأليف commits بـ git commit -S، وما يستخدمه PGP للبريد الإلكتروني الموقّع. تحلّ التوقيعات مشكلة يعجز التشفير وحده عن حلّها: إثبات من أرسل ماذا.
التوقيعات مقابل التشفير: مهمتان مختلفتان
التشفير يُخفي المحتوى. التوقيعات تُثبت التأليف والنزاهة. هما مكمّلان لا بديلان.
- تشفير فقط: يعرف المستلم المحتوى لكن لا يعرف من أرسله. كل من يملك المفتاح العام كان يستطيع التشفير.
- توقيع فقط: يعرف المستلم من أرسله وأنه لم يُعبث به، لكن المحتوى مرئي لأي معترض.
- توقيع وتشفير: أصالة كاملة، ونزاهة، وسرية. النمط الافتراضي في PGP.
تُركّز خدمات نقل الملفات عادةً على التشفير. تبرز التوقيعات في السياقات عالية الثقة: توزيع البرامج، والمستندات القانونية، والعقود، وسلاسل الأدلة الجنائية.
كيف يعمل التوقيع فعلياً
تدفق توقيع Ed25519 الأساسي:
- جزّئ الرسالة:
h = SHA-512(message). - احسب قيمة حتمية:
r = SHA-512(private_key_prefix || h). - احسب نقطة التوقيع:
R = r·G(حيث G هي النقطة الأساسية للمنحنى). - احسب
s = r + SHA-512(R || public_key || h)·private_key mod ℓ. - التوقيع هو
(R, s)، 64 بايتاً إجمالاً.
يستخدم التحقّق المفتاحَ العام والرسالةَ والتوقيعَ فقط. إن صحّت الرياضيات، عرف المتحقّق أن التوقيع صدر عمّن يملك المفتاح الخاص المطابق.
يعمل RSA-PSS (PKCS#1 v2.2) وECDSA بشكل مشابه لكن برياضيات مختلفة. Ed25519 مفضّل للأنظمة الجديدة لأنه حتمي ولا يحتاج إلى قيمة عشوائية لكل توقيع قد تُخطئ، وهو أسرع أيضاً.
خوارزميات التوقيع الثلاث الشائعة
| الخوارزمية | حجم المفتاح | حجم التوقيع | السرعة | ملاحظات | |------------|-------------|-------------|--------|----------| | RSA-PSS-2048 | 256 بايت | 256 بايت | ~1000 توقيع/ث | مدعوم على نطاق واسع، توليد مفتاح بطيء | | ECDSA P-256 | 32 بايت | 64 بايت | ~30,000 توقيع/ث | منحنى NIST، يحتاج RNG آمناً لكل توقيع | | Ed25519 | 32 بايت | 64 بايت | ~50,000 توقيع/ث | حتمي، المعيار الحديث |
الثلاثة معتمدة في NIST FIPS 186-5 (2023). Ed25519 هو خيار البروتوكولات الجديدة: WireGuard وSSH (افتراضي منذ OpenSSH 8.0) وSignal وتوقيع Git commits وتوقيع حزم Rust's Cargo.
توقيع الرمز: حالة استخدام بمليارات الدولارات
يعتمد توزيع البرامج على التوقيعات. بدونها، لا يستطيع المستخدمون التمييز بين المُثبِّت الحقيقي والبرمجيات الخبيثة:
- Apple Developer ID + Notarization. جميع تطبيقات macOS يجب توقيعها وتوثيقها منذ Catalina (2019). تستخدم RSA-2048 أو ECDSA P-256.
- Microsoft Authenticode. ملفات Windows التنفيذية موقّعة بشهادات RSA-3072 أو ECDSA P-384.
- Android APK v2/v3. توقيعات Ed25519 على محتوى APK.
- Debian apt وRed Hat dnf ونظيراتها. تستخدم جميعها توقيعات منفصلة — غالباً GPG Ed25519 أو RSA — على قوائم الحزم.
حادثة شهيرة: عام 2020، وُقّع تحديث Orion الخاص بـ SolarWinds بشهادة الشركة الشرعية بعد أن اخترق المهاجمون نظام البناء. التوقيع كان صالحاً — لكنه أثبت فقط أن الرمز صدر من مصدر مخترق. التوقيعات تضمن هوية الموقّع لا حُسن نيّته.
PGP والتوقيعات المنفصلة للملفات
GnuPG (gpg) لا يزال العمود الفقري لتوقيعات الملفات خارج البنية التحتية للمفاتيح المؤسسية. يُبقي التوقيع المنفصل الملف دون تعديل ويضع التوقيع في ملف .sig منفصل:
gpg --detach-sign --armor document.pdf
# ينتج document.pdf.sig
gpg --verify document.pdf.sig document.pdf
# gpg: Good signature from "Alice <alice@example.com>"
ضعف PGP هو توزيع المفاتيح: كيف يعرف المتحقّق أن مفتاح التوقيع ينتمي فعلاً لـ Alice؟ الخيارات تشمل خوادم المفاتيح، وشبكة الثقة، وkeybase.io، أو التحقّق خارج النطاق (بصمة منشورة على بطاقة عمل).
بدائل حديثة: Sigstore (يستخدمه Kubernetes ونظيراتها) يُجري توقيعاً بدون مفاتيح باستخدام رموز هوية OIDC مع سجلّات شفافية. minisign الذي طوّره Frank Denis يوفّر توقيع Ed25519 بسيطاً دون تعقيد PGP.
تجميع التوقيعات بالتجزئة
لمجموعات من الملفات، توقيع كل ملف على حدة غير فعّال. الأفضل: جزّئ كل ملف، ابنِ شجرة Merkle، وقّع على الجذر. الفوائد:
- توقيع واحد يغطّي ملفات كثيرة.
- يمكن التحقّق من كل ملف على حدة مقابل الجذر بـ log(n) بصمات جانبية.
- يستخدمه سجلّات شفافية الشهادات وGit وأدوات سلسلة إمداد البرامج مثل in-toto.
إصدار من 10,000 ملف موقَّع بهذه الطريقة ينتج توقيعاً واحداً وبصمة جذر بـ 32 بايتاً، يمكن التحقّق منها مقابل أي مجموعة فرعية من الملفات.
التوقيت الموثوق: إثبات متى
التوقيع يُثبت من، لكن لا يُثبت متى. مهاجم يسرق مفتاحك الخاص يستطيع تأريخ التوقيعات للخلف. تحلّ هيئات الختم الزمني الموثوق (TSAs) هذا بتوقيع ختم زمني على توقيعك، ما يربطه بلحظة زمنية محددة.
المعايير:
- RFC 3161 للختم الزمني — يستخدمه Microsoft Authenticode وتوقيعات Adobe PDF.
- RFC 5544 (CMS مع ختوم زمنية).
- Roughtime — بروتوكول أحدث من Google لوقت موثّق بزمن استجابة منخفض.
توقيع المستندات القانونية (DocuSign وAdobe Sign والتوقيعات المؤهّلة بموجب eIDAS الأوروبي) يعتمد على ختوم RFC 3161 من هيئات موثوقة لإثبات وقت التوقيع على العقد.
التوقيعات في نقل الملفات
معظم خدمات نقل الملفات الموجّهة للمستهلكين لا تعرض التوقيعات مباشرةً — وسم مصادقة AES-GCM يُثبت النزاهة داخل النقل، وTLS يُثبت هوية الخادم، لكن لا توجد طريقة مدمجة لإثبات هوية المُرسِل.
للنقل عالي الثقة، يحدث التوقيع قبل الرفع:
- يوقّع المُرسِل الملف بـ Ed25519 أو PGP، مُنتجاً
file.extوfile.ext.sig. - يُرفع الملفان إلى أي خدمة نقل (HexaTransfer وSwissTransfer وWeTransfer).
- يُنزّل المستلم كليهما ويتحقّق من التوقيع بالمفتاح العام للمُرسِل.
هذا يفصل الأصالة عن آلية النقل — يمكن اختراق خدمة النقل دون كسر صحة التوقيع، طالما ظلّ المفتاح الخاص للمُرسِل سرياً وامتلك المستلم المفتاح العام الصحيح.
متى تكون التوقيعات مبالغاً فيها
ليس كل ملف يحتاج توقيعاً. تخطّ التوقيعات حين:
- يثق المستلم في قناة النقل من طرف إلى طرف (Signal، أو USB شخصياً).
- المحتوى غير حساس أمنياً (صور اجتماعات، وصفات، مسوّدات مستندات).
- النزاهة وحدها كافية ويوفّرها AES-GCM أو TLS.
أضِف التوقيعات حين:
- تهمّ الحجج القانونية أو التعاقدية (عقود، أدلة قضائية، سجلّات طبية).
- الثقة في سلسلة الإمداد مطلوبة (إصدارات برامج، تحديثات البرامج الثابتة).
- سينتقل الملف عبر وسطاء غير موثوقين.
- تحتاج إلى مسار تدقيق متين يصمد بعد انتهاء النقل الأصلي.
تطبيق ذلك عملياً
لسير عمل بسيط: أنشئ مفتاح Ed25519 بـ ssh-keygen -t ed25519 -f ~/.ssh/signing_key، وقّع ملفاً بـ openssl pkeyutl -sign -inkey signing_key -in file -out file.sig، شارك مفتاحك العام خارج النطاق، وأرسل الملف عبر أي خدمة نقل آمنة. يتحقّق المستلمون بـ openssl pkeyutl -verify.
جرّبها على hexatransfer.com — مجاني، بدون حساب، حتى 10 جيجابايت.
أرسل ملفات كبيرة بأمان مع تشفير من طرف إلى طرف
انقل ملفات حتى 10 جيجابايت مجاناً مع تشفير من طرف إلى طرف. لا حاجة لحساب. يتم تشفير ملفاتك في متصفحك قبل الرفع — لا أحد آخر يستطيع قراءتها.
إرسال ملف