Skip to content
العودة إلى المدوّنة
الأمن

تحويل MD5 إلى SHA-256؟ لماذا هذا مستحيل وما البديل الصحيح

لا يمكن تحويل بصمة MD5 إلى SHA-256 لأن التجزئة عملية أحادية الاتجاه. تعرّف على ما تفعله صفحات التحويل فعليًا والحل الصحيح لكل حالة. أدوات مجانية.

11 دقائق للقراءة

تحويل MD5 إلى SHA-256؟ لماذا هذا مستحيل وما البديل الصحيح

صفحات كثيرة تَعِد بذلك، وبعضها يبدو كأدوات تعمل فعلاً. العملية التي تروّج لها غير موجودة أصلاً، ومعرفة السبب تغيّر ما ينبغي أن تفعله بعد ذلك.

الجواب المختصر: لا يمكنك تحويل MD5 إلى SHA-256 (ولا SHA-256 إلى MD5)

لا يمكنك تحويل بصمة MD5 إلى SHA-256. ملخّص MD5 هو 128 بت من المخرجات لا تحمل المدخلات التي أنتجتها. وSHA-256 يحتاج تلك المدخلات ليحسب أي شيء على الإطلاق. بدون البيانات الأصلية تبقى الخطوة الوسطى مفقودة، ولا توجد أداة ولا مكتبة تسدّ هذه الفجوة.

إليك المدخلات نفسها تحت ثلاث خوارزميات:

الخوارزميةملخّص helloالأحرف الست عشريةالبتات
MD55d41402abc4b2a76b9719d911017c59232128
SHA-1aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d40160
SHA-2562cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b982464256

انظر إلى الملخّصات الثلاثة كسلاسل نصية. لا تشترك في بادئة ولا في سلسلة جزئية ولا في أي علاقة حسابية. الشيء الوحيد الذي يربطها هو كلمة hello، ولا واحد منها يحملها. احسبها بنفسك عبر مولّد تجزئة MD5 ومولّد SHA-256 إن أردت أن ترى كلاً منهما يتغيّر باستقلال عن الآخر أثناء الكتابة.

والاتجاه لا يغيّر شيئاً. الانتقال من SHA-256 إلى MD5 يفشل للسبب نفسه تماماً: كلتا الدالتين تُتلف المعلومات عن قصد، فلا يمكن إرجاع أي من الملخّصين إلى المدخلات التي تحتاجها الدالة الأخرى.

لكن السؤال العملي يبقى قائماً: لا أحد يبحث عن هذا فضولاً في نظرية التجزئة، فماذا كنت تحاول أن تفعل؟ في الغالب هي واحدة من أربع مهام، ولكل منها إجابة:

  1. التحقق من ملف نزّلته أو مقارنة المجاميع التدقيقية
  2. ترحيل قاعدة بيانات كلمات المرور بعيداً عن MD5
  3. استعادة المدخلات الأصلية وراء بصمة ما
  4. الحصول على البيانات نفسها مجزّأة بخوارزمية مختلفة

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

ما الذي تفعله فعلاً صفحة «محوّل MD5 إلى SHA-256»

الاحتمالات ثلاثة فقط، ولا واحد منها تحويل.

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

وبعضها يبحث عن الملخّص في جدول. تحتفظ الصفحة بجدول من أزواج «المدخلات ← الملخّص» مجموعة من قوائم الكلمات وتسريبات بيانات الاعتماد. الصق ملخّص MD5 تكون مدخلاته موجودة في ذلك الجدول، فتعثر الصفحة على المدخلات، ثم تجزّئها بـ SHA-256 وتعرض لك النتيجة. هذا ينجح مع password و123456 وذيل طويل من السلاسل القصيرة الأخرى. ويفشل بصمت مع أي شيء آخر، ولهذا كثيراً ما تعيد هذه الصفحات نتيجة فارغة بلا تفسير.

