دراسات الحالة

كيفية ترقية WhatsApp إلى تسجيل دخول آمن وسلس لمليار مستخدم باستخدام مفاتيح المرور

مدّة القراءة: 8 دقائق
3 مؤلفون
Niharika Arora, Tracy Agyemang, Mayank Jain

WhatsApp هو أكبر منصة للمراسلة في العالم، ويستخدمه مليارات المستخدمين على مستوى العالم. وهو أداة التواصل التلقائية للمستخدمين في مختلف المناطق، إذ يربط بينهم من خلال رسائل خاصة وموثوقة وآمنة.

"أكثر ما يثير حماسي هو التأثير الهائل الذي يحدثه تطبيق WhatsApp. يقول "مايانك مانوجا"، مهندس Android في فريق التسجيل والوصول في WhatsApp والذي قاد عملية تصميم وتنفيذ المصادقة المستندة إلى مفاتيح المرور في WhatsApp: "حتى التحسينات البسيطة في WhatsApp تؤثر في مليارات المستخدمين حول العالم". 

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

1787852638767.gif
مستخدم ينشئ مفتاح مرور على WhatsApp لتسجيل الدخول بشكل أسرع وأكثر أمانًا

قرار اعتماد مفاتيح المرور

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

تستفيد مفاتيح المرور من تشفير المفاتيح العامة والخاصة لاستبدال الإدخال اليدوي بالمصادقة باستخدام المقاييس الحيوية أو قفل الشاشة. يؤدي سير العمل هذا إلى تحسين سرعات تسجيل الدخول بشكل كبير من خلال تقليل العملية إلى نقرة واحدة عبر واجهة بطاقة سفلية موحّدة تحافظ على تفاعل المستخدمين ضمن سياق التطبيق. توفّر مفاتيح المرور فائدتَين: تجربة تسجيل دخول سلسة للمستخدمين وحماية قوية ومضمّنة ضد هجمات التصيّد الاحتيالي. والأهم من ذلك أنّها تعمل بشكل موثوق حتى في المناطق التي قد لا تصل فيها كلمات المرور الصالحة لمرة واحدة (OTP) عبر الرسائل القصيرة التقليدية بشكل منتظم.

unnamed.png
كيفية حفظ مفاتيح المرور واستخدامها للمصادقة باستخدام تشفير المفتاح العام والخاص
AANDDM_KARROT_Quote_02.png

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

الدمج من جهة العميل

من وجهة نظر مطوّري WhatsApp، قدّمت واجهة برمجة التطبيقات Credential Manager API واجهة منظَّمة وموحّدة تبسّط تعقيدات مقدّمي بيانات الاعتماد الأساسيين. بعد تحديد مسارات الدمج الأولية، أصبحت واجهة برمجة التطبيقات واضحة، مع إنشاء بيانات الاعتماد واستردادها باتّباع أنماط طلبات واستجابات محدّدة جيدًا. يمكنك العثور على دليل الاستخدام في مستندات مطوّري برامج Android. 

على الرغم من أنّ المسار الخالي من المشاكل كان ناجحًا منذ البداية، فإنّ التعامل مع قاعدة مستخدمين متنوعة على مستوى المصنّعين الأصليين للأجهزة وإصدارات Android المتعددة وإعدادات الأجهزة المختلفة (مثل رقم التعريف الشخصي فقط مقابل المقاييس الحيوية أو Android 13 مقابل Android 14 والإصدارات الأحدث) كشف عن حالات استثنائية غير مسبوقة. وشمل ذلك المستخدمين الذين لم يفعّلوا قفل الشاشة، وأنواع الاستثناءات غير المتوقّعة، وخدمات Play القديمة، والسلوك غير المتّسق لموفِّر بيانات الاعتماد.

