شعار زيفيرنت

مفاتيح المرور: ما هيك ولماذا؟

التاريخ:

هذه الأشياء تسمى مفاتيح المرور من المؤكد أنهم يقومون بجولات هذه الأيام. كانوا عامل جذب رئيسي في W3C تباك 2022، حصل على دعم في رحلات السفاري 16، تجد طريقها إلى macOS و iOS، ومن المقرر أن تكون المستقبل لمديري كلمات المرور مثل 1Password. هم انهم مدعوم بالفعل في Android ، وستجد طريقها قريبًا إلى Chrome OS و Windows في الإصدارات المستقبلية.

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

هذا هو الهدف من هذا المقال. لقد كنت أدرس وأجرب مفاتيح المرور - وواجهة برمجة تطبيقات WebAuthn التي تم إنشاؤها فوقها - منذ بعض الوقت الآن. اسمحوا لي أن أشارك ما تعلمته.

جدول المحتويات

مصطلحات

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

  • الطرف المعول: الخادم الذي ستجري المصادقة عليه. سنستخدم "الخادم" للإشارة إلى الطرف المعتمد في هذه المقالة.
  • العميل: في حالتنا ، متصفح الويب أو نظام التشغيل.
  • المصدق: البرامج و / أو الأجهزة التي تسمح بالتوليد والتخزين لأزواج المفاتيح العامة.
  • FIDO: هيئة معايير مفتوحة تضع أيضًا مواصفات حول أوراق اعتماد FIDO.
  • WebAuthn: البروتوكول الأساسي لمفاتيح المرور ، والمعروف أيضًا باسم a فيدو2 بيانات اعتماد FIDO أو بيانات اعتماد FIDO أحادية الجهاز.
  • مفاتيح المرور: WebAuthn ، ولكن مع المزامنة السحابية (تسمى أيضًا بيانات اعتماد FIDO متعددة الأجهزة أو بيانات اعتماد قابلة للاكتشاف أو بيانات اعتماد مقيمة).
  • تشفير المفتاح العام: زوج مفاتيح تم إنشاؤه يتضمن مفتاحًا خاصًا وعامًا. اعتمادًا على الخوارزمية ، يجب استخدامه إما للتوقيع والتحقق أو التشفير وفك التشفير. يُعرف هذا أيضًا باسم التشفير غير المتناظر.
  • RSA: اختصار لاسمي المبدعين ، ريفيست شامير وعادل. RSA هي عائلة أقدم ، لكنها لا تزال مفيدة ، من تشفير المفتاح العام استنادًا إلى الأعداد الأولية للعوملة.
  • تشفير المنحنى الإهليلجي (ECC): عائلة جديدة من التشفير بناء على المنحنيات الناقصية.
  • ES256: مفتاح عمومي منحنى بيضاوي يستخدم خوارزمية توقيع ECDSA (PDF) مع SHA256 للتجزئة.
  • RS256: مثل ES256 ، لكنه يستخدم RSA مع RSASSA-PKCS1-v1.5 و SHA256.

ما هي مفاتيح المرور؟

قبل أن نتمكن من التحدث تحديدًا عن مفاتيح المرور ، نحتاج إلى التحدث عن بروتوكول آخر يسمى WebAuthn (المعروف أيضًا باسم FIDO2). مفاتيح المرور هي مواصفات مبنية على WebAuthn. يسمح WebAuthn بتشفير المفتاح العام ليحل محل كلمات المرور. نستخدم نوعًا من أجهزة الأمان ، مثل مفتاح الجهاز أو وحدة النظام الأساسي الموثوق بها (TPM) ، لإنشاء مفاتيح خاصة وعامة.

المفتاح العمومي متاح لأي شخص لاستخدامه. ومع ذلك ، لا يمكن إزالة المفتاح الخاص من الجهاز الذي أنشأه. كانت هذه إحدى المشكلات مع WebAuthn ؛ إذا فقدت الجهاز ، تفقد الوصول.

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

في الوقت الحالي ، في وقت كتابة هذا التقرير ، توفر أنظمة التشغيل iOS و macOS و Android فقط الدعم الكامل لمفاتيح المرور المتزامنة مع السحابة ، وحتى ذلك الحين ، فهي مقيدة بالمتصفح المستخدم. توفر Google و Apple واجهة للمزامنة عبر ملفات مدير كلمات جوجل و  سلسلة مفاتيح Apple iCloud الخدمات ، على التوالي.

كيف تحل مفاتيح المرور محل كلمات المرور؟

