Hash وملح وbcrypt وArgon2: ماذا يفعل الموقع المحترم بكلمة مرورك

نُشر في بقلم David Carrero

الموقع المحترم لا يعرف كلمة مرورك. لا لأنه لا يريد: بل لأنه لا يستطيع.

يبدو الأمر حيلة، فأنت تكتبها في كل مرة فيدعك النظام تدخل، ولكي يدعك تدخل عليه أن يتحقق من شيء. لكن التحقق ليس معرفة. الخادم يحتفظ بـبصمة محسوبة انطلاقًا من كلمة مرورك؛ وحين تكتبها، يعيد حساب البصمة ويقارن. تطابقتا؟ تفضّل. ولا لحظة واحدة يحتاج الأمر إلى أن تكون كلمة المرور مكتوبة في أي مكان.

من هنا تخرج أوضح علامة تميّز خدمة جادة من أخرى ليست كذلك: إن نسيتها فأرسلوها إليك في بريد، فهم كانوا يحتفظون بها. وما يُحتفَظ به ينتهي، عاجلًا أو آجلًا، في يد أحد آخر.

1979 فكرة ألا نخزّنها — وفكرة أن نفعل ذلك ببطء

سنة 1979، نشر Robert Morris وKen Thompson في Communications of the ACM ورقة «Password Security: A Case History»، يرويان فيها ما صنعاه في Unix. هي حكاية ما تعلّماه، وفيها ترسّخت فكرتان نعدّهما اليوم من البديهيات.

الأولى لم يخترعاها — تخزين الـ hash بدل كلمة المرور كان معمولًا به من قبل — لكنهما شرحاها خيرًا من أي أحد: لا تخزّن كلمة المرور، خزّن الـ hash الخاص بها. دالة تحوّل كلمة مرورك إلى قيمة تبدو اعتباطية، ولا سبيل إلى العودة على الطريق: من الـ hash لا تعود إلى كلمة المرور.

أما الثانية فهي لهما فعلًا: الملح. قيمة عشوائية مختلفة لكل مستخدم، تُمزج بكلمة المرور قبل حساب الـ hash. بلا ملح، يحصل شخصان لهما كلمة المرور نفسها على الـ hash نفسه — فيصير الملف المسروق لعبة بحث عن المتكرر — والأدهى أن بوسع أحدهم أن يحسب مسبقًا جدولًا هائلًا مرة واحدة ويستخدمه ضد قواعد بيانات الدنيا كلها. الملح لا يجعل كلمة مرورك أصعب تخمينًا: يجعل تخمينها لا ينفع أحدًا آخر.

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

القضية كلها هناك، في جملة عمرها نصف قرن تقريبًا.

لماذا البطء هو الدفاع النزيه الوحيد

دفاعات المعلوماتية كلها تقريبًا غير متناظرة: تكلّف المدافع قليلًا والمهاجم كثيرًا. التشفير رخيص؛ وفك التشفير بلا مفتاح غير ممكن عمليًا. المدافع يلعب بأفضلية بنيوية.

تخزين كلمات المرور لا. هنا ينفّذ المدافع والمهاجم الدالة نفسها بالضبط. أنت تحسب الـ hash لتتحقق أنك أصبت؛ وهو يحسبه ليتحقق إن كان قد أصاب. هو السباق الوحيد في الأمن الذي يجري فيه الاثنان بالساقين نفسيهما.

وحين لا تستطيع أن تجري أسرع من خصمك، لا تبقى إلا لعبة واحدة: أن تُغلي المضمار على كليكما. أنت تدفع تلك الكلفة مرة واحدة عن كل تسجيل دخول. وهو يدفعها مرة عن كل محاولة. ولأنه يحتاج مراتبَ من حيث الحجم أكثر من محاولاتك، فالفاتورة نفسها تصيبكما إصابتين لا تقارَنان. هذا ما يفعله hash كلمات المرور.