والباقي لا يفعل شيئاً على الإطلاق. عدد مفاجئ منها يكتفي بإعادة عرض مدخلاتك، أو يُخرج SHA-256 للسلسلة الست عشرية التي لصقتها موحياً بأنها SHA-256 لبياناتك الأصلية. هاتان القيمتان مختلفتان، وقسم التجزئة المزدوجة أدناه يبيّن مقدار الاختلاف بالضبط.

الاختبار سريع. أعطِ الصفحة سلسلة ست عشرية من 32 حرفاً ولا شيء غيرها، ثم اسأل: هل يمكنها أصلاً أن تعرف المدخلات؟ إن أعادت رغم ذلك نتيجة من 64 حرفاً وسمّت ذلك تحويلاً، فهي إمّا تستعلم من جدول بحث وإمّا تكذب عليك. محوّل التجزئة الذي لا يطلب بياناتك الأصلية أبداً لا سبيل له إلى الصواب إلا بالمصادفة.

تستمر هذه الصياغة لأنها تشبه شيئاً مجاوراً ينجح فعلاً، والخلط بين الاثنين هو أصل المشكلة.

التجزئة والترميز والتشفير: اثنان فقط من الثلاثة قابلان للعكس

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

العمليةمثالقابلة للعكس؟ما تحتاجه
الترميزBase64، الست عشري، ترميز URLنعم، دائماًلا شيء على الإطلاق
التشفيرAES، RSAنعمالمفتاح
التجزئةMD5، SHA-1، SHA-256أبداًلا شيء ينفع

Base64 هو ما يزرع الحدس الخاطئ. يستطيع أي أحد فك ترميز سلسلة Base64 وإرجاعها إلى بايتاتها بلا مفتاح ولا إذن، وتحويل Base64 إلى ست عشري عملية مشروعة يومية. كلاهما مجرد هجاء بديل للبايتات نفسها. ومن رأى ذلك يعمل، يبدو له «MD5 إلى SHA-256» نوعاً من إعادة الهجاء ذاتها.

لكنه ليس كذلك. الترميز يحفظ كل بت من المدخلات، والتشفير يحفظها خلف مفتاح، والتجزئة ترمي أغلبها. ملخّص MD5 هو 16 بايت سواء أطعمته كلمة مرور أم صورة قرص بحجم 40 غيغابايت. الـ 40 غيغابايت لم تذهب إلى مكان ذكي؛ لقد ضاعت. تتناول الأسئلة الشائعة في أداة MD5 المقارنة مع التشفير بتفصيل أكبر إن أردت، لكن النسخة المختصرة تكفي هنا: لا يوجد مفتاح، فلا يوجد ما يُفكّ تشفيره.

«MD5 مكسور» لا تعني «MD5 قابل للعكس»

هنا تخطئ حتى المقالات النزيهة. الناس ينتقلون من «MD5 كُسر منذ سنوات» مباشرة إلى «إذن لا بد أن أحداً صار قادراً على عكسه الآن».

الأمر يتعلق بهجومين مختلفين:

  • هجوم التصادم يجد مدخلين مختلفين يُنتجان الملخّص نفسه. المهاجم يختار كلا المدخلين ولا يهمّه ما هما.
  • هجوم الصورة الأولية (preimage) ينطلق من ملخّص ويستعيد مدخلات تُنتجه. هذا هو الهجوم الذي سيتيح لك تحويل MD5 إلى SHA-256، لأنه سيعيد إليك شيئاً تُغذّي به SHA-256.

سقطت مقاومة MD5 للتصادم في 2004، واليوم يمكن بناء تصادم على عتاد عادي في ثوانٍ. لهذا لا يصلح MD5 للتوقيعات والشهادات وأي شيء يستطيع خصم أن يؤثّر فيه.

