Xác thực người dùng một cách an toàn

Để bảo vệ hệ thống xác thực của bạn trong Android, hãy cân nhắc không dùng mô hình dựa trên mật khẩu, đặc biệt đối với các tài khoản nhạy cảm như tài khoản ngân hàng và tài khoản 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 nhất và có thể tìm cách tấn công giả mạo người dùng.

Ngoài ra, đừng cho rằng chỉ những người dùng được uỷ quyền mới sử dụng được thiết bị. Lấy cắp điện thoại là một vấn đề phổ biến và những kẻ tấn công thường nhắm đến các thiết bị đã mở khoá để thu lợi trực tiếp từ dữ liệu của người dùng hoặ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?) với tính năng xác minh bằng sinh trắc học, đồng thời 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 Sinh trắc học cung cấp một tập hợp các chức năng để 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ể định cấu hình các lời nhắc sinh trắc học để quay lại dùng LSKF, vốn có các rủi ro đã biết khi lướt mạng vai. Đối với các ứng dụng nhạy cảm, không nên quay lại sử dụng mã PIN bằng dữ liệu sinh trắc học. Sau khi thử hết các lần thử lại bằng sinh trắc học, người dùng có thể chờ hoặc đăng nhập lại bằng mật khẩu hoặc đặt lại tài khoản. Việc đặt lại tài khoản phải đòi hỏi các yếu tố không dễ truy cập trên thiết bị (phương pháp hay nhất dưới đây).

Cách tính năng này giúp giảm thiểu hành vi gian lận và hành vi lấy cắp điện thoại

Một trường hợp sử dụng cụ thể có thể hữu ích để ngăn chặn hành vi gian lận là yêu cầu xác thực bằng sinh trắc học trong ứng dụng của bạn trước khi giao dịch. Khi người dùng của bạn muốn thực hiện 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 đó thực sự là người dùng dự định thực hiện giao dịch. Phương pháp hay nhất này sẽ giúp ngăn chặn kẻ tấn công đánh cắp thiết bị bất kể kẻ tấn công đó có biết LSKF hay không, vì chúng sẽ cần thăm dò rằng họ là chủ sở hữu thiết bị.

Để tăng cường bảo mật, các nhà phát triển ứng dụng nên yêu cầu Xác thực sinh trắc học Lớ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

  1. Đừng quên thêm thư viện androidx.biometric.
  2. Đưa hộp thoại đăng nhập bằng 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 từ lớp học lập trình này để tìm hiểu thêm về hệ thống nhận dạng 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 hành vi gian lận, bạn nên thêm hộp thoại sinh trắc học với thao tác 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 phương thức xác thực có thể gây phiền hà cho trải nghiệm người dùng. Tuy nhiên, do bản chất của thông tin được xử lý trong giao dịch ngân hàng và quá trình xác thực bằng sinh trắc học diễn ra suôn sẻ hơn so với các phương thức xác thực khác, 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ề tính năng 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 tiêu chuẩn mã hoá 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ư nhận dạng vân tay hoặc khuôn mặt. Điều này giúp người dùng không phải ghi nhớ và quản lý mật khẩu, đồng thời cải thiện đáng kể khả năng bảo mật.

Khoá truy cập 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 tin nhắn SMS hoặc mật khẩu một lần dựa trên ứng dụng. Vì khoá truy cập được chuẩn hoá, nên việc triển khai duy nhất mang lại 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 Trình quản lý thông tin xác thực giúp hợp nhất các phương thức xác thực chính, trong đó có khoá truy cập, mật khẩu và phương thức đăng nhập liên kết (chẳng hạn như Đăng nhập bằng Google).

Cách điều này giúp giảm thiểu hành vi gian lận

Khoá truy cập giú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 đã đăng ký.

