Cách WhatsApp nâng cấp lên phương thức đăng nhập an toàn, liền mạch cho 1 tỷ người dùng bằng khoá truy cập
8 phút đọc
WhatsApp là nền tảng nhắn tin lớn nhất thế giới, phục vụ hàng tỷ người dùng trên toàn cầu. Đây là công cụ giao tiếp mặc định cho mọi người ở nhiều khu vực, giúp kết nối người dùng thông qua dịch vụ nhắn tin riêng tư, đáng tin cậy và bảo mật.
"Điều khiến tôi hào hứng nhất là quy mô tác động của WhatsApp. Mayank Manuja, một Kỹ sư Android trong nhóm Đăng ký và Truy cập của WhatsApp, người dẫn dắt việc thiết kế và triển khai phương thức xác thực dựa trên khoá truy cập cho WhatsApp, cho biết: "Ngay cả một điểm cải tiến nhỏ cho WhatsApp cũng tác động đến hàng tỷ người dùng trên toàn thế giới".
Để xây dựng sản phẩm cho một lượng người dùng lớn như vậy, chúng tôi cần phải xử lý nhiều điều kiện mạng, khả năng của thiết bị và mức độ kiến thức kỹ thuật số. Nhận thấy tiềm năng từ sớm, WhatsApp đã cam kết áp dụng khoá truy cập vào năm 2023 và trở thành một trong những ứng dụng tiêu dùng lớn đầu tiên tích hợp công nghệ này. Bằng cách triển khai khoá truy cập, WhatsApp hướng đến việc cung cấp một lựa chọn nhanh chóng, chống lừa đảo, giúp giảm đáng kể phiền hà cho người dùng, đồng thời bảo vệ mạnh mẽ trước hành vi chiếm đoạt tài khoản và đánh cắp thông tin đăng nhập.
Quyết định sử dụng khoá truy cập
Đối với WhatsApp, việc cung cấp nhiều phương thức truy cập là yếu tố then chốt giúp người dùng dễ dàng duy trì kết nối và lấy lại quyền truy cập khi cần. Khoá truy cập mang đến cho người dùng trải nghiệm đăng nhập đơn giản chỉ bằng một lần nhấn, giúp loại bỏ rủi ro lừa đảo và hoạt động ổn định ngay cả ở những khu vực mà việc gửi tin nhắn OTP có thể không nhất quán.
Về cơ bản, khoá truy cập sử dụng mật mã học khoá công khai-riêng tư để thay thế phương thức nhập thủ công bằng phương thức xác thực sinh trắc học hoặc khoá màn hình. Quy trình này giúp cải thiện đáng kể tốc độ đăng nhập bằng cách giảm quy trình xuống còn một lần nhấn thông qua giao diện bảng dưới cùng hợp nhất, giúp người dùng tiếp tục tương tác trong bối cảnh của ứng dụng. Lợi ích là gấp đôi: khoá truy cập mang đến cho người dùng trải nghiệm đăng nhập hợp lý, đồng thời cung cấp khả năng bảo vệ mạnh mẽ, tự nhiên trước các cuộc tấn công giả mạo. Quan trọng nhất là các phương thức này hoạt động ổn định ngay cả ở những khu vực mà việc gửi OTP qua SMS truyền thống có thể không nhất quán.
Việc có các phương thức truy cập tài khoản mạnh mẽ và đa dạng giúp đảm bảo người dùng không bao giờ bị mất quyền truy cập vào những thông tin quan trọng nhất đối với họ.
Tích hợp phía máy khách
Theo quan điểm của nhà phát triển WhatsApp, Credential Manager API cung cấp một giao diện rõ ràng, hợp nhất, giúp loại bỏ sự phức tạp của các trình cung cấp thông tin xác thực cơ bản. Sau khi vạch ra các quy trình tích hợp ban đầu, giao diện API trở nên đơn giản, với việc tạo và truy xuất thông tin xác thực theo các mẫu yêu cầu và phản hồi được xác định rõ ràng. Xem hướng dẫn triển khai trong tài liệu dành cho nhà phát triển Android.
Mặc dù hành trình suôn sẻ đã hoạt động ngay từ đầu, nhưng việc điều hướng một cơ sở người dùng đa dạng trên nhiều nhà sản xuất thiết bị gốc (OEM), nhiều phiên bản Android và nhiều cấu hình thiết bị (chẳng hạn như chỉ dùng mã PIN so với sinh trắc học hoặc Android 13 so với Android 14 trở lên) đã làm xuất hiện các trường hợp hiếm gặp chưa từng có. Những vấn đề này bao gồm người dùng không có phương thức khoá màn hình, loại ngoại lệ không mong muốn, Dịch vụ Play đã lỗi thời và hành vi không nhất quán của nhà cung cấp thông tin xác thực.
Để vượt qua những rào cản này, nhóm WhatsApp và Google đã hợp tác chặt chẽ và giải quyết một số thách thức:
- Tối ưu hoá quy trình tra cứu thông tin xác thực: Quy trình tra cứu ban đầu có độ trễ kém, đặc biệt là đối với những người dùng chưa tạo khoá truy cập. Vì phần lớn người dùng WhatsApp đều thuộc nhóm này trong giai đoạn đầu, nên việc này đã làm chậm trễ đáng kể gần như mọi lần đăng nhập. Bằng cách đo lường đường dẫn lệnh gọi và cùng nhau xác định các điểm tắc nghẽn, WhatsApp đã đẩy nhanh đáng kể quy trình, đạt được mức tăng hiệu suất và cuối cùng mang lại lợi ích cho toàn bộ hệ sinh thái Android.
- Xử lý trạng thái tạm thời: WhatsApp đã xây dựng một lớp xử lý lỗi toàn diện để giải quyết các trở ngại dành riêng cho thiết bị, chẳng hạn như khả năng sử dụng trình quản lý mật khẩu, phương thức khoá màn hình chưa được định cấu hình, vấn đề kết nối không liên tục, phần cứng không tương thích, dịch vụ Play đã lỗi thời, phân loại các trường hợp ngoại lệ thành trạng thái có thể khôi phục và trạng thái cuối cùng. Điều này cho phép xuống cấp nhẹ, nếu quy trình khoá truy cập không thể hoàn tất, hệ thống sẽ quay lại phương thức xác thực truyền thống một cách an toàn mà không khiến người dùng gặp phải trạng thái hỏng.
- Xử lý các ngoại lệ dành riêng cho hệ điều hành: Khi dữ liệu đo từ xa cho thấy các trở ngại dành riêng cho thiết bị, chẳng hạn như GetPublicKeyCredentialDomException (Không giải mã được thông tin xác thực) trên một số thiết bị Android 13 và CreatePublicKeyCredentialDomException (Không thể lấy tài khoản đồng bộ hoá) trong quá trình tạo khoá truy cập trên Android 14, Google và nhóm WhatsApp đã điều tra nguyên nhân gốc và triển khai các điểm cải tiến ở cấp nền tảng để đảm bảo quy trình tạo khoá truy cập diễn ra suôn sẻ hơn. Bạn có thể xem hướng dẫn đầy đủ về lỗi tại đây. Hướng dẫn này liệt kê các mã lỗi và nội dung mô tả phổ biến liên quan đến Trình quản lý thông tin xác thực, đồng thời cung cấp một số thông tin về nguyên nhân gây ra lỗi.
| Lưu ý: Để được hướng dẫn thêm, hãy tham khảo blog về các phương pháp hay nhất cho khoá truy cập để tìm hiểu cách tối ưu hoá trải nghiệm người dùng khi sử dụng khoá truy cập. |
Tinh chỉnh trải nghiệm người dùng
Vì khoá truy cập là một khái niệm hoàn toàn mới vào đầu năm 2023, nên chưa có mẫu nào được thiết lập để nhắc người dùng tạo khoá truy cập. Thông qua thử nghiệm A/B trên diện rộng, WhatsApp đã phát triển một khung theo bối cảnh nhắm đến những người dùng sẽ hưởng lợi nhiều nhất. Chiến lược này liên tục phát triển: khi quy trình của Hệ điều hành Android hoàn thiện thành một trải nghiệm hợp lý, trên một màn hình, WhatsApp đã đơn giản hoá các lời nhắc của riêng mình để tránh giao diện người dùng thừa thãi hoặc gây nhầm lẫn.
Kiến trúc phía máy chủ và rào cản trên nhiều nền tảng
Ở phần phụ trợ, máy chủ của WhatsApp triển khai các quy trình WebAuthn/FIDO2 tiêu chuẩn. Phần phụ trợ được viết bằng Erlang và gọi thư viện Rust webauthn-rs thông qua một giao diện gốc. Thư viện Rust này xử lý việc xác minh chữ ký và phân tích cú pháp thông tin xác thực, cho phép mã nội bộ tập trung vào việc điều phối, lưu trữ và các quy tắc sản phẩm như điều kiện, giới hạn tốc độ và vòng đời thông tin xác thực.
Kiến trúc máy chủ điều phối các nghi thức cốt lõi này thông qua 4 điểm truy cập chính, được ghép nối thành các trình tự Bắt đầu và Hoàn tất cho cả quy trình Đăng ký và Xác thực:
1. Đăng ký khoá truy cập
Trình tự này xử lý việc phát hành các tuỳ chọn tạo cho ứng dụng, xác minh chứng thực sau khi ứng dụng xác nhận đã tạo thành công và lưu trữ thông tin xác thực một cách an toàn.
Erlang: Bắt đầu đăng ký
begin_registration(UserId) ->
Existing = list_credentials(UserId),
%% reuse the existing user handle, or mint a new one
{UserHandle, IsNew} = user_handle(Existing),
%% returns the client creation options and the server-side challenge state
#{client_safe := CreationOptions, server_only := ChallengeState} =
webauthn:start_registration(UserId, UserHandle, rp_config()),
%% excludeCredentials: the user's existing credential IDs, so the device won't re-enroll one
Options = with_exclude_credentials(CreationOptions, credential_ids(Existing)),
store_challenge(UserId, ChallengeState), %% short TTL
IsNew andalso reserve_user_handle(UserId, UserHandle),
Options.- Xác định người dùng: Trước tiên, máy chủ sẽ kiểm tra mọi thông tin đăng nhập hiện có để sử dụng lại tên người dùng hiện có hoặc tạo tên người dùng mới.
- Tạo các lựa chọn và thử thách: Thao tác này gọi thư viện WebAuthn để tạo các lựa chọn tạo cho ứng dụng và trạng thái thử thách an toàn cho máy chủ.
- Ngăn chặn trùng lặp: Phương thức này loại trừ rõ ràng mã thông tin xác thực hiện có của người dùng để thiết bị không vô tình đăng ký lại khoá truy cập đã được đăng ký.
- Lưu trữ thử thách: Máy chủ tạm thời lưu trữ thử thách với thời gian tồn tại (TTL) ngắn và gửi các lựa chọn trở lại thiết bị khách.
Erlang: Hoàn tất đăng ký
finish_registration(UserId, Attestation) ->
ChallengeState = get_challenge(UserId), %% must exist and be unexpired
#{credential_id := CredId, public_key := PubKey} =
webauthn:finish_registration(Attestation, ChallengeState, rp_config()),
ok = index_credential(CredId, UserId), %% map credential_id -> account
case multi_passkey_enabled(UserId) of
true -> add_credential(UserId, CredId, PubKey); %% append (oldest evicted past the cap)
false -> replace_credential(UserId, CredId, PubKey) %% single-passkey mode
end,
notify_client(UserId, {passkey_created, CredId}),
ok.- Truy xuất thử thách: Máy chủ truy xuất thử thách đã lưu trữ, đảm bảo thử thách đó vẫn tồn tại và chưa hết hạn.
- Xác minh chứng thực: Thao tác này sẽ chuyển phản hồi của ứng dụng khách (Chứng thực) và thử thách đến thư viện WebAuthn để xác minh yêu cầu và trích xuất mã thông tin xác thực mới cũng như khoá công khai.
- Lập chỉ mục thông tin xác thực: Mã thông tin xác thực mới được liên kết trực tiếp với tài khoản của người dùng để tra cứu nhanh sau này.
- Lưu và quản lý giới hạn: Tuỳ thuộc vào việc tính năng nhiều khoá truy cập có được bật hay không, máy chủ sẽ thêm thông tin xác thực mới vào danh sách của người dùng (loại bỏ thông tin xác thực cũ nhất nếu đạt đến giới hạn) hoặc thay thế thông tin xác thực hiện có ở chế độ một khoá truy cập.
2. Xác thực thông tin đăng nhập
Tương tự như quá trình tạo, máy chủ ứng dụng xử lý quy trình xác thực bằng cách điều phối trình tự đăng nhập. Điều này bao gồm việc xác minh câu nhận định sau khi xác thực ứng dụng thành công và cập nhật linh động thông tin xác thực đã lưu trữ bất cứ khi nào WebAuthn báo hiệu cần làm mới.
Erlang: Bắt đầu xác thực
begin_authentication(UserId) ->
Credentials = list_valid_credentials(UserId),
#{client_safe := RequestOptions, server_only := ChallengeState} =
webauthn:start_authentication(Credentials, rp_config()),
store_challenge(UserId, ChallengeState), %% short TTL
RequestOptions.- Tìm nạp thông tin xác thực hợp lệ: Máy chủ tra cứu tất cả thông tin xác thực hiện hợp lệ liên kết với người dùng.
- Tạo thử thách: API này sử dụng các thông tin xác thực đó để tạo các lựa chọn yêu cầu cho ứng dụng khách và tạo một thử thách mới phía máy chủ.
- Lưu trữ và trả về: Giống như khi đăng ký, thử thách được lưu tạm thời và các tuỳ chọn yêu cầu được chuyển đến ứng dụng khách.
Erlang: Hoàn tất quy trình xác thực
finish_authentication(UserId, Assertion) ->
ChallengeState = get_challenge(UserId),
Credentials = list_valid_credentials(UserId),
case webauthn:finish_authentication(Credentials, Assertion, ChallengeState) of
#{user_verified := true, credential_id := CredId, needs_update := NeedsUpdate} = Result ->
%% webauthn tells us when the stored credential should be refreshed
NeedsUpdate andalso refresh_credential(UserId, CredId, Result),
mark_credential_used(UserId, CredId),
{ok, CredId};
_ ->
{error, not_allowed}
end.- Xác minh câu nhận định: Máy chủ truy xuất thử thách đã lưu trữ và thông tin xác thực hợp lệ, sau đó yêu cầu thư viện WebAuthn xác minh Câu nhận định của ứng dụng.
- Làm mới nếu cần: Nếu người dùng được xác minh thành công, máy chủ sẽ kiểm tra cờ needs_update. Thư viện WebAuthn sử dụng cờ này để báo hiệu liệu có cần làm mới trạng thái thông tin xác thực được lưu trữ trên máy chủ hay không.
- Hoàn tất: Máy chủ đánh dấu thông tin xác thực là đã sử dụng và hoàn tất thành công quy trình đăng nhập.
Để tìm hiểu thêm về quy trình đăng ký máy chủ, hãy làm theo hướng dẫn tích hợp tại đây.
Những điểm cần cân nhắc về cấu trúc nâng cao
Việc triển khai khoá truy cập trên máy chủ trên quy mô lớn đặt ra những thách thức riêng, đặc biệt là liên quan đến cấu trúc tài khoản và đồng bộ hoá thiết bị. Ashish Choudhary thuộc nhóm phụ trợ của WhatsApp đã nêu bật những trở ngại chính mà họ gặp phải:
- Di chuyển sang nhiều khoá truy cập cho mỗi tài khoản: Logic máy chủ cũ của WhatsApp gắn liền với giả định rằng mỗi người dùng chỉ có một thông tin xác thực. Để hỗ trợ thực tế hiện đại trên nhiều thiết bị, họ đã thiết kế một hệ thống danh sách có giới hạn, giúp loại bỏ thông tin xác thực cũ nhất một cách thông minh khi đạt đến giới hạn. Để đảm bảo độ ổn định tuyệt đối, chúng tôi đã triển khai dần dần thay đổi lớn về cấu trúc này thông qua quá trình thử nghiệm nghiêm ngặt.
- Cân bằng vòng đời thông tin xác thực: Việc quản lý hiệu lực của thông tin xác thực đòi hỏi sự tinh tế. Việc vô hiệu hoá thông tin xác thực quá mạnh tay sẽ buộc người dùng phải đăng ký lại không cần thiết, trong khi việc quá khoan dung sẽ khiến thông tin xác thực cũ bị dồn ứ. WhatsApp đã giải quyết vấn đề này bằng cách triển khai các trạng thái vòng đời cân bằng để duy trì khả năng bảo mật chặt chẽ mà không gây phiền hà cho người dùng, đồng thời bổ sung tính năng dọn dẹp tự động trong nền cho các khoá truy cập không hoạt động.
Suy nghĩ lại về tính năng đồng bộ hoá trên nhiều thiết bị
Cấu trúc nhiều khoá truy cập mạnh mẽ này cũng giúp WhatsApp hoàn toàn đổi mới khả năng hữu dụng trên nhiều nền tảng. Quy trình WebAuthn tiêu chuẩn trên nhiều thiết bị yêu cầu quét mã QR trên một thiết bị và xác thực qua Bluetooth trên một thiết bị khác. Tuy nhiên, WhatsApp nhận thấy phần phụ thuộc Bluetooth không đáng tin cậy và người dùng thường nhầm lẫn mã QR mới với quy trình liên kết WhatsApp Web hiện có.
Thay vì buộc người dùng phải sử dụng một cơ chế truyền dữ liệu giữa các thiết bị không ổn định, WhatsApp cho phép người dùng lưu giữ khoá truy cập ngay trên nhiều hệ sinh thái, chẳng hạn như Trình quản lý mật khẩu của Google trên Android và Chuỗi khoá iCloud trên iOS. Khi chuyển sang một nền tảng mới, người dùng chỉ cần tạo một khoá truy cập mới trong lần đăng nhập tiếp theo. Phương pháp này hoàn toàn không gây phiền hà cho người dùng và hoạt động liền mạch trên cơ sở hạ tầng máy chủ mới hỗ trợ nhiều khoá truy cập.
Hướng đến tương lai
Kể từ khi ra mắt khoá truy cập, WhatsApp đã chứng kiến sự gia tăng mạnh mẽ về số lượng người dùng tự nhiên trong cơ sở người dùng rộng lớn của mình. Bằng cách chuyển đổi quy trình đăng nhập nhiều bước truyền thống thành một cử chỉ sinh trắc học duy nhất, không gây phiền hà, ứng dụng đã cải thiện đáng kể trải nghiệm người dùng. Tiếp nối đà phát triển này, WhatsApp hiện đang mở rộng tiện ích khoá truy cập ra ngoài phạm vi đăng nhập ban đầu, khám phá khả năng xác thực lại liền mạch trong ứng dụng cho các hành động nhạy cảm trong tài khoản, chẳng hạn như sao lưu được mã hoá bằng khoá truy cập.
Trong tương lai, WhatsApp sẽ tích cực hợp tác với các đối tác nền tảng để tiên phong trong việc tạo ra các phương thức tạo thông tin xác thực ít rào cản hơn, đồng thời dự đoán rằng các rào cản gia nhập sẽ tự nhiên giảm bớt khi khả năng sinh trắc học của thiết bị mở rộng.
Đề xuất cho nhà phát triển xây dựng ứng dụng quy mô lớn
Đối với những nhà phát triển đang chuẩn bị tích hợp khoá truy cập trên quy mô lớn, nhóm WhatsApp chia sẻ những đề xuất quan trọng sau:
- Đầu tư sớm vào hệ thống phân loại lỗi: Phân loại nhiều trường hợp ngoại lệ của Trình quản lý thông tin xác thực thành trạng thái có thể khôi phục và trạng thái cuối, đồng thời xác định các đường dẫn dự phòng rõ ràng, linh hoạt cho từng trường hợp.
- Tìm hiểu phễu điều kiện: Triển khai các bước kiểm tra khả năng của thiết bị, chẳng hạn như sự hiện diện của phương thức khoá màn hình, phần cứng sinh trắc học và phiên bản Dịch vụ Play, đồng thời thiết kế quy trình để chủ động loại trừ những người dùng không đủ điều kiện thay vì để xảy ra lỗi giữa chừng.
- Chuẩn bị phương án dự phòng cho ứng dụng: Sử dụng khoá truy cập làm phương pháp xác thực chính tối ưu cho các thiết bị có hỗ trợ, nhưng luôn giữ lại các phương thức truyền thống làm phương án dự phòng đáng tin cậy và phổ biến.
- Lên kế hoạch cho tình trạng phân mảnh phiên bản hệ điều hành: Hành vi của khoá truy cập có thể khác nhau tuỳ theo hệ điều hành. Thử nghiệm kỹ lưỡng trên Android 13, 14 và 15 trở lên, đồng thời tính đến các biến thể dành riêng cho OEM trong giao diện người dùng lựa chọn thông tin xác thực.
- Bán thêm theo bối cảnh và hướng dẫn: Trình bày quy trình tạo khoá truy cập một cách tự nhiên trong các hành động liên quan đến bảo mật. Nhấn mạnh rõ ràng tuyên bố giá trị (tốc độ và bảo mật) bằng ngôn ngữ dễ hiểu để khuyến khích người dùng sử dụng.
- Chủ động giám sát: Hệ sinh thái phát triển theo từng bản cập nhật hệ điều hành. Liên tục theo dõi độ trễ và các mẫu lỗi để luôn nắm bắt được những thay đổi về thiết bị.
Bắt đầu sử dụng khoá truy cập và Trình quản lý thông tin xác thực
Trải nghiệm khoá truy cập và Trình quản lý thông tin xác thực trên Android bằng cách sử dụng hướng dẫn tích hợp và mã mẫu công khai của chúng tôi.
Nếu có thắc mắc hoặc vấn đề, bạn có thể chia sẻ với chúng tôi thông qua Trình theo dõi sự cố về thông tin xác thực Android.
-
Nghiên cứu điển hìnhUber đã tận dụng API Khôi phục thông tin đăng nhập của Android để đơn giản hoá quy trình đăng nhập trên thiết bị mới, dự kiến giảm 4 triệu lượt đăng nhập thủ công mỗi năm và tăng tỷ lệ giữ chân người dùng.
Niharika Arora, Tracy Agyemang • Thời gian đọc: 5 phút -
Nghiên cứu điển hìnhTừ tin nổi bật và giải trí đến thể thao và chính trị, X là một ứng dụng mạng xã hội giúp gần 500 triệu người dùng trên toàn thế giới nắm bắt toàn bộ câu chuyện cùng tất cả bình luận trực tiếp.
Niharika Arora, Tracy Agyemang • Đọc trong 3 phút -
Nghiên cứu điển hìnhGrab là siêu ứng dụng hàng đầu Đông Nam Á, cung cấp dịch vụ giao hàng, di chuyển và dịch vụ tài chính cho hàng triệu người dùng tại 8 quốc gia thông qua một ứng dụng duy nhất.
Ajesh Pai, Nguyen Van Minh, Tracy Agyemang • Thời gian đọc: 5 phút
Nhận thông tin chi tiết mới nhất về hoạt động phát triển Android trong hộp thư đến của bạn hằng tuần.