في تشفير المفتاح العام ، يمكنك تنفيذ ما يُعرف بـ التوقيع. يأخذ التوقيع قطعة من البيانات ثم يقوم بتشغيلها من خلال خوارزمية توقيع باستخدام المفتاح الخاص ، حيث يمكن التحقق منها بعد ذلك باستخدام المفتاح العام.

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

كميزة إضافية ، نظرًا لأننا نقوم بتخزين المفاتيح العامة للمستخدم داخل قاعدة بيانات ، لم يعد هناك قلق بشأن انتهاكات كلمات المرور التي تؤثر على ملايين المستخدمين. هذا يقلل من التصيد الاحتيالي والخروقات وعدد كبير من مشكلات الأمان الأخرى التي يواجهها عالمنا المعتمد على كلمة المرور حاليًا. في حالة اختراق قاعدة البيانات ، كل ما يتم تخزينه في المفاتيح العامة للمستخدم ، مما يجعلها غير مجدية تقريبًا للمهاجم.

لا مزيد من رسائل البريد الإلكتروني المنسية وكلمات المرور المرتبطة بها أيضًا! سيتذكر المتصفح بيانات الاعتماد التي استخدمتها لأي موقع ويب - كل ما عليك فعله هو إجراء بضع نقرات ، وأنت مسجل الدخول. يمكنك توفير وسيلة ثانوية للتحقق من استخدام مفتاح المرور ، مثل القياسات الحيوية أو دبوس ، لكنها لا تزال أسرع بكثير من كلمات المرور السابقة.

المزيد عن التشفير

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

عندما يتعلق الأمر بتشفير رسالة وفك تشفيرها ، يتم استخدام المفتاح العام للمستلم لتشفير رسالة بحيث يمكن للمفتاح الخاص للمستلم فقط فك تشفير الرسالة. في لغة الأمن ، يُعرف هذا باسم "توفير السرية". ومع ذلك ، لا يقدم هذا دليلًا على أن المرسل هو من يقول ، حيث يمكن لأي شخص استخدام مفتاح عام لإرسال رسالة مشفرة إلى شخص ما.

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

كيف يمكننا الوصول إلى مفاتيح المرور؟

للوصول إلى مفاتيح المرور ، نحتاج أولاً إلى إنشائها وتخزينها في مكان ما. يمكن توفير بعض هذه الوظيفة من خلال المصدق. ان الموثق هو أي جهاز أو جهاز مدعوم بالبرامج يوفر القدرة على إنشاء مفتاح التشفير. فكر في كلمات المرور التي تُستخدم لمرة واحدة والتي تحصل منها أداة مصادقة Google1Passwordالطرق أو LastPass، من بين آخرين.

على سبيل المثال ، يمكن لمصدق البرنامج استخدام وحدة النظام الأساسي الموثوق به (TPM) أو الغلاف الآمن للجهاز لإنشاء بيانات اعتماد. يمكن بعد ذلك تخزين بيانات الاعتماد عن بُعد ومزامنتها عبر الأجهزة مثل مفاتيح المرور. قد يكون مصدق الأجهزة شيئًا مثل ملف YubiKey، والتي يمكنها إنشاء المفاتيح وتخزينها على الجهاز نفسه.

للوصول إلى المصادقة ، يحتاج المتصفح إلى الوصول إلى الأجهزة ، ولهذا نحتاج إلى واجهة. الواجهة التي نستخدمها هنا هي Client to Authenticator Protocol (CTAP). يسمح بالوصول إلى مصدقين مختلفين عبر آليات مختلفة. على سبيل المثال ، يمكننا الوصول إلى مصدق عبر NFC و USB و Bluetooth باستخدام CTAP.

تتمثل إحدى الطرق الأكثر إثارة للاهتمام لاستخدام مفاتيح المرور في توصيل هاتفك عبر Bluetooth بجهاز آخر قد لا يدعم مفاتيح المرور. عندما يتم إقران الأجهزة عبر البلوتوث ، يمكنني تسجيل الدخول إلى المتصفح على جهاز الكمبيوتر الخاص بي باستخدام هاتفي كوسيط!

الفرق بين مفاتيح المرور و WebAuthn

تختلف مفاتيح المرور ومفاتيح WebAuthn بعدة طرق. أولاً ، تعتبر مفاتيح المرور بيانات اعتماد متعددة الأجهزة ويمكن مزامنتها عبر الأجهزة. على النقيض من ذلك ، فإن مفاتيح WebAuthn هي بيانات اعتماد أحادية الجهاز - طريقة رائعة للقول بأنك مرتبط بجهاز واحد للتحقق.

