حين يخبرك موقع أن كلمة مرورك تحتاج ثلاثة ملايين سنة لتُكسر، فهو يحذف الجزء المهم من الجملة. السؤال الصحيح ليس كم تستغرق. السؤال هو كم تستغرق في مواجهة ماذا.
والجواب عن في مواجهة ماذا لست أنت من يقرره. قرره مطوّر في المتجر الذي اشتريت منه حذاءً رياضيًا سنة 2019، يوم اختار كيف يخزّن كلمة مرورك في قاعدة بياناته. أنت كتبت السلسلة نفسها، عشرين حرفًا، في الموقعين. في أحدهما تصمد قرونًا، وفي الآخر تسقط قبل أن يبرد فنجان القهوة.
الرقم الغائب من المعادلة
هجوم القوة الغاشمة حساب ابتدائي: عدد الاحتمالات التي يجب تجريبها، مقسومًا على عدد الاحتمالات التي يمكن تجريبها في الثانية. العامل الأول يتعلق بكلمة مرورك — طولها، أبجديتها، ووجودها في قاموس من عدمه. أما العامل الثاني فـلا علاقة له بك إطلاقًا.
العامل الثاني يتعلق بأمرين: عتاد المهاجم، وقبل ذلك كله الدالة التي حوّل بها الموقع كلمة مرورك إلى الطلسم المخزّن في جدول المستخدمين. تُسمى هذه الدالة hash، وليست كلها متساوية في كلفة الحساب.
صُمّمت MD5 وSHA-1 لتكونا سريعتين. وهذه فضيلة لا عيب: فهما دالتا hash لأغراض عامة، وُضعتا لتلخيص الرسائل والتحقق من السلامة، والمطلوب هناك أن تُعالِج جيغابايت كاملًا قبل أن تلحق بإعداد الشاي. لكن حين يستخدمهما أحدهم لتخزين كلمات المرور، تنقلب الفضيلة إلى المشكلة. الدالة التي تستطيع حسابها ملايين المرات في الثانية هي دالة يستطيع المهاجم أيضًا حسابها ملايين المرات في الثانية — وعنده كروت شاشة وعطلة نهاية أسبوع بكاملها.
أما bcrypt وArgon2 فصُمّمتا للغرض المعاكس. بطيئتان عن عمد، و— وهنا موضع الأناقة — ببطء قابل للمعايرة. قدّم Niels Provos وDavid Mazières خوارزمية bcrypt سنة 1999 بعنوان يقول كل شيء: A Future-Adaptable Password Scheme. الفكرة أن تزداد الدالة غلاءً مع مرور السنين، بنفس الوتيرة التي يرخص بها العتاد. وArgon2، الفائزة بـPassword Hashing Competition سنة 2015، أضافت لفّة أخرى: لا تكلّف وقتًا فحسب، بل تكلّف ذاكرة، وهي بالضبط ما تجود به كروت الشاشة بأقل سخاء.
بين hash سريعة وhash بطيئة مضبوطة جيدًا لا يوجد فرق بالنسب المئوية. توجد مراتب من حيث الحجم. كثيرة.
الاختبارات المرجعية موجودة، وهي علنية
لا شيء من هذا تكهّن. Hashcat، الأداة التي يكسر بها نصف العالم كلمات المرور — والطيبون منهم أيضًا — تأتي بوضع benchmark يستطيع أي أحد تشغيله على جهازه، ويقيس، خوارزمية خوارزمية، كم مرة في الثانية يمكن حساب كل واحدة. والمجتمع ينشر تلك الجداول كلما صدر كرت شاشة جديد.
المثير في هذه الجداول ليس رقمًا بعينه — فهو ينتهي صلاحيةً مع كل جيل من العتاد — بل المسافة بين الصفوف. ترتّب القائمة حسب السرعة، فترى MD5 في القمة، على كوكب خاص بها. تنزل وتنزل، وفي قاع الجدول تجد bcrypt وArgon2 بأرقام لا تشبه ما فوقها في شيء. إنها كلمة المرور نفسها. إنه كرت الشاشة نفسه. الشيء الوحيد الذي تغيّر هو كيف قرر الموقع تخزينها.
لهذا فإن ”ثلاثة ملايين سنة“ دون ذكر أي hash دعايةٌ لا قياس. أشبه بمن يعلن أن سيارته تصل خلال ست ساعات دون أن يذكر الوجهة.
Offline وonline: عالمان لا يلتقيان
هناك تمييز ثانٍ لا يكاد أحد يشرحه، وهو يقلب النتيجة بالقسوة نفسها.
في هجوم online، يجرّب المهاجم كلمات المرور على نموذج تسجيل الدخول، كما يفعل أي مستخدم. الإيقاع لا يحدده عتاده: يحدده الخادم. قد يكون هناك حد للمحاولات، أو حظر مؤقت، أو captcha، أو تأخير بين الطلبات، أو تنبيهات عند رصد ألف محاولة فاشلة من العنوان نفسه. أمام موقع مدافَع عنه دفاعًا محترمًا، الهجوم online بطيء وصاخب وأحمق إلى حد بعيد. الحساب سيئ للمهاجم إلى درجة أن القوة الغاشمة الصرفة لا تكاد تُجرَّب: تُجرَّب كلمات المرور الأربع المعتادة على ملايين الحسابات، وتلك لعبة أخرى.
في هجوم offline، يكون المهاجم قد حصل على نسخة قاعدة البيانات. يأخذها إلى بيته. هناك لا خادم ولا حد للمحاولات ولا أحد يراقب: هناك كروت شاشته وفاتورة كهربائه. يستطيع أن يجرّب شهورًا دون أن يشعر به أحد، وسيعرف بنفسه أنه أصاب، بمقارنة الـ hashes. هنا يقرر الـ hash كل شيء، لأن الـ hash هو حرفيًا الشيء الوحيد الذي يبطّئه.
ويحسن أن نكون صادقين بشأن الاحتمالات: سيناريو offline ليس نادرًا ولا غريبًا. هو ما يحدث في كل مرة تتسرب فيها قاعدة بيانات. حين فقدت LinkedIn قاعدتها سنة 2012، أظهر تحليل النسخة المسرَّبة أنها كانت تخزّن كلمات المرور بـSHA-1 بلا ملح: hash سريع، ودون المكوّن الذي يمنع حساب الجداول مسبقًا. أن يُكسر هذا العدد وبهذه السرعة لم يكن فقط لأن المستخدمين اختاروا اختيارًا سيئًا. كان قبل كل شيء قرارًا هندسيًا لم يره أي مستخدم قط.
ما نفعله هنا، ولماذا نقوله
مدقّقنا يفترض 10¹² محاولة في الثانية، offline، ضد hash سريع. هذا مكتوب في الصفحة نفسها، تحت النتيجة، ولا لغرض الشفافية الزخرفية: بدون هذه المعلومة، الوقت الذي يعرضه لك لا يعني شيئًا.
إنه الحالة السيئة عن قصد. نفترض أن قاعدة البيانات مسرَّبة أصلًا، وأن المهاجم يملك عتادًا جادًا، وأن الموقع خزّن كلمة مرورك بأسوأ طريقة معقولة ممكنة، وأنه يعرف فوق ذلك أبجديتك وطولك. لو استخدم الموقع bcrypt مضبوطًا جيدًا، يرتفع الرقم الحقيقي مراتبَ كثيرة من حيث الحجم، وتصمد كلمة مرورك أكثر بكثير مما نقول لك.
نفضّل أن نخطئ في هذا الاتجاه. المدقّق الذي يهنّئك إنما يهنّئ نفسه.
الخلاصة المزعجة
كلمة مرورك ليس لها زمن كسر واحد. لها زمن كسر عن كل موقع استخدمتها فيه، وهذا الزمن يحدده أناس لا تعرفهم بمعايير لا ينشرونها.
ومن ذلك ينتج أمران، وهما المعتادان. الأول: بما أنك لا تتحكم في الـ hash، تحكّم في الإنتروبيا، فهي نصف المعادلة الذي يخصك — ولهذا يعرض لك المولّد بتات لا نسبة مئوية لطيفة. والثاني، وهو الأهم: إذا كان لكل موقع كلمة مروره الخاصة، فمن خزّنها بـMD5 لا يستطيع أن يهدي إلا كلمة ذلك الموقع.
لأن الحلقة الأضعف ليست كلمة مرورك. هي أسوأ موقع كتبتها فيه.
المصادر: الاختبارات المرجعية العلنية لـhashcat (hashcat -b)، متاحة للاطلاع وقابلة للتكرار · N. Provos وD. Mazières، «A Future-Adaptable Password Scheme»، USENIX، 1999 · Password Hashing Competition، فازت بها Argon2 سنة 2015 · نموذج التهديد المعلَن في مدقّق password.es: 10¹² محاولة/ث، offline، hash سريع · اختراق LinkedIn سنة 2012: أكدت الشركة التسريب، وثبت استخدام SHA-1 بلا ملح عند تحليل النسخة المنشورة.