للتغلّب على هذه العقبات، تعاون فريقا WhatsApp وGoogle بشكل وثيق وواجهوا العديد من التحديات:

  • تحسين عملية البحث عن بيانات الاعتماد: كانت عملية البحث الأولية تتسم بزمن استجابة ضعيف، خاصةً للمستخدمين الذين لم ينشئوا مفتاح مرور بعد. بما أنّ غالبية مستخدمي WhatsApp يندرجون ضمن هذه الفئة في المراحل المبكرة، فقد أضاف ذلك تأخيرًا ملحوظًا في كل عملية تسجيل دخول تقريبًا. من خلال تتبُّع مسار الاتصال وتحديد المؤثّرات السلبية معًا، سرّع WhatsApp العملية بشكل كبير، وحقّق تحسينات في الأداء استفادت منها في النهاية منظومة Android المتكاملة بأكملها.
  • التعامل مع الحالات المؤقتة: أنشأ WhatsApp طبقة شاملة لمعالجة الأخطاء من أجل تجاوز العقبات الخاصة بالجهاز، مثل توفّر مدير كلمات المرور، وعدم ضبط قفل الشاشة، ومشاكل الاتصال المتقطّع، والأجهزة غير المتوافقة، وخدمات Play القديمة، وتصنيف الاستثناءات إلى حالات قابلة للاسترداد وحالات نهائية. وقد أتاح ذلك التكيّف مع الإصدارات الأقدم، فإذا لم تكتمل عملية مفتاح المرور، يعود النظام بأمان إلى المصادقة التقليدية بدون ترك المستخدم في حالة تعطُّل.
  • التعامل مع الاستثناءات الخاصة بنظام التشغيل: عندما كشفت بيانات القياس عن بُعد عن عقبات خاصة ببعض الأجهزة، مثل GetPublicKeyCredentialDomException (تعذُّر فك تشفير بيانات الاعتماد) على بعض أجهزة Android 13، وCreatePublicKeyCredentialDomException (تعذُّر الحصول على حساب المزامنة)  أثناء إنشاء مفتاح المرور على Android 14، حقّق فريقا Google وWhatsApp في الأسباب الأساسية ونفّذا تحسينات على مستوى المنصة لضمان سلاسة عمليات الإنشاء. يمكنك العثور على دليل الأخطاء الشامل هنا الذي يسرد رموز الأخطاء الشائعة وأوصافها ذات الصلة بواجهة Credential Manager، ويقدّم بعض المعلومات عن أسبابها. 
ملاحظة: لمزيد من الإرشادات، يمكنك الاطّلاع على مدوّنة أفضل الممارسات المتعلّقة بمفاتيح المرور للتعرّف على كيفية تحسين تجربة المستخدم عند استخدام مفاتيح المرور.

تحسين تجربة المستخدم

بما أنّ مفاتيح المرور كانت مفهومًا جديدًا تمامًا في أوائل عام 2023، لم تكن هناك أنماط ثابتة لطلب إنشائها. من خلال إجراء اختبارات A/B على نطاق واسع، طوّر WhatsApp إطار عمل سياقيًا يستهدف المستخدمين الذين سيستفيدون أكثر من غيرهم. تطوّرت هذه الاستراتيجية باستمرار: مع نضوج مسارات نظام التشغيل Android لتصبح تجربة مبسّطة على شاشة واحدة، بسّط WhatsApp طلباته لتجنُّب واجهة المستخدم المكرّرة أو المربكة.

Case-Study-1.png
عملية إنشاء مفتاح مرور مبسّطة في WhatsApp على شاشة واحدة

بنية الخادم والعقبات التي تواجهها المنصات المتعددة

في الخلفية، ينفّذ خادم WhatsApp إجراءات WebAuthn/FIDO2 العادية. تمت كتابة الخلفية بلغة Erlang وتستدعي مكتبة Rust webauthn-rs من خلال واجهة أصلية. تتولّى مكتبة Rust هذه التحقّق من التوقيع وتحليل بيانات الاعتماد، ما يسمح للرمز الداخلي بالتركيز على التنسيق والتخزين وقواعد المنتجات، مثل الأهلية والحدّ من معدّل الاستخدام ومراحل نشاط بيانات الاعتماد.