ثانيًا ، للمصادقة على الخادم ، تحتاج مفاتيح WebAuthn إلى توفير مقبض المستخدم لتسجيل الدخول ، وبعد ذلك allowCredentials يتم إرجاع القائمة إلى العميل من الخادم ، والتي تُعلم بيانات الاعتماد التي يمكن استخدامها لتسجيل الدخول. تتخطى مفاتيح المرور هذه الخطوة وتستخدم اسم مجال الخادم لإظهار المفاتيح المرتبطة بالفعل بهذا الموقع. يمكنك تحديد مفتاح المرور المرتبط بهذا الخادم ، كما هو معروف بالفعل بواسطة نظامك.

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

العملية ... باختصار

عملية إنشاء WebAuthn أو مفتاح المرور متشابهة جدًا: احصل على تحدٍ من الخادم ثم استخدم navigator.credentials.create واجهة برمجة تطبيقات الويب لإنشاء زوج مفاتيح عمومية. بعد ذلك ، أرسل التحدي والمفتاح العام مرة أخرى إلى الخادم ليتم تخزينهما.

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

لدى المستخدم خطوة أخرى - استرجع تحديًا آخر من الخادم واستخدم navigator.credentials.get API للتوقيع على التحدي. نعيد إرسال التحدي الموقع إلى الخادم ، ويتحقق الخادم من التحدي ، ثم يسجل دخولنا إذا نجح التوقيع.

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

اللحم والبطاطا

تُستخدم مفاتيح المرور في مرحلتين متميزتين: شهادة و  التأكيد المراحل.

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

تشبه مرحلة التأكيد طريقة تسجيل الدخول إلى موقع ويب بعد التسجيل.

شهادة

عرض الصورة بالحجم الكامل

• navigator.credentials.create API هو محور مرحلة التصديق لدينا. لقد تم تسجيلنا كمستخدم جديد في النظام ونحتاج إلى إنشاء زوج مفاتيح عمومية جديد. ومع ذلك ، نحتاج إلى تحديد نوع زوج المفاتيح الذي نريد إنشاؤه. هذا يعني أننا بحاجة إلى توفير خيارات ل navigator.credentials.create.