أما مقاومة MD5 للصورة الأولية فلم تسقط. أفضل هجوم صورة أولية معروف لا يزال نظرياً، بتعقيد قدره 2^123.4 (Sasaki وAoki، 2009). هذا أسرع من القوة الغاشمة بفارق شعرة، وبعيد المنال بأي هامش له معنى. لا أحد يعكس ملخّصات MD5 اعتباطية، لا في 2004 ولا اليوم.

فالحقيقتان تقفان جنباً إلى جنب بلا تناقض: MD5 مكسور، وMD5 لا يزال غير قابل للعكس. وإن كنت تختار بين الخوارزميتين لنظام جديد بدل محاولة التحويل بينهما، فإن مقارنة MD5 مقابل SHA-256 تعالج ذلك القرار كما يجب.

ما تريده فعلاً: أربع مهام والإجابة الحقيقية لكل منها

ما تفعله في الحقيقةما ينبغي أن تفعله
التحقق من ملف نزّلته أو مقارنة المجاميع التدقيقيةأعد الحساب من الملف بالخوارزمية التي تحتاجها
ترحيل بصمات MD5 لكلمات المرورغلّفها بـ bcrypt ورقِّها عند تسجيل الدخول
استعادة المدخلات الأصليةهذا كسر لا تحويل، ويتوقف على الإنتروبيا
إعادة تجزئة البيانات نفسها بخوارزمية أخرىعُد إلى بايتات المصدر

المهمة 1: تقارن مجاميع تدقيقية أو تتحقق من ملف نزّلته

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

# GNU coreutils
md5sum    ubuntu-24.04-desktop-amd64.iso
sha256sum ubuntu-24.04-desktop-amd64.iso

# macOS
md5           ubuntu-24.04-desktop-amd64.iso
shasum -a 256 ubuntu-24.04-desktop-amd64.iso

التعارض الذي يقع فيه الناس هو ناشر يذكر MD5 فقط بينما تفرض سياستك الأمنية SHA-256. تحويل الـ MD5 المنشور لن يثبت شيئاً حتى لو كان ممكناً، لأن ملخّصاً اشتققته من ملخّص آخر ليس تصريحاً من الناشر عن الملف. ما تحتاجه هو SHA-256 وقّعه الناشر نفسه. وإن لم يوفّر واحداً، فإن حساب SHA-256 خاص بك عبر مولّد SHA-256 يمنحك مع ذلك بصمة ثابتة للاستخدام الداخلي: يمكنك تثبيتها ومقارنتها عبر المرايا واكتشاف التغييرات لاحقاً. لكنها لا تحلّ محل شهادة الناشر.

المهمة 2: ترحّل قاعدة بيانات كلمات المرور بعيداً عن MD5

هذه المهمة الأعلى مخاطرة، ولها حل مجرَّب: غلّف البصمات القديمة، ثم رقِّ كل حساب بشفافية عند تسجيل الدخول. تُطبّق bcrypt على كل بصمة MD5 مخزّنة في مهمّة دفعية واحدة، ومن ثمّ يجزّئ مسار تسجيل الدخول كلمة المرور المُرسَلة بـ MD5 أولاً ثم يقارن الناتج بسجل bcrypt.

تحذير واحد أولاً، لأن كثيراً من النصائح القديمة تقلب هذا رأساً على عقب. تغليف MD5 بـ SHA-256 لا يجعل تخزين كلمات المرور آمناً. SHA-256 تجزئة سريعة، من فئة المشكلة نفسها التي ينتمي إليها MD5، ووحدات GPU تلتهم الاثنتين بمعدلات هائلة. والنصيحة التي تحيلك إلى دالة SHA2() المدمجة في قاعدة البيانات كحلّ تعالج المشكلة الخطأ. الهدف هو تجزئة بطيئة عن قصد: bcrypt أو scrypt أو Argon2. خزّن bcrypt(md5(password))، ولا تخزّن أبداً sha256(md5(password)). تشرح مقارنة bcrypt مقابل Argon2 مقابل scrypt كيف تختار بين الثلاثة، ويتيح لك مولّد bcrypt اختبار عوامل الكلفة قبل أن تلتزم بواحد.

وهنا يكمن ما يكسر عمليات الترحيل: عبارة «MD5 كلمة المرور» ملتبسة، والقراءتان تُنتجان نتائج مختلفة:

const { createHash } = require('node:crypto');

const md5Hex = createHash('md5').update('hello').digest('hex');
const md5Raw = createHash('md5').update('hello').digest();   // the same value as 16 bytes

createHash('sha256').update(md5Hex).digest('hex');
// 4914e23374bb211e3dca0df7636fefffc7fedd94f1340ae81c7d6c07b7113e9b

createHash('sha256').update(md5Raw).digest('hex');
// 88e20f0abb88153e3f0a9683668ccb5b84ed771817dc448a2b73254ed02c8d8c

createHash('sha256').update('hello').digest('hex');
// 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824

ثلاث نتائج، كلها صحيحة، وكلها مختلفة. جزّئ السلسلة الست عشرية ذات 32 حرفاً فتحصل على قيمة؛ جزّئ الـ 16 بايت الخام التي تمثّلها فتحصل على أخرى؛ جزّئ كلمة المرور الأصلية فتحصل على ثالثة. اختر اصطلاحاً، ودوّنه، واستخدم الاصطلاح نفسه في سكربت الترحيل وفي مسار تسجيل الدخول. الخطأ هنا يقفل الباب أمام كل المستخدمين دفعة واحدة، ويبدو العَرَض كأنه خلل في bcrypt لا قرار ترميز.

مع غلاف bcrypt، الست عشري هو الاصطلاح الأسلم. بايتات الملخّص الخام قد تحتوي بايت صفر، وعدة تطبيقات لـ bcrypt تعامل مدخلاتها كسلسلة نصية بنمط لغة C وتتوقف عن القراءة عند ذلك الحد. الست عشري يتجنّب هذا تماماً، وبطول 32 حرفاً يبقى دون حد طول المدخلات في bcrypt بمسافة مريحة. ووحّد حالة الأحرف أيضاً، فـ 5D41402A... و5d41402a... سلسلتان مختلفتان بالنسبة لـ bcrypt رغم أنهما الملخّص نفسه.

const bcrypt = require('bcrypt');
const { createHash } = require('node:crypto');

const legacyDigest = (password) =>
  createHash('md5').update(password, 'utf8').digest('hex');   // lowercase hex

// Batch job, run once: wrap each stored MD5, then drop the old column.
async function wrapRow(row) {
  return bcrypt.hash(row.md5_hash.toLowerCase(), 12);
}

// Login path
async function verify(password, row) {
  if (row.scheme === 'bcrypt') {
    return bcrypt.compare(password, row.hash);
  }
  const ok = await bcrypt.compare(legacyDigest(password), row.hash);
  if (ok) {
    const upgraded = await bcrypt.hash(password, 12);
    await saveCredential(row.id, { scheme: 'bcrypt', hash: upgraded });  // your DB write
  }
  return ok;
}

تنتقل الحسابات إلى bcrypt وحده كلما سجّل أصحابها الدخول. حدّد موعداً نهائياً للمتأخرين وافرض إعادة تعيين بعده.

المهمة 3: تحاول استعادة المدخلات الأصلية

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

السلاسل القصيرة الشائعة التي اختارها بشر تسقط بسرعة. كلمات القاموس، والأسماء المُلحق بها رقم، وكل ما ظهر في مجموعة بيانات مسرّبة يسقط أمام بحث في جدول أو جولة قوة غاشمة قصيرة. أما السلاسل الطويلة العشوائية فلا تسقط أصلاً، والفجوة بين الحالتين ليست مسألة شراء عتاد أكثر.

