نظرة معمّقة على عملية "إثبات هوية المستخدم"

يناقش هذا المستند ما هو userVerification في WebAuthn، وسلوكيات المتصفّح التي تنتج عند تحديد userVerification أثناء إنشاء مفتاح المرور أو المصادقة.

ما هو "التحقق من المستخدم" في WebAuthn؟

تعتمد مفاتيح المرور على تشفير المفتاح العام. من خلال إنشاء مفتاح مرور، يتم إنشاء زوج من المفاتيح العام والخاص، وتخزين المفتاح الخاص من قِبل موفِّر مفتاح المرور، ثم يُرجع المفتاح العام إلى خادم الجهة المعتمدة (RP) لتخزينه. يمكن للخادم مصادقة المستخدم من خلال إثبات صحة توقيع تم توقيعه باستخدام مفتاح المرور نفسه باستخدام المفتاح العام المقترن. تثبت علامة "مشاركة المستخدِم" (UP) على بيانات اعتماد المفتاح العام أنّ شخصًا ما تفاعل مع الجهاز أثناء المصادقة.

التحقق من المستخدم هو طبقة اختيارية من الأمان تهدف إلى التأكد من وجود الشخص الصحيح أثناء المصادقة، وليس فقط شخص واحد، كما يؤكد وجود المستخدم. ويتم ذلك عادةً على الهواتف الذكية باستخدام آلية قفل الشاشة، سواء كانت مقاييس حيوية أو رقم تعريف شخصي أو كلمة مرور. ما إذا تم تنفيذ عملية التحقّق من المستخدم أم لا في علامة "UV" التي يتم عرضها في بيانات برنامج المصادقة أثناء تسجيل مفتاح المرور والمصادقة

لقطة شاشة لمربّع حوار التحقّق من المستخدم في iCloud Keychain على نظام التشغيل macOS يطلب مربّع الحوار من المستخدم تسجيل الدخول باستخدام ميزة Touch ID، مع عرض المصدر الذي يطلب المصادقة، بالإضافة إلى اسم المستخدم. في أعلى يسار مربع الحوار، يوجد زر باسم "إلغاء".
مربّع حوار لتأكيد هوية المستخدم في iCloud Keychain على نظام التشغيل macOS
لقطة شاشة لمربّع حوار التحقّق من المستخدم في Chrome لنظام التشغيل Android يطلب مربّع الحوار من المستخدم إثبات هويته باستخدام ميزة التعرّف على الوجوه أو ميزة "التعرّف على بصمة الإصبع"، ويعرض المصدر الذي يطلب المصادقة. يتوفّر خيار في أسفل يمين الصفحة لإثبات الملكية باستخدام رقم تعريف شخصي.
مربع الحوار الخاص بإثبات هوية المستخدم على متصفح Chrome على نظام التشغيل Android.

كيفية التحقق من صحة UP والأشعة فوق البنفسجية على الخادم

يتمّ إرسال العلامات المنطقية لوجود المستخدم (UP) والمستخدم الذي تمّ التحقّق منه (UV) إلى الخادم في حقل بيانات برنامج المصادقة. أثناء المصادقة، يمكن التحقق من صحة محتوى حقل بيانات برنامج المصادقة من خلال التحقق من التوقيع باستخدام المفتاح العام المخزن. طالما أن التوقيع صالح، يمكن للخادم اعتبار هذه العلامات حقيقية.

تصوير لبنية بيانات المصادقة. من اليسار إلى اليمين، يظهر في كل قسم من أقسام بنية البيانات ما يلي: "رقم تعريف الجهة المحظورة HASH" (32 بايت)، "FLAGS" (1 بايت)، "COUNTER" (4 بايت، uint32 الكبير)، و"ATTESTE CRED". DATA (متغير الطول في حال وجوده) و "extensionS" (طول متغير في حال وجوده (CBOR)). تم توسيع قسم "FLAGS" لعرض قائمة بالعلامات المحتمَلة من اليسار إلى اليمين، وهي: "ED" و"AT" و"0" و"BS" و"BE" و"UV" و"0" و"أعلى".
حقول بيانات Authenticator في بيانات اعتماد المفتاح العام.

عند تسجيل مفتاح المرور والمصادقة عليه، يجب أن يفحص الخادم أن علامة UP هي true، وما إذا كانت علامة الأشعة فوق البنفسجية true أو false، بناءً على المتطلبات.

تحديد المَعلمة userVerification