تنسّق بنية الخادم هذه العمليات الأساسية من خلال أربع نقاط دخول أساسية، مقترنة في تسلسلات البدء والإنهاء لكل من التسجيل والمصادقة:

1. تسجيل مفتاح المرور

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

unnamed (1).png
بنية تفاعل الخادم والعميل أثناء تسجيل مفتاح المرور

Erlang: بدء التسجيل

begin_registration(UserId) ->
    Existing = list_credentials(UserId),
    %% reuse the existing user handle, or mint a new one
    {UserHandle, IsNew} = user_handle(Existing),
    %% returns the client creation options and the server-side challenge state
    #{client_safe := CreationOptions, server_only := ChallengeState} =
        webauthn:start_registration(UserId, UserHandle, rp_config()),
    %% excludeCredentials: the user's existing credential IDs, so the device won't re-enroll one
    Options = with_exclude_credentials(CreationOptions, credential_ids(Existing)),
    store_challenge(UserId, ChallengeState),          %% short TTL
    IsNew andalso reserve_user_handle(UserId, UserHandle),
    Options.
  • تحديد هوية المستخدم: يتحقّق الخادم أولاً من أي بيانات اعتماد حالية لإعادة استخدام اسم مستخدم حالي أو إنشاء اسم جديد.
  • إنشاء الخيارات والتحدي: يستدعي الخادم مكتبة WebAuthn لإنشاء خيارات الإنشاء للعميل وحالة تحدي آمنة للخادم.
  • منع التكرار: يستبعد هذا الخيار صراحةً معرّفات بيانات الاعتماد الحالية للمستخدم كي لا يعيد الجهاز تسجيل مفتاح مرور سبق تسجيله عن طريق الخطأ.
  • تخزين التحدي: يخزّن الخادم التحدي مؤقتًا مع مدة بقاء (TTL) قصيرة ويرسل الخيارات مرة أخرى إلى جهاز العميل.

Erlang: Finish Registration

finish_registration(UserId, Attestation) ->
    ChallengeState = get_challenge(UserId),          %% must exist and be unexpired
    #{credential_id := CredId, public_key := PubKey} =
        webauthn:finish_registration(Attestation, ChallengeState, rp_config()),
    ok = index_credential(CredId, UserId),            %% map credential_id -> account
    case multi_passkey_enabled(UserId) of
        true  -> add_credential(UserId, CredId, PubKey);      %% append (oldest evicted past the cap)
        false -> replace_credential(UserId, CredId, PubKey)   %% single-passkey mode
    end,
    notify_client(UserId, {passkey_created, CredId}),
    ok.
  • استرداد التحدي: يسترد الخادم التحدي المخزَّن، ما يضمن أنّه لا يزال موجودًا ولم تنتهِ صلاحيته.
  • التحقّق من المصادقة: يتم تمرير استجابة العميل (المصادقة) والتحدي إلى مكتبة WebAuthn للتحقّق من الطلب واستخراج رقم تعريف بيانات الاعتماد الجديد والمفتاح العام.
  • فهرسة بيانات الاعتماد: يتم ربط رقم تعريف بيانات الاعتماد الجديد مباشرةً بحساب المستخدم للبحث السريع لاحقًا.
  • حفظ الحدود وإدارتها: بناءً على ما إذا كانت ميزة مفاتيح المرور المتعدّدة مفعَّلة، سيُضيف الخادم بيانات الاعتماد الجديدة إلى قائمة المستخدم (مع إزالة أقدمها في حال بلوغ الحد الأقصى) أو سيستبدل بيانات الاعتماد الحالية في وضع مفتاح المرور الواحد.

2. مصادقة بيانات الاعتماد

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

Erlang: بدء المصادقة