وجداول قوس قزح تُذكر عادةً بصياغة فضفاضة. جدول قوس قزح يستعيد المدخلات فقط حين تكون تلك المدخلات قد جُزّئت بلا ملح وتكون موجودة أصلاً في الجدول. الشرطان معاً مطلوبان. أضف ملحاً لكل مستخدم يصبح الجدول المحسوب مسبقاً بلا قيمة، لأن المهاجم سيحتاج جدولاً منفصلاً لكل ملح. غذِّ التجزئة برمز عشوائي بطول 128 بت ولن يحتويه أي جدول على وجه الأرض. ويضع دليل إنتروبيا كلمة المرور أرقاماً محدّدة على موضع هذا الحدّ.

إن كانت المدخلات كلمة مرور تخصّك ولا تستطيع إعادة إنتاجها، فتعامل مع الأمر كإعادة تعيين لا كاستعادة. وإن كانت تخصّ شخصاً آخر، فالتوصيف النزيه هو المذكور أعلاه.

المهمة 4: تحتاج البيانات نفسها مجزّأة بخوارزمية مختلفة (md5 to sha1 converter)

الشكل نفسه كالمهمة 1، لكن معمَّماً. زوج الخوارزميات في الطلب لا يهم، لأن الجواب دائماً هو العودة إلى بايتات المصدر وتجزئتها من جديد:

sha1sum   payload.bin
sha256sum payload.bin

كل «md5 to sha1 converter» تجده هو معيد تجزئة أو جدول بحث، للأسباب نفسها المذكورة أعلاه. وإن كانت البيانات الأصلية غير متاحة، فلا حل للمهمة، وهذا ليس قصوراً في الأدوات المتاحة. اختر الخوارزمية الهدف بالاستعانة بـ مقارنة عائلة SHA؛ ومولّد SHA-1 موجود للأنظمة القديمة التي لا تزال تتطلبه، وإن كان يجب ألا يتطلبه أي نظام جديد.

الحالة الوحيدة التي ينجح فيها بحث محوّل التجزئة فعلاً

بعض أصناف البيانات تُجمع مركزياً وتُفهرَس بكل الملخّصات الشائعة دفعة واحدة. عيّنات البرمجيات الخبيثة هي المثال القياسي. خدمات مثل VirusTotal تخزّن العيّنة نفسها، فتكون قد حسبت MD5 وSHA-1 وSHA-256 الخاصة بها من البايتات نفسها وقيّدت الثلاثة تحت سجل واحد. ابحث هناك عن MD5 لعيّنة فتستعيد SHA-256 الخاص بها.

هذا ضمّ (join) في قاعدة بيانات، لا تحويل. ينجح لأن أحداً ما كان يملك الملف الأصلي وجزّأه بكل خوارزمية، وهي بالضبط خطوة إعادة الحساب الموصوفة أعلاه، لكن نفّذها طرف ثالث مسبقاً. الشروط صارمة: يجب أن يكون الكائن موجوداً في الفهرس أصلاً، وعليك أن تثق بمن بناه. وتعتمد فرق استخبارات التهديدات على هذا يومياً. لكنه لا يقول شيئاً عن ملخّصات MD5 اعتباطية، ولن يفيدك أبداً مع بصمة لبياناتك أنت.

الآلية هي نفسها التي تستخدمها صفحات التحويل المشبوهة. الفرق أن مستودع البرمجيات الخبيثة يخبرك أنه بحث في فهرس ويعرض لك السجل.

جرّبه بنفسك

أسرع طريقة لاستيعاب هذا هي أن تراقب ملخّصين للمدخلات نفسها يتغيّران معاً ويبقيان بلا علاقة ببعضهما:

$ printf 'hello' | md5sum
5d41402abc4b2a76b9719d911017c592  -
$ printf 'hello' | sha256sum
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824  -

غيّر حرفاً واحداً فيتغيّر المخرجان تماماً، بطرق لا صلة لإحداهما بالأخرى. الصق النص نفسه في مولّد تجزئة MD5 ومولّد SHA-256 جنباً إلى جنب لتراه حياً، أو استعن بـ مولّد HMAC حين يكون ما تحتاجه فعلاً ملخّصاً بمفتاح لتوقيع طلب API. الثلاثة تعمل بالكامل داخل متصفحك.