لهذا فالدوال السريعة والممتازة لأشياء أخرى — SHA-256 مثلًا — خيار بائس هنا. إنها سريعة. والسرعة هي بالضبط ما لا نريده.

1999 bcrypt، والكلفة بوصفها قطعة قابلة للضبط

مشكلة الدالة البطيئة أن العتاد لا يقف ساكنًا. ما كان بطيئًا سنة 1979 صار بعدها فوريًا. الدفاع المعاير على حواسيب عقد من الزمن يشيخ وحده، دون أن يمسّه أحد.

سنة 1999، قدّم Niels Provos وDavid Mazières خوارزمية bcrypt في USENIX Annual Technical Conference، بعنوان يقول كل شيء: A Future-Adaptable Password Scheme.

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

إنه تصميم يفترض تقادمه هو ويستعدّ له. وقليل جدًا من البرمجيات يفعل ذلك.

2009 scrypt، واكتشاف أن الوقت لا يكفي

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

في الخادم أنوية قليلة سريعة وعامة الغرض. وفي الـ GPU كمّ هائل من الأنوية الصغيرة تفعل الشيء نفسه على التوازي، والـ ASIC يذهب أبعد: سيليكون مصنوع لتنفيذ عملية واحدة لا غير. فإذا كان دفاعك «هذه العملية تكلّف X»، استطاع أحدهم أن يبني عتادًا ينجز X كثيرة في آن. والمدافع باقٍ مع خادمه.

سنة 2009، قدّم Colin Percival خوارزمية scrypt بحجة أخرى: Stronger Key Derivation via Sequential Memory-Hard Functions. إذا كانت الكلفة في الحساب وحده، أمكن توزيعها على التوازي. لكن الذاكرة لا تُوهَب. أرغِم الدالة على استهلاك ذاكرة وصول عشوائي كثيرة وعلى اجتيازها اجتيازًا لا يمكن التحايل عليه، وفجأة يعجز المهاجم عن مضاعفة الأنوية: كل نواة ستحتاج ذاكرتها الخاصة. وأنوية الـ GPU لها قوة كبيرة وذاكرة وصول عشوائي ضئيلة جدًا لكل واحدة منها.

لم يُغلِ Percival العملية. أغلى العتاد اللازم لتكرارها بالجملة. إنه تغيير في المستوى: الهجوم صار على ميزانية المهاجم، لا على ساعته.

2015 Argon2، ونهاية النقاش

وجود عدة خيارات معقولة لم يكن يساعد أحدًا على الاختيار. فصنع مجتمع التعمية ما يصنعه عادةً حين يريد حسم أمر: مسابقة علنية. تلقّت Password Hashing Competition المرشحات، وأخضعتها لتحليل مفتوح سنوات، وسنة 2015 أعلنت فوز Argon2.

ترث Argon2 الدرسين معًا: كلفة في الوقت وكلفة في الذاكرة، وكلتاهما قابلة للضبط على حدة، إضافة إلى عدد الخيوط. ليست سحرًا. هي التركيب المرتّب لسنوات 1979 و1999 و2009، مراجَعًا على يد أناس كانت وظيفتهم أن يحاولوا كسره.

ماذا يعني هذا لك

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

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

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

ونعم: ما زال السؤال هو السؤال نفسه دائمًا. غير أن أحدهم، على الضفة الأخرى، يحاول الآن أن يجيب عنه مرات كثيرة في الثانية، ونحن منذ 1979 نحاول أن تكلّفه كل مرة من تلك المرات مالًا.


المصادر: R. Morris وK. Thompson، «Password Security: A Case History»، Communications of the ACM، 1979 · N. Provos وD. Mazières، «A Future-Adaptable Password Scheme»، USENIX Annual Technical Conference، 1999 (bcrypt) · C. Percival، «Stronger Key Derivation via Sequential Memory-Hard Functions»، 2009 (scrypt) · Password Hashing Competition، فازت بها Argon2، 2015.

← العودة إلى المدونة