Để bảo vệ hệ thống xác thực của bạn trên Android, hãy cân nhắc chuyển từ mô hình dựa trên mật khẩu, đặc biệt là đối với các tài khoản nhạy cảm như tài khoản ngân hàng và email của người dùng. Hãy nhớ rằng một số ứng dụng mà người dùng cài đặt có thể không có ý định tốt và có thể cố gắng lừa đảo người dùng của bạn.
Ngoài ra, đừng cho rằng chỉ những người dùng được uỷ quyền mới sử dụng thiết bị. Trộm điện thoại là một vấn đề thường gặp và kẻ tấn công nhắm đến các thiết bị đã mở khoá để kiếm lợi nhuận trực tiếp từ dữ liệu người dùng hoặc các ứng dụng tài chính. Tất cả các ứng dụng nhạy cảm nên triển khai thời gian chờ xác thực hợp lý (15 phút?) bằng xác minh sinh trắc học và yêu cầu xác thực bổ sung trước khi thực hiện các hành động nhạy cảm như chuyển tiền.
Hộp thoại xác thực bằng sinh trắc học
Thư viện Biometrics cung cấp một bộ hàm để hiển thị lời nhắc yêu cầu xác thực bằng sinh trắc học, chẳng hạn như nhận dạng khuôn mặt hoặc nhận dạng vân tay. Tuy nhiên, bạn có thể thiết lập lời nhắc sinh trắc học để quay lại LSKF. LSKF có những rủi ro đã biết về việc nhìn trộm. Đối với các ứng dụng nhạy cảm, bạn không nên dùng mã PIN làm phương thức dự phòng cho sinh trắc học. Sau khi hết số lần thử lại sinh trắc học, người dùng có thể đợi hoặc đăng nhập lại bằng mật khẩu hoặc đặt lại tài khoản. Quy trình đặt lại tài khoản phải yêu cầu các yếu tố không dễ truy cập trên thiết bị (phương pháp hay nhất bên dưới).
Cách này giúp giảm thiểu hành vi gian lận và trộm cắp điện thoại
Một trường hợp sử dụng cụ thể có thể giúp ngăn chặn hành vi gian lận là yêu cầu xác thực sinh trắc học trong ứng dụng của bạn trước khi thực hiện giao dịch. Khi người dùng muốn thực hiện một giao dịch tài chính, hộp thoại sinh trắc học sẽ xuất hiện để xác minh rằng người thực hiện giao dịch thực sự là người dùng dự kiến. Phương pháp hay này sẽ bảo vệ thiết bị khỏi bị kẻ tấn công đánh cắp, bất kể kẻ tấn công có biết LSKF hay không, vì chúng sẽ cần phải dò xem chúng có phải là chủ sở hữu của thiết bị hay không.
Để tăng cường các cấp độ bảo mật, nhà phát triển ứng dụng nên yêu cầu Xác thực bằng sinh trắc học cấp 3 và sử dụng CryptoObject
cho các giao dịch ngân hàng và tài chính.
Triển khai
- Đảm bảo bạn thêm thư viện androidx.biometric.
- Đưa hộp thoại đăng nhập sinh trắc học vào hoạt động hoặc mảnh chứa logic mà bạn muốn người dùng được xác thực.
Kotlin
private var executor: Executor? = null private var biometricPrompt: BiometricPrompt? = null private var promptInfo: BiometricPrompt.PromptInfo? = null fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) executor = ContextCompat.getMainExecutor(this) biometricPrompt = BiometricPrompt(this@MainActivity, executor, object : AuthenticationCallback() { fun onAuthenticationError( errorCode: Int, @NonNull errString: CharSequence ) { super.onAuthenticationError(errorCode, errString) Toast.makeText( getApplicationContext(), "Authentication error: $errString", Toast.LENGTH_SHORT ) .show() } fun onAuthenticationSucceeded( @NonNull result: BiometricPrompt.AuthenticationResult? ) { super.onAuthenticationSucceeded(result) Toast.makeText( getApplicationContext(), "Authentication succeeded!", Toast.LENGTH_SHORT ).show() } fun onAuthenticationFailed() { super.onAuthenticationFailed() Toast.makeText( getApplicationContext(), "Authentication failed", Toast.LENGTH_SHORT ) .show() } }) promptInfo = Builder() .setTitle("Biometric login for my app") .setSubtitle("Log in using your biometric credential") .setNegativeButtonText("Use account password") .build() // Prompt appears when user clicks "Log in". // Consider integrating with the keystore to unlock cryptographic operations, // if needed by your app. val biometricLoginButton: Button = findViewById(R.id.biometric_login) biometricLoginButton.setOnClickListener { view -> biometricPrompt.authenticate( promptInfo ) } }
Java
private Executor executor; private BiometricPrompt biometricPrompt; private BiometricPrompt.PromptInfo promptInfo; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); executor = ContextCompat.getMainExecutor(this); biometricPrompt = new BiometricPrompt(MainActivity.this, executor, new BiometricPrompt.AuthenticationCallback() { @Override public void onAuthenticationError(int errorCode, @NonNull CharSequence errString) { super.onAuthenticationError(errorCode, errString); Toast.makeText(getApplicationContext(), "Authentication error: " + errString, Toast.LENGTH_SHORT) .show(); } @Override public void onAuthenticationSucceeded( @NonNull BiometricPrompt.AuthenticationResult result) { super.onAuthenticationSucceeded(result); Toast.makeText(getApplicationContext(), "Authentication succeeded!", Toast.LENGTH_SHORT).show(); } @Override public void onAuthenticationFailed() { super.onAuthenticationFailed(); Toast.makeText(getApplicationContext(), "Authentication failed", Toast.LENGTH_SHORT) .show(); } }); promptInfo = new BiometricPrompt.PromptInfo.Builder() .setTitle("Biometric login for my app") .setSubtitle("Log in using your biometric credential") .setNegativeButtonText("Use account password") .build(); // Prompt appears when the user clicks "Log in". // Consider integrating with the keystore to unlock cryptographic operations, // if needed by your app. Button biometricLoginButton = findViewById(R.id.biometric_login); biometricLoginButton.setOnClickListener(view -> { biometricPrompt.authenticate(promptInfo); }); }
Các phương pháp hay nhất
Bạn nên bắt đầu với lớp học lập trình để tìm hiểu thêm về sinh trắc học.
Tuỳ thuộc vào trường hợp sử dụng, bạn có thể triển khai hộp thoại có hoặc không có hành động rõ ràng của người dùng. Để tránh gian lận, bạn nên thêm hộp thoại sinh trắc học với hành động rõ ràng của người dùng cho mọi giao dịch. Chúng tôi hiểu rằng việc thêm bước xác thực có thể gây khó chịu cho trải nghiệm người dùng, nhưng do bản chất của thông tin được xử lý trong giao dịch ngân hàng và việc xác thực bằng sinh trắc học diễn ra suôn sẻ hơn các phương thức xác thực khác, nên chúng tôi cho rằng cần phải thêm cấp độ điều hướng này.
Tìm hiểu thêm về quy trình xác thực bằng sinh trắc học.
Khoá truy cập
Khoá truy cập là một phương thức thay thế an toàn và đơn giản hơn so với mật khẩu. Khoá truy cập sử dụng mật mã khoá công khai để cho phép người dùng đăng nhập vào các ứng dụng và trang web bằng cơ chế khoá màn hình của thiết bị, chẳng hạn như vân tay hoặc công nghệ nhận dạng khuôn mặt. Điều này giúp người dùng không phải nhớ và quản lý mật khẩu, đồng thời cải thiện đáng kể tính bảo mật.
Mã khoá có thể đáp ứng các yêu cầu về xác thực đa yếu tố chỉ trong một bước, thay thế cả mật khẩu và mã OTP để mang lại khả năng bảo vệ mạnh mẽ trước các cuộc tấn công giả mạo và tránh gây khó chịu cho người dùng khi sử dụng mật khẩu một lần dựa trên SMS hoặc ứng dụng. Vì khoá truy cập được chuẩn hoá, nên một quy trình triển khai duy nhất sẽ mang đến trải nghiệm không cần mật khẩu trên tất cả thiết bị, trình duyệt và hệ điều hành của người dùng.
Trên Android, khoá truy cập được hỗ trợ bằng thư viện Jetpack Credential Manager. Thư viện này hợp nhất các phương thức xác thực chính, bao gồm khoá truy cập, mật khẩu và quy trình đăng nhập liên kết (chẳng hạn như Đăng nhập bằng Google).
Cách này giúp giảm thiểu hành vi gian lận
Khoá truy cập bảo vệ bạn khỏi các cuộc tấn công giả mạo vì khoá này chỉ hoạt động trên những ứng dụng và trang web đã được đăng ký.
Thành phần cốt lõi của khoá truy cập là khoá riêng tư mã hoá. Thông thường, khoá riêng tư này chỉ nằm trên các thiết bị của bạn, chẳng hạn như máy tính xách tay hoặc điện thoại di động, và được đồng bộ hoá trên các thiết bị đó bằng trình cung cấp thông tin đăng nhập (còn gọi là trình quản lý mật khẩu), chẳng hạn như Trình quản lý mật khẩu của Google. Chỉ khoá công khai tương ứng được dịch vụ trực tuyến lưu khi một khoá truy cập được tạo. Trong quá trình đăng nhập, dịch vụ này sử dụng khoá riêng tư để ký một thử thách từ khoá công khai. Yêu cầu này chỉ có thể bắt nguồn từ một trong các thiết bị của bạn. Ngoài ra, để điều này xảy ra, bạn phải mở khoá thiết bị hoặc kho lưu trữ thông tin đăng nhập. Việc này giúp ngăn chặn các lượt đăng nhập trái phép (ví dụ: từ điện thoại bị đánh cắp).
Để ngăn chặn truy cập trái phép trong trường hợp thiết bị bị đánh cắp và chưa khoá, khoá truy cập phải được kết hợp với một khoảng thời gian chờ xác thực hợp lý. Kẻ tấn công đánh cắp thiết bị không được phép sử dụng ứng dụng chỉ vì người dùng trước đó đã đăng nhập. Thay vào đó, thông tin đăng nhập sẽ hết hạn theo định kỳ (chẳng hạn như sau mỗi 15 phút) và người dùng phải xác minh danh tính của mình thông qua quy trình xác thực lại bằng khoá màn hình.
Nếu điện thoại của bạn bị đánh cắp, khoá truy cập sẽ bảo vệ bạn vì kẻ trộm không thể đánh cắp mật khẩu của bạn để sử dụng trên các thiết bị khác – khoá truy cập chỉ dành riêng cho từng thiết bị. Nếu dùng Trình quản lý mật khẩu của Google và điện thoại của bạn bị đánh cắp, bạn có thể đăng nhập vào Tài khoản Google của mình trên một thiết bị khác (chẳng hạn như máy tính) rồi đăng xuất từ xa khỏi điện thoại bị đánh cắp. Thao tác này sẽ khiến Trình quản lý mật khẩu của Google trên điện thoại bị đánh cắp không dùng được, kể cả mọi khoá truy cập đã lưu.
Trong trường hợp xấu nhất, nếu thiết bị bị đánh cắp không được thu hồi, thì trình cung cấp thông tin đăng nhập đã tạo và đồng bộ hoá khoá truy cập sẽ đồng bộ hoá khoá truy cập trở lại thiết bị mới. Ví dụ: người dùng có thể đã chọn Trình quản lý mật khẩu của Google để tạo khoá truy cập và họ có thể truy cập vào khoá truy cập của mình trên một thiết bị mới bằng cách đăng nhập lại vào Tài khoản Google và cung cấp phương thức khoá màn hình từ thiết bị trước.
Tìm hiểu thêm trong bài viết Tính bảo mật của khoá truy cập trong Trình quản lý mật khẩu của Google.
Triển khai
Khoá truy cập được hỗ trợ trên các thiết bị chạy Android 9 (API cấp 28) trở lên. Mật khẩu và tính năng Đăng nhập bằng Google được hỗ trợ từ Android 4.4. Để bắt đầu dùng khoá truy cập, hãy làm theo các bước sau:
- Làm theo lớp học lập trình Trình quản lý thông tin xác thực để nắm được kiến thức ban đầu về cách triển khai khoá truy cập.
- Xem nguyên tắc thiết kế trải nghiệm người dùng cho khoá truy cập. Tài liệu này cho biết những quy trình được đề xuất cho trường hợp sử dụng của bạn.
- Nghiên cứu Trình quản lý thông tin xác thực bằng cách làm theo hướng dẫn.
- Lên kế hoạch triển khai Trình quản lý thông tin đăng nhập và khoá truy cập cho ứng dụng của bạn. Lên kế hoạch thêm tính năng hỗ trợ cho Digital Asset Links.
Hãy xem tài liệu dành cho nhà phát triển của chúng tôi để biết thêm thông tin chi tiết về cách tạo, đăng ký và xác thực bằng khoá truy cập.
Đặt lại tài khoản một cách an toàn
Kẻ tấn công trái phép có quyền truy cập vào một thiết bị đã mở khoá (chẳng hạn như khi điện thoại bị giật) sẽ cố gắng truy cập vào các ứng dụng nhạy cảm, đặc biệt là ứng dụng ngân hàng hoặc ứng dụng tiền mặt. Nếu ứng dụng triển khai quy trình xác minh sinh trắc học, kẻ tấn công sẽ cố gắng đặt lại tài khoản để xâm nhập. Quy trình đặt lại tài khoản không được chỉ dựa vào thông tin dễ truy cập trên thiết bị, chẳng hạn như email hoặc đường liên kết đặt lại OTP qua SMS.
Dưới đây là những phương pháp hay nhất thường dùng mà bạn có thể kết hợp vào quy trình đặt lại của ứng dụng:
- Nhận dạng khuôn mặt, ngoài OTP
- Câu hỏi bảo mật
- Yếu tố kiến thức (chẳng hạn như tên thời con gái của mẹ, thành phố nơi bạn sinh ra hoặc bài hát yêu thích)
- Xác minh bằng giấy tờ tuỳ thân
SMS Retriever API
SMS Retriever API cho phép bạn tự động thực hiện quy trình xác minh người dùng dựa trên SMS trong ứng dụng Android. Bằng cách đó, người dùng sẽ không cần phải nhập mã xác minh theo cách thủ công. Ngoài ra, API này không yêu cầu người dùng cấp thêm các quyền ứng dụng có thể gây nguy hiểm như RECEIVE_SMS
hoặc READ_SMS
. Tuy nhiên, bạn không nên chỉ dùng SMS để xác minh người dùng nhằm ngăn chặn hành vi truy cập trái phép vào thiết bị.
Cách này giúp giảm thiểu hành vi gian lận
Một số người dùng chỉ sử dụng mã SMS làm yếu tố xác thực duy nhất, điều này tạo ra một điểm xâm nhập dễ dàng cho hành vi gian lận.
SMS Retriever API cho phép ứng dụng trực tiếp truy xuất mã SMS mà không cần người dùng tương tác và có thể cung cấp một mức độ bảo vệ chống lại hành vi gian lận.
Triển khai
Có hai phần để triển khai SMS Retriever API: Android và Máy chủ.
Android: (hướng dẫn)
- Lấy số điện thoại của người dùng.
- Khởi động ứng dụng truy xuất SMS.
- Gửi số điện thoại đến máy chủ của bạn.
- Nhận tin nhắn xác minh.
- Gửi mã OTP đến máy chủ của bạn.
Máy chủ: (hướng dẫn)
- Tạo một thông báo xác minh.
- Gửi tin nhắn xác minh bằng SMS.
- Xác minh OTP khi OTP được trả về.
Các phương pháp hay nhất
Sau khi ứng dụng được tích hợp và số điện thoại của người dùng được xác minh bằng SMS Retriever API, ứng dụng sẽ cố gắng lấy OTP. Nếu thành công, đó là một tín hiệu mạnh mẽ cho thấy SMS đã được nhận trên thiết bị một cách tự động. Nếu không thành công và người dùng cần nhập OTP theo cách thủ công, thì đó có thể là dấu hiệu cảnh báo rằng người dùng có thể đang gặp phải hành vi gian lận.
Bạn không nên dùng SMS làm cơ chế xác minh người dùng duy nhất vì điều này tạo cơ hội cho các cuộc tấn công cục bộ, chẳng hạn như kẻ tấn công cướp thiết bị đang mở khoá hoặc các cuộc tấn công sao chép SIM. Bạn nên sử dụng Dữ liệu sinh trắc học bất cứ khi nào có thể. Trên những thiết bị không có Cảm biến sinh trắc học, hoạt động xác thực người dùng phải dựa vào ít nhất một yếu tố không dễ dàng lấy được từ thiết bị hiện tại.
Tìm hiểu thêm
Để đọc thêm về các phương pháp hay nhất, hãy xem các tài nguyên sau:
- Tài liệu của chúng tôi về Bảo mật trên Android
- Tài liệu về API Tính toàn vẹn của Play
- Các thay đổi trên Android 15
- Các phương pháp hay nhất để ngăn chặn cuộc gọi lừa đảo của Ngân hàng Monzo