الأسئلة الشائعة

هل يمكن تحويل MD5 إلى SHA-256؟

لا. ملخّص MD5 لا يحتوي المدخلات الأصلية، وSHA-256 يحتاج تلك المدخلات لينتج أي شيء. وأي صفحة تدّعي التحويل إمّا تعيد تجزئة نص تزوّدها به وإمّا تبحث عن القيمة في قاعدة بيانات أزواج محسوبة مسبقاً.

لماذا تعرض مواقع كثيرة «محوّل MD5 إلى SHA-256»؟

لأنها تتصدّر نتائج بحث يكتبه الناس. وبمجرد وصولك إليها، إمّا أن تطلب الصفحة نصك الأصلي، وهذا يجعلها إعادة تجزئة لا تحويلاً، وإمّا ألا تعيد شيئاً مفيداً. وتستمر الصياغة لأن المفهوم الخاطئ وراءها شائع.

هل يمكن تحويل SHA-256 عكسياً إلى MD5؟

لا، والاتجاه لا يهم. كلتاهما دالة أحادية الاتجاه، فلا يمكن تحويل أي من الملخّصين إلى الآخر بدون المدخلات الأصلية. والأداة التي تعرض الرحلة العكسية تشغّل حيلة البحث أو إعادة التجزئة نفسها.

MD5 مكسور، أفلا يعني ذلك أنه قابل للعكس؟

لا. سقطت مقاومة MD5 للتصادم في 2004، أي أنه يمكن إجبار مدخلين على تقاسم ملخّص واحد. أما عكس ملخّص فهو هجوم صورة أولية، وأفضل هجوم معروف لا يزال يكلّف 2^123.4 عملية. مكسور للتوقيعات، وما زال غير قابل للعكس.

كيف أرحّل قاعدة بيانات بصمات MD5 لكلمات المرور إلى شيء أكثر أماناً؟

في MySQL، يبدو السطر الواحد UPDATE users SET password = SHA2(password, 256) حلاً بديهياً لكنه خاطئ، لأنه يجزّئ ملخّص MD5 المخزَّن لا كلمة المرور؛ لذا خزّن bcrypt(md5(password)) وتحقّق عبر الغلاف نفسه، مع ترقية كل سجل عند أول تسجيل دخول ناجح. وتغليف MD5 بـ SHA-256 لا يفيد، لأن كلتيهما تجزئة سريعة وتتعامل معهما وحدة GPU بالوتيرة القاسية نفسها.

لماذا أعطتني التجزئة المزدوجة نتيجة مختلفة عمّا توقعت؟

تجزئة سلسلة MD5 الست عشرية وتجزئة بايتاتها الخام الـ 16 تُنتجان مخرجات SHA-256 مختلفة. كلتاهما صحيحة؛ هما ببساطة مدخلات مختلفة. اختر اصطلاحاً واحداً وطبّقه بالطريقة نفسها في سكربت الترحيل وفي مسار تسجيل الدخول.

هل يستطيع جدول قوس قزح استعادة المدخلات وراء بصمة MD5؟

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

هل يوجد محوّل MD5 إلى SHA-1؟

لا. كل ما يسمّي نفسه محوّل MD5 إلى SHA-1 هو معيد تجزئة أو جدول بحث، لأن الخاصية الأحادية الاتجاه نفسها تمنع الانتقال من MD5 إلى SHA-1 تماماً كما تمنعه إلى SHA-256. وإن كانت المدخلات الأصلية بحوزتك، أعد الحساب عبر مولّد SHA-1؛ وبدونها لا شيء ينفع.

الوسوم: md5 sha-256 hashing security checksum cryptography

مقالات ذات صلة

عرض جميع المقالات