وفقًا لمواصفات WebAuthn، يمكن لـ RP طلب إثبات هوية المستخدم باستخدام المَعلمة userVerification في كل من إنشاء بيانات الاعتماد وتأكيدها. ويمكن استخدام السمة 'preferred' أو 'required' أو 'discouraged'، ما يعني ما يلي:

  • 'preferred' (طريقة تلقائية): يُفضَّل استخدام طريقة التحقُّق من المستخدم على الجهاز، ولكن يمكن تخطّي هذه الطريقة في حال عدم توفّرها. تحتوي بيانات اعتماد الاستجابة على قيمة علامة الأشعة فوق البنفسجية true في حال إتمام التحقّق من المستخدم، وقيمة false في حال عدم تنفيذ الإجراء على الأشعة فوق البنفسجية.
  • 'required': يجب استدعاء إحدى طرق التحقّق من المستخدم المتاحة على الجهاز. وإذا لم يكن أحدها متاحًا، سيتعذّر تنفيذ الطلب على الجهاز. ويعني هذا أنّه يتم دائمًا إرجاع بيانات اعتماد الاستجابة مع ضبط علامة الأشعة فوق البنفسجية على true.
  • 'discouraged': لا يُنصح باستخدام طريقة للتحقّق من هوية المستخدم. ومع ذلك، يمكن تنفيذ التحقُّق من المستخدم على أي حال، حسب الجهاز، وقد تحتوي علامة الأشعة فوق البنفسجية على true أو false.

رمز نموذجي لإنشاء مفتاح المرور:

const publicKeyCredentialCreationOptions = {
  // ...
  authenticatorSelection: {
    authenticatorAttachment: 'platform',
    residentKey: 'required',
    requireResidentKey: true,
    userVerification: 'preferred'
  }
};

const credential = await navigator.credentials.create({
  publicKey: publicKeyCredentialCreationOptions
});

رمز نموذجي لمصادقة مفتاح المرور:

const publicKeyCredentialRequestOptions = {
  challenge: /* Omitted challenge data... */,
  rpId: 'example.com',
  userVerification: 'preferred'
};

const credential = await navigator.credentials.get({
  publicKey: publicKeyCredentialRequestOptions
});

أي خيار يجب أن تختاره لحساب "userVerification

وتعتمد قيمة userVerification التي عليك استخدامها على متطلبات التطبيق بالإضافة إلى متطلبات تجربة المستخدم.

حالات استخدام userVerification='preferred'

يمكنك استخدام userVerification='preferred' إذا كنت تعطي الأولوية لتجربة المستخدم على الحماية.

هناك بيئات تكون فيها عملية التحقّق من المستخدم أكثر صعوبة من الحماية. على سبيل المثال، يُطلب من المستخدم إدخال كلمة مرور النظام بدلاً من ذلك على نظام التشغيل macOS الذي لا يتوفّر فيه رقم التعريف باللمس (لأنّ الجهاز غير متوافق مع هذه الميزة أو لأنّه غير مفعّل أو لأنّ الجهاز في وضع صدفي). ويسبّب ذلك معوقات، وقد يتوقّف المستخدم عن المصادقة تمامًا. إذا كان التخلص من الصعوبات أكثر أهمية بالنسبة إليك، استخدِم userVerification='preferred'.

لقطة شاشة لمربّع حوار مفتاح المرور على نظام التشغيل macOS الذي يظهر عند عدم توفُّر ميزة Touch ID ويحتوي مربّع الحوار على معلومات، مثل المصدر الذي يطلب المصادقة، بالإضافة إلى اسم المستخدم. في أعلى يسار مربع الحوار، يوجد زر باسم "إلغاء".
يظهر مربّع حوار لمفتاح المرور على نظام التشغيل macOS عندما لا يكون رقم التعريف باللمس متاحًا.

في حال استخدام userVerification='preferred'، تصبح علامة الأشعة فوق البنفسجية true إذا تمّ إثبات هوية المستخدم بنجاح، وfalse في حال تخطّي عملية التحقّق من المستخدم. على سبيل المثال، على نظام التشغيل macOS الذي لا تتوفّر فيه ميزة Touch ID، تطلب من المستخدم النقر على زر لتخطّي عملية التحقق من المستخدم، وتتضمّن بيانات اعتماد المفتاح العام علامة UV false.

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

حالات استخدام userVerification='required'

استخدِم userVerification='required' إذا كنت تعتقد أنّ كلاً من UP والأشعة فوق البنفسجية ضروريان للغاية.

والجانب السلبي لهذا الخيار هو أنّ المستخدم قد يواجه المزيد من الصعوبات عند تسجيل الدخول. على سبيل المثال، على نظام التشغيل macOS الذي لا يتوفّر فيه رقم التعريف باللمس، يُطلب من المستخدم إدخال كلمة مرور النظام.

وباستخدام userVerification='required'، يمكنك التأكّد من أنّ عملية التحقّق من المستخدِم قد تتم على الجهاز. تأكَّد من أنّ الخادم يتحقّق من أنّ علامة الأشعة فوق البنفسجية هي true.

الخلاصة

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