// The `challenge` is random and has to come from the server
const publicKey: PublicKeyCredentialCreationOptions = { challenge: safeEncode(challenge), rp: { id: window.location.host, name: document.title, }, user: { id: new TextEncoder().encode(crypto.randomUUID()), // Why not make it random? name: 'Your username', displayName: 'Display name in browser', }, pubKeyCredParams: [ { type: 'public-key', alg: -7, // ES256 }, { type: 'public-key', alg: -256, // RS256 }, ], authenticatorSelection: { userVerification: 'preferred', // Do you want to use biometrics or a pin? residentKey: 'required', // Create a resident key e.g. passkey }, attestation: 'indirect', // indirect, direct, or none timeout: 60_000,
};
const pubKeyCredential: PublicKeyCredential = await navigator.credentials.create({ publicKey
});
const { id // the key id a.k.a. kid
} = pubKeyCredential;
const pubKey = pubKeyCredential.response.getPublicKey();
const { clientDataJSON, attestationObject } = pubKeyCredential.response;
const { type, challenge, origin } = JSON.parse(new TextDecoder().decode(clientDataJSON));
// Send data off to the server for registration

سوف نحضر PublicKeyCredential الذي يحتوي على AuthenticatorAttestationResponse يعود بعد الخلق. تحتوي بيانات الاعتماد على معرف زوج المفاتيح الذي تم إنشاؤه.

توفر الاستجابة بضع أجزاء من المعلومات المفيدة. أولاً ، لدينا مفتاحنا العام في هذه الاستجابة ، ونحتاج إلى إرساله إلى الخادم ليتم تخزينه. ثانيًا ، نحصل أيضًا على ملف clientDataJSON الخاصية التي يمكننا فك تشفيرها ، ومن هناك ، استرجاع typechallengeو origin من مفتاح المرور.

للتصديق ، نريد التحقق من صحة typechallengeو origin على الخادم ، وكذلك تخزين المفتاح العام بمعرفه ، على سبيل المثال kid. يمكننا أيضًا تخزين ملف attestationObject إذا أردنا. خاصية أخرى مفيدة للتخزين هي COSE الخوارزمية ، التي تم تعريفها أعلاه في  PublicKeyCredentialCreationOptions مع alg: -7 or alg: -256، من أجل التحقق بسهولة من أي اعتراضات موقعة في مرحلة التأكيد.

توكيد

عرض الصورة بالحجم الكامل

• navigator.credentials.get ستكون API هي محور مرحلة التأكيد. من الناحية المفاهيمية ، سيكون هذا هو المكان الذي يقوم فيه المستخدم بتسجيل الدخول إلى تطبيق الويب بعد التسجيل.

// The `challenge` is random and has to come from the server
const publicKey: PublicKeyCredentialRequestOptions = { challenge: new TextEncoder().encode(challenge), rpId: window.location.host, timeout: 60_000,
};
const publicKeyCredential: PublicKeyCredential = await navigator.credentials.get({ publicKey, mediation: 'optional',
});
const { id // the key id, aka kid
} = pubKeyCredential;
const { clientDataJSON, attestationObject, signature, userHandle } = pubKeyCredential.response;
const { type, challenge, origin } = JSON.parse(new TextDecoder().decode(clientDataJSON));
// Send data off to the server for verification

سنحصل مرة أخرى على ملف PublicKeyCredential مع AuthenticatorAssertionResponse هذا الوقت. تتضمن بيانات الاعتماد مرة أخرى معرّف المفتاح.

نحصل أيضًا على ملف typechallengeو origin من clientDataJSON تكرارا. ال signature مدرج الآن في الاستجابة ، وكذلك authenticatorData. سنحتاج هؤلاء و clientDataJSON للتحقق من توقيع هذا المفتاح الخاص.

• authenticatorData يتضمن بعض الخصائص التي تستحق التتبع أولاً هو تجزئة SHA256 للأصل الذي تستخدمه ، والموجودة ضمن أول 32 بايتًا ، وهو أمر مفيد للتحقق من أن الطلب يأتي من نفس الخادم الأصلي. الثاني هو signCount، والتي تتراوح من البايت 33 إلى 37. يتم إنشاء هذا من المصدق ويجب مقارنته بقيمته السابقة لضمان عدم حدوث أي شيء مريب مع المفتاح. يجب أن تكون القيمة دائمًا 0 عندما تكون مفتاح مرور متعدد الأجهزة ويجب أن تكون أكبر عشوائيًا من SignCount السابق عندما يكون مفتاح مرور لجهاز واحد.

بمجرد تأكيد تسجيل الدخول الخاص بك ، يجب أن تقوم بتسجيل الدخول - تهنئة! تعد مفاتيح المرور بروتوكولًا رائعًا جدًا ، ولكنها تأتي مع بعض المحاذير.

بعض السلبيات

هناك الكثير من الجوانب الإيجابية لـ Passkeys ، ومع ذلك ، هناك بعض المشكلات في وقت كتابة هذا التقرير. لسبب واحد ، لا تزال مفاتيح المرور إلى حد ما من الدعم المبكر ، مع بيانات اعتماد جهاز واحد فقط مسموح بها على Windows وقليل جدًا من الدعم لأنظمة Linux. Passkeys.dev ويوفر جدول جميل يشبه إلى حد ما Caniuse من هذا البروتوكول.

أيضًا ، لا تتواصل منصات مفاتيح المرور الخاصة بـ Google و Apple مع بعضها البعض. إذا كنت ترغب في الحصول على بيانات الاعتماد الخاصة بك من هاتف Android الخاص بك إلى جهاز iPhone الخاص بك ... حسنًا ، أنت محظوظ الآن. هذا لا يعني عدم وجود إمكانية التشغيل البيني! يمكنك تسجيل الدخول إلى جهاز الكمبيوتر الخاص بك باستخدام هاتفك كمصدق. ولكن سيكون من الأنظف كثيرًا أن يتم تضمينه في نظام التشغيل ومزامنته دون قفله على مستوى البائع.

الى اين تسير الامور؟

كيف يبدو بروتوكول مفاتيح المرور في المستقبل؟ تبدو جيدة جدا! بمجرد حصوله على دعم من المزيد من أنظمة التشغيل ، يجب أن يكون هناك امتصاص في الاستخدام ، وستبدأ في رؤيته مستخدمًا أكثر وأكثر في البرية. بعض مديري كلمة السر ستدعمهم بشكل مباشر.

لا يتم دعم مفاتيح المرور بأي حال من الأحوال على الويب فقط. أندرويد و  آيفون كلاهما يدعم مفاتيح المرور الأصلية كمواطنين من الدرجة الأولى. ما زلنا في الأيام الأولى من كل هذا ، لكن نتوقع رؤيته مذكورًا أكثر فأكثر.

بعد كل شيء ، نلغي الحاجة إلى كلمات المرور ، وبذلك نجعل العالم أكثر أمانًا!

الموارد

فيما يلي بعض الموارد الإضافية إذا كنت تريد معرفة المزيد حول مفاتيح المرور. هناك أيضًا مستودعًا وعرضًا توضيحيًا أعددته لهذه المقالة.

بقعة_صورة

أحدث المعلومات الاستخباراتية

بقعة_صورة