begin_authentication(UserId) ->
    Credentials = list_valid_credentials(UserId),
    #{client_safe := RequestOptions, server_only := ChallengeState} =
        webauthn:start_authentication(Credentials, rp_config()),
    store_challenge(UserId, ChallengeState),          %% short TTL
    RequestOptions.
  • جلب بيانات الاعتماد الصالحة: يبحث الخادم عن جميع بيانات الاعتماد الصالحة حاليًا والمرتبطة بالمستخدم.
  • إنشاء اختبار: يستخدم هذه بيانات الاعتماد لإنشاء خيارات طلب للعميل وإنشاء اختبار جديد من جهة الخادم.
  • التخزين والإرجاع: تمامًا كما هو الحال في عملية التسجيل، يتم حفظ التحدي مؤقتًا، ويتم تمرير خيارات الطلب إلى تطبيق العميل.

Erlang: إنهاء المصادقة

finish_authentication(UserId, Assertion) ->
    ChallengeState = get_challenge(UserId),
    Credentials = list_valid_credentials(UserId),
    case webauthn:finish_authentication(Credentials, Assertion, ChallengeState) of
        #{user_verified := true, credential_id := CredId, needs_update := NeedsUpdate} = Result ->
            %% webauthn tells us when the stored credential should be refreshed
            NeedsUpdate andalso refresh_credential(UserId, CredId, Result),
            mark_credential_used(UserId, CredId),
            {ok, CredId};
        _ ->
            {error, not_allowed}
    end.
  • التحقّق من التأكيد: يسترد الخادم طلب التحقّق المخزَّن وبيانات الاعتماد الصالحة، ثم يطلب من مكتبة WebAuthn التحقّق من تأكيد العميل.
  • إعادة التحميل إذا لزم الأمر: إذا تم التحقّق من المستخدم بنجاح، يتحقّق الخادم من علامة needs_update. تستخدم مكتبة WebAuthn هذه العلامة للإشارة إلى ما إذا كانت حالة بيانات الاعتماد المخزّنة بحاجة إلى إعادة تحميل على الخادم.
  • الإنهاء: يضع الخادم علامة على بيانات الاعتماد على أنّها مستخدَمة ويكمل عملية تسجيل الدخول بنجاح.
Case-Study-2.png
تجربة تسجيل الدخول خطوة بخطوة باستخدام مفتاح المرور في تطبيق WhatsApp

لمزيد من المعلومات حول تسجيل الخادم، يُرجى اتّباع دليل الدمج هنا. 

اعتبارات متقدّمة بشأن البنية 

واجهنا تحديات فريدة عند تنفيذ مفاتيح المرور على الخادم على نطاق واسع، لا سيما في ما يتعلق ببنية الحساب ومزامنة الأجهزة. أشار "أشيش شودري" من فريق الواجهة الخلفية في WhatsApp إلى العقبات الأساسية التي واجهوها:

  1. نقل البيانات إلى مفاتيح مرور متعددة لكل حساب: كان منطق خادم WhatsApp القديم مرتبطًا بشكل وثيق بافتراض توفُّر بيانات اعتماد واحدة لكل مستخدم. ولمواكبة متطلبات الأجهزة المتعددة الحديثة، صمّموا نظام قائمة محدودة يزيل تلقائيًا أقدم بيانات اعتماد عند الوصول إلى الحد الأقصى. لضمان الاستقرار المطلق، تم طرح هذا التغيير الهيكلي الرئيسي تدريجيًا من خلال تجارب صارمة.
  2. الموازنة بين مراحل نشاط بيانات الاعتماد: تطلّبت إدارة صلاحية بيانات الاعتماد دقة عالية. فإبطال بيانات الاعتماد بشكل مفرط يؤدي إلى إعادة التسجيل بلا داعٍ، في حين أنّ التساهل الشديد يؤدي إلى تراكم بيانات الاعتماد القديمة. حلّ WhatsApp هذه المشكلة من خلال تنفيذ حالات متوازنة لمراحل النشاط من أجل الحفاظ على مستوى عالٍ من الأمان بدون إزعاج المستخدمين، بالإضافة إلى عمليات تنظيف تلقائية في الخلفية لمفاتيح المرور غير النشطة.

