فعال کردن احراز هویت قوی با WebAuthn

مشکل

فیشینگ بزرگترین مشکل امنیتی در وب است: 81٪ از موارد نقض حساب مربوط به هک در سال گذشته از رمزهای عبور ضعیف یا سرقت شده استفاده می کنند. پاسخ جمعی صنعت به این مشکل، احراز هویت چند عاملی بوده است، اما پیاده‌سازی‌ها تکه‌تکه هستند و اکثر آنها هنوز به اندازه کافی به فیشینگ رسیدگی نمی‌کنند. ما از سال 2013 با اتحاد FIDO و اخیراً با W3C برای پیاده سازی یک پروتکل استاندارد مقاوم در برابر فیشینگ که می تواند توسط هر برنامه وب استفاده شود، کار می کنیم.

WebAuthn چیست؟

Web Authentication API به برنامه‌های کاربردی وب به واسطه‌ی عامل کاربر به احراز هویت‌کننده‌ها دسترسی می‌دهد - که اغلب توکن‌های سخت‌افزاری هستند که از طریق USB/BLE/NFC یا ماژول‌هایی که مستقیماً در پلتفرم ساخته شده‌اند، به‌منظور تولید و چالش‌برانگیز کردن دامنه برنامه (eTLD+k) هستند. ) اعتبارنامه های کلید عمومی. این موارد کاربردهای مختلفی را امکان پذیر می کند، مانند:

  • اصطکاک کم و مقاوم در برابر فیشینگ 2FA (برای استفاده همراه با رمز عبور).
  • بدون رمز عبور، مجوز مجدد مبتنی بر بیومتریک.
  • اصطکاک کم و مقاوم در برابر فیشینگ 2FA بدون رمز عبور (برای استفاده در حساب های بدون رمز عبور).

این API در مسیر پیاده‌سازی بیشتر مرورگرهای اصلی قرار دارد و برای ساده‌سازی رابط کاربری در هنگام اثبات هویت آنلاین و کاهش قابل توجه فیشینگ در نظر گرفته شده است.

WebAuthn API مدیریت اعتبار را گسترش می دهد و یک نوع اعتبار جدید به نام PublicKeyCredential اضافه می کند. WebAuthn ارتباط بین مرورگر و یک احراز هویت کننده را خلاصه می کند و به کاربر اجازه می دهد:

  1. یک اعتبار کلید عمومی برای یک وب سایت ایجاد و ثبت کنید.
  2. با اثبات داشتن کلید خصوصی مربوطه، در یک وب سایت احراز هویت شوید.

احراز هویت‌کننده‌ها دستگاه‌هایی هستند که می‌توانند جفت کلید خصوصی/عمومی ایجاد کرده و رضایت را جمع‌آوری کنند. رضایت برای امضا را می توان با یک ضربه ساده، خواندن موفقیت آمیز اثر انگشت، یا با روش های دیگر تا زمانی که با الزامات FIDO2 مطابقت داشته باشد ( برنامه صدور گواهینامه برای احراز هویت توسط اتحاد FIDO وجود دارد). احراز هویت می‌تواند در پلتفرم تعبیه شود (مانند اسکنر اثر انگشت در تلفن‌های هوشمند) یا از طریق USB، بلوتوث کم انرژی (BLE) یا ارتباط میدان نزدیک (NFC) وصل شود.

چگونه کار می کند

ایجاد یک جفت کلید و ثبت نام کاربر