Thành phần chính của khoá truy cập là một khoá riêng tư được 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á giữa các nhà cung cấp thông tin xác thực (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. Dịch vụ trực tuyến chỉ lưu khoá công khai tương ứng khi tạo khoá truy cập. Trong quá trình đăng nhập, dịch vụ sẽ sử dụng khoá riêng tư để ký xác thực từ khoá công khai. Quá trình 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, để xảy ra trường hợp này, bạn phải mở khoá kho lưu trữ thông tin xác thực hoặc thiết bị của mình để ngăn chặn hành vi đăng nhập trái phép (ví dụ: từ điện thoại bị đánh cắp).

Để ngăn chặn việc truy cập trái phép trong trường hợp một thiết bị đã bị đánh cắp và đã mở 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ị sẽ không thể sử dụng ứng dụng chỉ vì người dùng trước đó đã đăng nhập. Thay vào đó, thông tin xác thực sẽ hết hạn theo định kỳ (chẳng hạn như 15 phút một lần) và người dùng cần phải xác minh danh tính của mình bằng cách xác thực lại phương thức 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ể lấy cắp mật khẩu của bạn để dùng trên các thiết bị khác – khoá truy cập dành riêng cho thiết bị. Nếu bạn sử 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 từ một thiết bị khác (như máy tính) và đăng xuất từ xa khỏi điện thoại bị đánh cắp. Khi đó, Trình quản lý mật khẩu của Google trên điện thoại bị đánh cắp sẽ không sử 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 khôi phục được, thì khoá truy cập sẽ được trình cung cấp thông tin xác thực đã tạo và đồng bộ hoá khoá truy cập đồng bộ hoá trở lại vớ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. 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 trên thiết bị trước đó.

Hãy 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. Tính năng Mật khẩu và tính năng Đăng nhập bằng Google sẽ được hỗ trợ trên Android 4.4. Để bắt đầu sử dụng khoá truy cập, hãy làm theo các bước sau:

  1. Làm theo lớp học lập trình về Trình quản lý thông tin xác thực để tìm hiểu ban đầu về cách triển khai khoá truy cập.
  2. Xem nguyên tắc thiết kế trải nghiệm người dùng của khoá truy cập. Tài liệu này cho bạn biết quy trình nào được đề xuất cho trường hợp sử dụng của bạn.
  3. Tìm hiểu về Trình quản lý thông tin xác thực bằng cách làm theo hướng dẫn.
  4. Lập kế hoạch triển khai Trình quản lý thông tin xác thực và khoá truy cập cho ứng dụng của bạn. Hãy lên kế hoạch hỗ trợ thêm Đường liên kết đến tài sản kỹ thuật số.

Hãy xem tài liệu của chúng tôi dành cho nhà phát triển để 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.

Bảo mật đặt lại tài khoả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 bị giật điện thoại) sẽ cố 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 phương thức xác minh bằng sinh trắc học, kẻ tấn công sẽ cố gắng đặt lại tài khoản để truy cập. Điều quan trọng là quy trình đặt lại tài khoản không chỉ dựa vào thông tin có thể dễ dàng truy cập trên thiết bị, chẳng hạn như đường liên kết đặt lại OTP qua email hoặc SMS.

Dưới đây là các phương pháp hay nhất, phổ biến mà bạn có thể áp dụng vào quy trình đặt lại của ứng dụng:

  • Nhận dạng khuôn mặt, cùng vớ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ố sinh ra hoặc bài hát yêu thích)
  • Xác minh bằng giấy tờ tuỳ thân

API Retriever SMS

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 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 cho ứ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 sử dụng SMS làm phương thức xác minh người dùng duy nhất để ngăn chặn hành vi truy cập trái phép trên máy vào thiết bị.

Cách điều này giúp giảm thiểu hành vi gian lận

Một số người dùng sử dụng mã SMS làm yếu tố xác thực duy nhất, khiến họ dễ dàng truy cập vào hành vi gian lận.

SMS Retriever API cho phép ứng dụng truy xuất trực tiếp mã SMS mà không cần sự tương tác của người dùng, đồng thời 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à Server.

Android: (hướng dẫn)

  1. Lấy số điện thoại của người dùng.
  2. Khởi động ứng dụng SMS retriever.
  3. Gửi số điện thoại đến máy chủ của bạn.
  4. Nhận tin nhắn xác minh.
  5. Gửi OTP đến máy chủ của bạn.

Máy chủ: (hướng dẫn)

  1. Tạo thông báo xác minh.
  2. Gửi tin nhắn xác minh qua SMS.
  3. 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 đang được xác minh bằng SMS Retriever API, ứng dụng sẽ cố gắng nhận OTP. Nếu thành công, đó là một tín hiệu mạnh mẽ cho thấy tin nhắn SMS đã được tự động nhận trên thiết bị. Nếu không thành công và người dùng cần nhập OTP theo cách thủ công, đó có thể là một dấu hiệu cảnh báo cho biết có thể người dùng đang gặp phải hành vi gian lận.

Bạn không nên sử dụng SMS làm cơ chế xác minh người dùng duy nhất vì cơ chế này tạo điều kiện cho các cuộc tấn công cục bộ, chẳng hạn như kẻ tấn công chiếm đoạt thiết bị đã mở khoá; hoặc các cuộc tấn công nhân bản SIM. Bạn nên sử dụng hệ thống nhận dạng sinh trắc học bất cứ khi nào có thể. Trên các thiết bị không có cảm biến sinh trắc học, việc 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 có đượ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: