
لقد شاركت مؤخرًا في Haathathon Ethereum ، واليوم أريد أن أتحدث عن مشروع EtherAuth ، الذي احتل فيه فريق MixBytes المركز الثالث. EtherAuth هي محاولة لإنشاء نسخة لامركزية من تسجيل الدخول إلى الموقع باستخدام حساب خارجي. كزر ، قم بتسجيل الدخول عبر Facebook ، فقط بدون Facebook.
المشكلة والحلول
إذا كنت ترغب في إنشاء منطقة مغلقة للمستخدمين على موقع الويب الخاص بك ، فعليك أن تختار: تطوير نظامك الخاص لتحديد المستخدمين والمصادقة عليهم وتفويضهم أو استخدام حل جاهز. يعني الحل الجاهز أن المستخدم لديه بالفعل حساب في بعض الأنظمة (Facebook أو Google أو Yahoo أو Outlook أو حتى البريد الإلكتروني فقط). وأنت تستخدم الآلية المناسبة (غالبًا بروتوكول OAuth 2.0) للتأكد من أن شخصًا يحاول تسجيل الدخول إلى موقعك باستخدام معرف مستخدم خارجي هو هذا المستخدم.
الخيار الأخير أسهل في التنفيذ ، ولكن هناك خطر على المستخدم: إذا حدث شيء ما لحسابه الرئيسي (على سبيل المثال ، سيحظر Facebook الحساب دون إبداء أسباب) ، سيفقد أيضًا الوصول إلى معلوماته على موقعك.
بالإضافة إلى ذلك ، إذا أردت كمستخدم تسجيل الدخول إلى موقع لا أثق به بعد ، فأنا أواجه حاجة إلى تزويد هذا الموقع بإمكانية الوصول إلى معلوماتي الشخصية ، مثل البريد الإلكتروني أو العمر. إذا كان الموقع يدعم فقط تسجيل الدخول باستخدام حساب خارجي ، فيجب أن أختار حرفًا: رفض استخدام الموقع أو التضحية بهويتي.
ينتهي الأمر بمعظم المستخدمين بالتضحية بإخفاء الهوية من خلال الكلمات "لذا ما يمكن أن يحدث فظيع ، ليس لدي ما أخفيه". لسوء الحظ ، فإن معظم الهجمات التي تستهدف مستخدمًا غير مستعد وتنتهي بخسارة أموال تبدأ بكلمات مماثلة. "ما هو الرهيب الذي يمكن أن يحدث إذا قمت بإرسال رمز من SMS إلى موظف البنك؟" "ما الشيء الفظيع الذي يمكن أن يحدث إذا أرسلت عناوين الدعم الفني لموظف الدعم؟" غالبًا ما يتم العثور على إجابة هذا السؤال عندما لا يمكن فعل شيء.
كيف يمكن لـ Ethereum المساعدة هنا؟ لقد أدركنا بالفعل أن هناك ثلاث مشاكل رئيسية:
- المستخدم غير ملزم بالثقة في الموقع الذي يزوره ويرغب في تجنب تسرب المعلومات الشخصية.
- يريد الموقع استخدام نظام مصادقة خارجي لتجنب تخزين بيانات المستخدم وتكاليف الأمان المرتبطة بها.
- تحمل الأنظمة الخارجية الحالية التي تزود المواقع بالقدرة على توثيق المستخدمين خطر الرقابة. يمكن حظر أي حساب في أي وقت دون تفسير وأحيانًا دون إمكانية الاسترداد.
يمكننا استخدام شبكة Ethereum بدلاً من نظام خارجي وتخزين مجموعة البيانات الضرورية فقط فيه. يجب أن نحرص على عدم تخزين المعلومات السرية في المجال العام ، ولكن نظرًا لأن أي محفظة على شبكة Ethereum هي في الواقع زوج من المفاتيح القوية المشفرة ، حيث يحدد المفتاح العام عنوان المحفظة ، ولا يتم نقل المفتاح الخاص أبدًا عبر الشبكة ولا يُعرف إلا للمالك ، يمكننا استخدام التشفير غير المتماثل لمصادقة المستخدمين.
في أبسط الحالات ، يمكنك استخدام عنوان محفظة Ethereum كمعرف مستخدم. ولكن هنا تنشأ مشكلة: في حالة حدوث تسرب رئيسي ، يفقد المستخدم الوصول إلى النظام إلى الأبد. بتعبير أدق ، منذ اللحظة التي أصبح فيها المهاجم مفتاح المستخدم السري معروفًا أو وقع ببساطة عن طريق الخطأ في الوصول العام ، لا يمكننا استخدام هذا المفتاح للمصادقة.
التنفيذ
في حلنا ، كتبت عقد EtherAuth الذكي البسيط لتخزين معرفات المستخدمين وعناوين المحفظة المرتبطة. معرف المستخدم عبارة عن سلسلة UTF-8 يتراوح حجمها بين 2 و 32 بايت. تم اختراعه مرة واحدة من قبل المستخدم نفسه واستخدم لاحقًا لتسجيل الدخول إلى أي موقع يدعم EtherAuth. اليوم أود أن أضيف قيودًا على الأحرف المحتملة المضمنة في السلسلة ، تاركًا إمكانية استخدام الأحرف اللاتينية والأرقام العربية (مجموعات فرعية من ترميز ASCII 7 بت) للحد من القدرة على إنشاء تسجيلات دخول مماثلة خارجيًا.
عند إنشاء حساب في EtherAuth ، يتم تعيين زوج من المفاتيح: مفتاح تفويض (authAddr) ومفتاح لاستعادة الوصول (مفتاح الاسترداد). لم يكن مفتاح الاسترداد ناجحًا تمامًا ، لأنه يتم استخدام هذا العنوان لإدارة الحساب ، وليس فقط لاسترداده. عند الإنشاء ، يتساوى كلا العنوانين مع عنوان المحفظة الذي تم إرسال المعاملة نيابة عنه. ولكن يجب على المستخدم الذي يهتم بسلامته إنشاء مفتاح تحكم منفصل وتخزينه في مكان لا يمكن الوصول إليه عبر الشبكة. حتى أنني سأحتفظ به على الورق في خزنة على شكل 12 كلمة تذكيرية ، مما يسمح ، إذا لزم الأمر ، بإعادة إنشاء مفتاحين.
من الحكمة أيضًا استخدام عنوان محفظة منفصل للمصادقة ، وفصله عن عنوان المحفظة حيث يتم تخزين كل الأثير. لا يزال من الممكن تتبع علاقة authKey مع عنوان المحفظة التي أنشأت الحساب من خلال تحليل تسلسل المعاملات للعقد الذكي. الآن لا يمكنك تعيين authKey منفصلة واسترداد مفتاح عند إنشاء حساب. ومع ذلك ، إذا قمت بتنقيح العقد الذكي في هذا الاتجاه ، فلن يكون العنوان الذي أنشأ الحساب مرتبطًا بالضرورة بمالك الحساب ، مما سيسمح للجميع بحماية هويته.
لتفاعل المستخدم مع العقد الذكي ، أنشأنا صفحة ويب منفصلة. يمكنك إنشاء حساب عليه أو تغيير مفاتيحه أو حذفه. للعمل ، سيحتاج المستخدم إلى تثبيت المكون الإضافي لمتصفح MetaMask. إذا كنت تستخدم بالفعل بنشاط شبكة Ethereum ، فمن المرجح أنك قمت بالفعل بتثبيت هذا المكون الإضافي ، أي أن غالبية المستخدمين الذين يريدون دخول الموقع من خلال Ethereum لن يواجهوا عقبة إضافية في مسارهم.
تبدو عملية مصادقة المستخدم العامة باستخدام EtherAuth كما يلي:
- يتحول الموقع (الواجهة الخلفية) إلى عقد ذكي ويتلقى عنوان Ethereum الخاص بالمستخدم ؛
- الموقع (الخلفية) يولد ويتذكر بعض الرسائل ويطلب من المستخدم التوقيع على هذه الرسالة باستخدام عنوان authKey ؛
- يقوم المستخدم ، الموجود على الموقع (الواجهة الأمامية) ، بتوقيع الرسالة باستخدام المكون الإضافي MetaMask وإرسالها إلى الواجهة الخلفية ؛
- يتحقق الموقع (الخلفية) من التوقيع ، وإذا كان كل شيء في محله ، فإنه ينشط جلسة المستخدم وفقًا للمنطق الذي يختاره.
في حلنا للهاكاثون ، من أجل البساطة ، قمنا بدمج أجزاء الواجهة الأمامية والخلفية ، وحصلنا على واجهة أمامية كبيرة. في الحياة الواقعية ، من المهم أن يتم التحقق من المصادقة في بيئة لا يتحكم فيها المستخدم ، أي ليس في المتصفح ، ولكن على الخادم.
من بين المشاكل التي واجهتنا ، يمكننا ملاحظة التحقق من التوقيع في الجزء الأمامي. لم يكن هناك دعم للمنحنيات الإهليلجية في المتصفح ، لذلك كان عليّ إضافة وظيفة إلى العقد الذكي الذي يعيد نتيجة الاسترداد من الرسالة ومعرفة كيفية تمرير المعلمات إليها بشكل صحيح (احصل عليها من رسالة موقعة بواسطة MetaMask).
ونتيجة لذلك ، تلقينا خلال يومين إثبات صحة مفهوم المصادقة اللامركزية باستخدام شبكة Ethereum والمكوّن الإضافي MetaMask. نحن نفهم كيفية تحسين هذا النظام من أجل إضافة إخفاء الهوية إلى المستخدم. يمكن للمستخدم استعادة الوصول في حالة تسرب مفتاحه الأساسي (ولكن ليس في حالة تسرب مفتاح الاسترداد). لا يخضع النظام اللامركزي للرقابة على الهياكل الكبيرة مثل Google أو Facebook. إذا كانت الرقابة ضرورية ، فيجب أن يقوم الموقع بتنفيذها بمفردها ، ولكن لا يمكنها القيام بذلك إلا في إطار نظامها الخاص ، دون التأثير على وصول المستخدم إلى أنظمة أخرى. لا تجري شبكة Ethereum المعاملات بسرعة كبيرة (عند إنشاء حساب ، قد يضطر المستخدم إلى الانتظار بضع دقائق) ، ولكن من الممكن الحصول على البيانات والتحقق من مصادقة المستخدم بسرعة كبيرة. يتطور هذا الحل بشكل جيد ، نظرًا لوجود الكثير من العقد مع البيانات ، ويمكن لأي شخص إضافة واحدة أخرى في أي وقت. تعقيد تنفيذ هذا الحل لأصحاب المواقع ليس أعلى من تعقيد تنفيذ دعم OAuth 2.0.
الخلاصة
بطبيعة الحال ، فإن المستخدمين الذين يستخدمون شبكة Ethereum اليوم لا يكاد يذكر مقارنة بعدد مستخدمي Facebook. ومع ذلك ، تزداد شعبية تقنيات blockchain ، وأعتقد أنه في المستقبل المنظور سيكون هناك المزيد والمزيد من هؤلاء المستخدمين ، مما يعني أنه سيكون من الممكن استخدام المصادقة اللامركزية في الأنظمة الصناعية.
المراجع