Bật tính năng xác thực mạnh bằng WebAuthn

Vấn đề

Lừa đảo là vấn đề bảo mật hàng đầu trên web: 81% tài khoản có liên quan đến tin tặc vụ rò rỉ dữ liệu nào năm ngoái đều lợi dụng mật khẩu yếu hoặc bị đánh cắp. Tập thể ngành đã được xác thực đa yếu tố, nhưng Quá trình triển khai còn rời rạc và hầu hết vẫn chưa giải quyết thoả đáng tình trạng lừa đảo. Chúng tôi đã hợp tác với Liên minh FIDO kể từ năm 2013 và gần đây hơn là với W3C để triển khai giao thức chống lừa đảo mà bất kỳ ứng dụng web nào cũng có thể sử dụng.

WebAuthn là gì?

API Xác thực web cung cấp cho Web các ứng dụng do tác nhân người dùng trung gian truy cập vào trình xác thực – thường mã thông báo phần cứng được truy cập qua USB/BLE/NFC hoặc các mô-đun được tích hợp trực tiếp vào nền tảng – nhằm mục đích tạo và thử thách trong phạm vi ứng dụng (eTLD+k) thông tin xác thực khoá công khai. Việc này mang lại nhiều trường hợp sử dụng, chẳng hạn như:

  • Tính năng xác thực hai yếu tố ít gây phiền hà và chống lừa đảo (để sử dụng cùng với mật khẩu).
  • Ủy quyền lại dựa trên hệ thống nhận dạng sinh trắc học mà không cần mật khẩu.
  • Tính năng xác thực hai yếu tố ít phiền hà và chống lừa đảo không cần mật khẩu (sử dụng đối với tài khoản không có mật khẩu).

API này đang được triển khai bởi hầu hết các trình duyệt chính và nhằm vừa đơn giản hoá giao diện người dùng gặp phải khi phải chứng minh danh tính trực tuyến và sẽ giảm đáng kể tình trạng lừa đảo.

WebAuthn mở rộng API Quản lý thông tin xác thực và thêm một có tên là PublicKeyCredential. WebAuthn tóm tắt hoạt động giao tiếp giữa trình duyệt và trình xác thực và cho phép người dùng:

  1. Tạo và đăng ký thông tin xác thực khoá công khai cho một trang web.
  2. Xác thực với một trang web bằng cách chứng minh quyền sở hữu thông tin riêng tư tương ứng .

Trình xác thực là thiết bị có thể tạo cặp khoá riêng tư/công khai và thu thập đồng ý. Người dùng có thể đồng ý ký tên chỉ với một lần nhấn đơn giản đọc vân tay hoặc bằng các phương thức khác, miễn là phương thức đó tuân thủ FIDO2 (có chương trình chứng nhận cho trình xác thực của Liên minh FIDO). Trình xác thực có thể được tích hợp vào nền tảng này (chẳng hạn như trình quét vân tay trên điện thoại thông minh) hoặc được gắn thông qua USB, Bluetooth năng lượng thấp (BLE) hoặc Giao tiếp phạm vi gần (NFC).

Cách hoạt động

Tạo một cặp khoá và đăng ký người dùng

Khi người dùng muốn đăng ký thông tin xác thực với một trang web (được WebAuthn tham chiếu đến) là "bên tin cậy"):

  1. Bên đáng tin cậy tạo ra một thử thách.
  2. Bên tin cậy yêu cầu trình duyệt (thông qua API Trình quản lý thông tin xác thực) tạo thông tin đăng nhập mới cho bên đáng tin cậy, trong đó chỉ định thiết bị các khả năng, ví dụ: liệu thiết bị có cung cấp phương thức xác thực người dùng riêng hay không (bằng dữ liệu sinh trắc học, v.v.).
  3. Sau khi trình xác thực có được sự đồng ý của người dùng, trình xác thực sẽ tạo một và trả về khoá công khai cũng như chứng thực không bắt buộc đã ký cho của bạn.
  4. Ứng dụng web sẽ chuyển tiếp khoá công khai này đến máy chủ.
  5. Máy chủ lưu trữ khoá công khai, cùng với danh tính người dùng, để ghi nhớ thông tin đăng nhập để xác thực trong tương lai.
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} ]
}});

Xác thực người dùng

Khi một trang web cần lấy bằng chứng cho thấy trang web đó đang tương tác với người dùng:

  1. Bên đáng tin cậy tạo một thử thách và cung cấp cho trình duyệt một danh sách đã đăng ký cho người dùng. Thông tin này cũng có thể cho biết nơi cần tìm thông tin đăng nhập đó, chẳng hạn như trên một trình xác thực tích hợp sẵn trên máy hoặc trên một bên ngoài qua USB, BLE, v.v.
  2. Trình duyệt sẽ yêu cầu trình xác thực ký xác thực.
  3. Nếu trình xác thực chứa một trong các thông tin xác thực đã cho, thì trình xác thực đó sẽ trả về xác nhận có chữ ký cho ứng dụng web sau khi nhận được sự đồng ý của người dùng.
  4. Ứng dụng web sẽ chuyển tiếp xác nhận đã ký đến máy chủ cho bên đáng tin cậy để xác minh.
  5. Sau khi máy chủ xác minh, quy trình xác thực sẽ được xem xét thành công.
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",
}});

Hãy tự mình dùng thử WebAuthn tại https://webauthndemo.appspot.com/.

Điều gì sắp diễn ra?

Chrome 67 phiên bản beta hỗ trợ navigator.credentials.get({publicKey: ...})navigator.credentials.create({publicKey:... }), đồng thời cho phép sử dụng Trình xác thực U2F/CTAP 1 qua cổng USB trên máy tính.

Các bản phát hành sắp tới sẽ hỗ trợ thêm nhiều công cụ truyền tải như BLE, NFC và giao thức dây CTAP 2 mới hơn. Chúng tôi cũng đang nỗ lực xây dựng các quy trình nâng cao hơn được bật bằng CTAP 2 và WebAuthn, chẳng hạn như trình xác thực được bảo vệ bằng mã PIN, chọn tài khoản (thay vì nhập tên người dùng hoặc mật khẩu), và đăng ký vân tay.

Xin lưu ý rằng Microsoft Edge cũng hỗ trợ APIFirefox đang hỗ trợ WebAuthn kể từ Firefox 60.

Tài nguyên

Chúng tôi đang nỗ lực soạn thảo tài liệu chi tiết hơn:

Phiên thảo luận "Tính năng mới khi đăng ký và đăng nhập trên web" tại Google I/O 2018 đã đề cập đến WebAuthn.