إعادة النظر في المزامنة على جميع الأجهزة

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

بدلاً من فرض آلية نقل غير آمنة بين الأجهزة، يتيح WhatsApp للمستخدمين الاحتفاظ بمفاتيح المرور على مستوى أنظمة بيئية متعددة، مثل "مدير كلمات المرور في Google" على Android و"سلسلة مفاتيح iCloud" على iOS. عندما ينتقل المستخدمون إلى منصة جديدة، يمكنهم ببساطة إنشاء مفتاح مرور جديد أثناء تسجيل الدخول في المرة التالية. هذا النهج سلس تمامًا للمستخدم ويعمل بسلاسة على البنية الأساسية الجديدة لخادم مفاتيح المرور المتعددة.

العمل للمستقبل

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

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

اقتراحات للمطوّرين الذين ينشئون تطبيقات على نطاق واسع

يشارك فريق WhatsApp هذه النصائح المهمة مع المطوّرين الذين يستعدون لدمج مفاتيح المرور على نطاق واسع:

  • الاستثمار في تصنيف الأخطاء مبكرًا: يمكنك تصنيف مجموعة واسعة من استثناءات Credential Manager إلى حالات قابلة للاسترداد مقابل حالات نهائية، وتحديد مسارات احتياطية واضحة وسلسة لكل سيناريو.
  • فهم مسار الأهلية: يمكنك إجراء عمليات تحقّق من إمكانات الجهاز، مثل توفّر قفل الشاشة والأجهزة التي تستخدم المقاييس الحيوية وإصدارات خدمات Play ومسارات التصميم لاستبعاد المستخدمين غير المؤهَّلين بشكل استباقي بدلاً من إيقاف العملية في منتصفها.
  • إعداد تطبيقك لاستخدام طريقة بديلة: استخدِم مفاتيح المرور كطريقة مصادقة أساسية مثالية للأجهزة المتوافقة، ولكن احتفِظ دائمًا بالطرق التقليدية كطريقة بديلة موثوقة وشاملة.
  • التخطيط لتجزئة إصدارات نظام التشغيل: يمكن أن يختلف سلوك مفتاح المرور باختلاف أنظمة التشغيل. اختبِر التطبيق بدقة على الإصدارات 13 و14 و15 من Android والإصدارات الأحدث، مع مراعاة الاختلافات الخاصة بالمصنّعين الأصليين للأجهزة في واجهة المستخدم الخاصة باختيار بيانات الاعتماد.
  • الارتقاء بالمبيعات حسب السياق والتثقيف: يمكنك عرض خيار إنشاء مفتاح المرور بشكل طبيعي أثناء الإجراءات المتعلّقة بالأمان. يجب التركيز بوضوح على عرض القيمة (السرعة والأمان) باستخدام لغة سهلة الفهم لتشجيع المستخدمين على استخدام الميزة.
  • المراقبة الاستباقية: تتطوّر المنظومة المتكاملة مع كل تحديث لنظام التشغيل. تتبَّع باستمرار أنماط وقت الاستجابة والأخطاء لمواكبة التغييرات في بيئات الأجهزة.
AANDDM_Passkeys_Quote_01.png

بدء استخدام مفاتيح المرور وواجهة Credential Manager

يمكنك تجربة مفاتيح المرور وواجهة Credential Manager على Android باستخدام دليل الدمج والرمز النموذجي المتاح للجميع.

إذا كانت لديك أي أسئلة أو مشاكل، يمكنك مشاركتها معنا من خلال أداة تتبُّع مشاكل Android Credentials.

من كتابة:
متابعة القراءة