Passkey là gì? Đăng nhập không cần mật khẩu hoạt động ra sao

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Mật khẩu yếu, mật khẩu bị lộ, trang đăng nhập giả mạo: đây là những nguyên nhân phổ biến của việc mất tài khoản. Passkey ra đời để giải quyết tận gốc bằng cách thay mật khẩu bằng khóa mật mã gắn với thiết bị của bạn. Cùng tìm hiểu nó hoạt động ra sao và lập trình viên cần biết gì.

Passkey là gì?

Passkey là phương thức đăng nhập dựa trên cặp khóa mật mã: một khóa công khai lưu ở máy chủ, một khóa riêng tư nằm trên thiết bị của bạn và không bao giờ rời khỏi đó. Khi đăng nhập, thiết bị dùng khóa riêng ký một thử thách do máy chủ gửi. Bạn mở khóa bằng vân tay, khuôn mặt hoặc mã PIN của thiết bị. Passkey dựa trên chuẩn WebAuthn thuộc họ chuẩn FIDO2.

Vì sao an toàn hơn mật khẩu?

  • Chống phishing: passkey gắn với tên miền thật. Trang giả mạo có tên miền khác sẽ không nhận được chữ ký hợp lệ.
  • Không có bí mật dùng chung: máy chủ chỉ giữ khóa công khai, nên rò rỉ cơ sở dữ liệu không làm lộ thứ dùng để đăng nhập.
  • Không cần nhớ hay tái sử dụng: mỗi dịch vụ có một khóa riêng.
  • Không bị đoán hoặc dò: không có mật khẩu để tấn công vét cạn.
  • Trải nghiệm nhanh: chạm vân tay thay cho việc gõ mật khẩu.

Luồng hoạt động

  1. Đăng ký: trình duyệt yêu cầu thiết bị tạo cặp khóa cho trang web, khóa công khai được gửi về máy chủ để lưu.
  2. Đăng nhập: máy chủ gửi một chuỗi thử thách ngẫu nhiên (challenge).
  3. Thiết bị ký thử thách bằng khóa riêng sau khi bạn xác nhận sinh trắc học hoặc PIN.
  4. Máy chủ dùng khóa công khai kiểm tra chữ ký, hợp lệ thì cho đăng nhập.

Mã phía trình duyệt

Đoạn JavaScript minh họa bước tạo passkey. Giá trị challenge và thông tin người dùng phải do máy chủ sinh ra và truyền xuống; ở đây chỉ nêu cấu trúc chính:

const credential = await navigator.credentials.create({
  publicKey: {
    challenge: challengeTuMayChu,          // ArrayBuffer ngẫu nhiên từ server
    rp: { name: "Ứng dụng của tôi", id: "example.com" },
    user: {
      id: userIdTuMayChu,                  // ArrayBuffer
      name: "an@example.com",
      displayName: "Nguyễn An"
    },
    pubKeyCredParams: [{ type: "public-key", alg: -7 }],
    authenticatorSelection: { userVerification: "preferred" }
  }
});
// Gửi credential về máy chủ để xác minh và lưu khóa công khai

Bước đăng nhập dùng navigator.credentials.get() với một challenge mới. Phía máy chủ nên dùng thư viện đã được kiểm chứng để xác minh dữ liệu thay vì tự viết, vì chi tiết mật mã rất dễ sai.

Đồng bộ và dự phòng

Nhiều hệ điều hành và trình quản lý mật khẩu cho phép đồng bộ passkey giữa các thiết bị của cùng một tài khoản, tránh mất quyền truy cập khi đổi máy. Khả năng này cũng gắn với độ an toàn của tài khoản đám mây dùng để đồng bộ. Vì vậy dịch vụ vẫn nên có phương án khôi phục tài khoản an toàn.

Khi triển khai cần lưu ý

  • Cho phép song song: ban đầu giữ cả mật khẩu và passkey, khuyến khích người dùng chuyển dần.
  • Cho phép nhiều passkey trên một tài khoản và quản lý chúng (xem danh sách, xóa).
  • Quy trình khôi phục: thiết kế cẩn thận, vì đây thường là điểm yếu bị lợi dụng.
  • Kiểm tra hỗ trợ: phát hiện trình duyệt có hỗ trợ trước khi hiển thị lựa chọn.
  • Trải nghiệm rõ ràng: giải thích đơn giản cho người dùng phổ thông, vì khái niệm còn mới.

Hạn chế hiện tại

Mức độ quen thuộc của người dùng chưa cao, hệ sinh thái đồng bộ giữa các nền tảng khác nhau còn có những điểm chưa liền mạch, và việc tích hợp vào hệ thống đăng nhập cũ cần công sức. Tuy vậy, hướng đi chung của ngành là giảm phụ thuộc vào mật khẩu.

Kết luận

Passkey là bước tiến thực tế giúp đăng nhập vừa an toàn vừa tiện hơn. Nếu bạn xây dựng ứng dụng có tài khoản người dùng, hiểu WebAuthn sẽ giúp bạn chuẩn bị cho tương lai không mật khẩu.

Để học cách xây dựng hệ thống đăng nhập và bảo mật đúng chuẩn, mời bạn xem các khóa học backend tại codebem.com.

author_photo
Nguyễn Đình Cường

0 comment