هنگامی که کاربر می خواهد اعتباری را در یک وب سایت ثبت کند (که WebAuthn از آن به عنوان "طرف متکی" یاد می کند):

  1. حزب متکی یک چالش ایجاد می کند.
  2. طرف متکی از مرورگر، از طریق Credential Manager API، می خواهد که یک اعتبارنامه جدید برای طرف متکی ایجاد کند و قابلیت های دستگاه را مشخص کند، به عنوان مثال، آیا دستگاه احراز هویت کاربر خود را ارائه می دهد (با بیومتریک و غیره).
  3. پس از اینکه احراز هویت کننده رضایت کاربر را به دست آورد، احراز هویت کننده یک جفت کلید ایجاد می کند و کلید عمومی و گواهی امضای اختیاری را به وب سایت برمی گرداند.
  4. برنامه وب کلید عمومی را به سرور ارسال می کند.
  5. سرور کلید عمومی را همراه با هویت کاربر ذخیره می کند تا اعتبار را برای احراز هویت آینده به خاطر بسپارد.
let credential = await navigator.credentials.create({ publicKey: {
  challenge: new Uint8Array([117, 61, 252, 231, 191, 241, ...]),
  rp: { id: "acme.com", name: "ACME Corporation" },
  user: {
    id: new Uint8Array([79, 252, 83, 72, 214, 7, 89, 26]),
    name: "jamiedoe",
    displayName: "Jamie Doe"
  },
  pubKeyCredParams: [ {type: "public-key", alg: -7} ]
}});

احراز هویت یک کاربر

زمانی که یک وب سایت نیاز به دریافت مدرکی دال بر تعامل با کاربر صحیح دارد:

  1. طرف متکی یک چالش ایجاد می‌کند و فهرستی از اعتبارنامه‌های ثبت‌شده در مرورگر را در اختیار کاربر قرار می‌دهد. همچنین می‌تواند نشان دهد که کجا باید به دنبال اعتبار بگردید، به عنوان مثال، در یک تأییدکننده داخلی داخلی، یا در یک خارجی از طریق USB، BLE و غیره.
  2. مرورگر از احراز هویت می خواهد که چالش را امضا کند.
  3. اگر احراز هویت شامل یکی از اعتبارنامه های داده شده باشد، احراز هویت پس از دریافت رضایت کاربر، یک ادعای امضا شده را به برنامه وب برمی گرداند.
  4. برنامه وب ادعای امضا شده را برای تأیید طرف متکی به سرور ارسال می کند.
  5. پس از تأیید توسط سرور، جریان احراز هویت موفق در نظر گرفته می شود.
let credential = await navigator.credentials.get({ publicKey: {
  challenge: new Uint8Array([139, 66, 181, 87, 7, 203, ...]),
  rpId: "acme.com",
  allowCredentials: [{
    type: "public-key",
    id: new Uint8Array([64, 66, 25, 78, 168, 226, 174, ...])
  }],
  userVerification: "required",
}});

خودتان WebAuthn را در https://webauthndemo.appspot.com/ امتحان کنید.

چه چیزی در پیش است؟

Chrome 67 بتای با پشتیبانی از navigator.credentials.get({publicKey: ...}) و navigator.credentials.create({publicKey:... }) عرضه می شود و استفاده از احراز هویت U2F/CTAP 1 را از طریق انتقال USB در دسک تاپ فعال می کند.

نسخه های آتی پشتیبانی از حمل و نقل های بیشتری مانند BLE و NFC و پروتکل سیمی جدیدتر CTAP 2 را اضافه خواهند کرد. ما همچنین در حال کار بر روی جریان‌های پیشرفته‌تری هستیم که توسط CTAP 2 و WebAuthn فعال شده‌اند، مانند تأیید‌کننده‌های محافظت شده با پین، انتخاب محلی حساب‌ها (به جای تایپ کردن نام کاربری یا رمز عبور)، و ثبت اثر انگشت.

توجه داشته باشید که Microsoft Edge همچنین از API پشتیبانی می کند و فایرفاکس از WebAuthn در فایرفاکس 60 پشتیبانی می کند .

منابع

ما روی مستندات دقیق تر کار می کنیم:

جلسه "چه خبرهای مربوط به ثبت نام و ورود به سیستم در وب" در Google I/O 2018 WebAuthn را پوشش داد.