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% các vụ xâm nhập tài khoản liên quan đến hành vi tấn công trong năm ngoái là lợi dụng mật khẩu yếu hoặc mật khẩu bị đánh cắp. Phản hồi chung của ngành đối với vấn đề này là xác thực đa yếu tố, nhưng các hoạt động triển khai còn rời rạc và hầu hết vẫn không giải quyết được thoả đáng hành vi lừa đảo. Chúng tôi đã hợp tác với Liên minh FIDO từ năm 2013 và gần đây hơn là W3C để triển khai một giao thức chuẩn hoá chống lừa đảo mà mọi ứng dụng web đều sử dụng được.

WebAuthn là gì?

API xác thực web cấp cho ứng dụng web quyền truy cập qua trình xác thực qua trung gian tác nhân người dùng (thường là 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ách thức thông tin xác thực khoá công khai (eTLD+k) trong phạm vi ứng dụng. Điều này tạo ra nhiều trường hợp sử dụng, chẳng hạn như:

  • 2FA có độ ma sát thấp và chống lừa đảo (dùng cùng với mật khẩu).
  • Uỷ quyền lại dựa trên hệ thống nhận dạng sinh trắc học không cần mật khẩu.
  • Tính năng xác thực hai yếu tố linh hoạt và chống lừa đảo không cần mật khẩu (dùng cho các tài khoản không cần mật khẩu).

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

WebAuthn mở rộng API Quản lý thông tin xác thực và thêm một loại thông tin xác thực mới 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, đồng thời 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 khoá riêng tư tương ứng.

Trình xác thực là các thiết bị có thể tạo các cặp khoá riêng tư/công khai và thu thập sự đồng ý. Bạn có thể đồng ý ký bằng một lần nhấn đơn giản, đọc vân tay thành công hoặc bằng các phương thức khác, miễn là tuân thủ các yêu cầu của FIDO2 (có một chương trình chứng nhận dành cho trình xác thực của Liên minh FIDO). Bạn có thể tích hợp trình xác thực vào nền tảng (chẳng hạn như trình quét vân tay trên điện thoại thông minh) hoặc gắn vào 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 thức 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 cho một trang web (được WebAuthn gọi là "bên đáng tin cậy"):

  1. Bên phụ thuộc tạo ra một thử thách.
  2. Bên phụ thuộc sẽ 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 một thông tin xác thực mới cho bên phụ thuộc, chỉ định các tính năng của thiết bị, chẳng hạn như liệu thiết bị có cung cấp thông tin xác thực người dùng của riêng mình (bằng hệ thống nhận dạng sinh trắc học, v.v.) hay không.
  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 cặp khoá và trả về khoá công khai cũng như chứng thực có chữ ký (không bắt buộc) cho trang web.
  4. Ứng dụng web sẽ chuyển tiếp khoá công khai đế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 xác thực cho các lần 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 có bằng chứng cho thấy trang web đó đang tương tác với đúng người dùng:

  1. Bên phụ thuộc tạo ra một thử thách và cung cấp cho trình duyệt danh sách thông tin xác thực đã đăng ký cho người dùng. Tệp này cũng có thể cho biết nơi cần tìm thông tin xác thực, chẳng hạn như trên trình xác thực tích hợp cục bộ hoặc trên thiết bị 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ý tên 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ề câu nhận định đã ký cho ứng dụng web sau khi được người dùng đồng ý.
  4. Ứng dụng web sẽ chuyển tiếp câu nhận định đã ký đến máy chủ để bên phụ thuộc xác minh.
  5. Sau khi được máy chủ xác minh, quy trình xác thực được coi là 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 thử WebAuthn tại https://webauthndemo.appspot.com/.

Bạn cần làm gì?

Chrome 67 beta đi kèm với khả năng 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 thiết bị truyền 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 mạng truyền tải như BLE và NFC, cũng như giao thức dây CTAP 2 mới hơn. Chúng tôi cũng đang nghiên cứu các quy trình nâng cao hơn do CTAP 2 và WebAuthn hỗ trợ, chẳng hạn như trình xác thực được bảo vệ bằng mã PIN, lựa chọn cục bộ về 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.

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 nghiên cứu tài liệu chi tiết hơn:

Phiên "What's new with sign-up and sign-in on the web" (Tính năng mới với việc đăng ký và đăng nhập trên web) tại Google I/O 2018 đã đề cập đến WebAuthn.