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 việc ngừng áp dụng là 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ư ngân hàng và tài khoản email. Hãy nhớ rằng một số ứng dụng mà người dùng của bạn cài đặt có thể không có có ý định tốt nhất và có thể tìm cách tấn công giả mạ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 được thiết bị. Trộm cắp điện thoại là một vấn đề thường gặp và những kẻ tấn công nhắm đến các thiết bị đã mở khoá để trực tiếp thu lợi dữ liệu 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 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ư tiền chuyển cuộc gọi.

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 để cho thấy 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 đã những rủi ro lướt sóng vai đã biết. Đối với các ứng dụng nhạy cảm, không có hệ thống nhận dạng sinh trắc học quay lại dùng mã PIN và sau khi thử lại hết dữ liệu 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. Đặt lại tài khoản phải cần những yếu tố không dễ tiếp cận trên thiết bị (phương pháp hay nhất bên dưới).

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 bạn 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 đó thực sự là người dùng dự định thực hiện giao dịch. Chiến dịch này phương pháp hay nhất sẽ giúp chống lại kẻ tấn công và việc lấy cắp thiết bị bất kể kẻ tấn công có biết hay không biết LSKF, vì chúng sẽ cần thăm dò rằng chúng chủ sở hữu thiết bị.

Để tăng cường bảo mật, nhà phát triển ứng dụng nên yêu cầu Loại 3 Xác thực bằng sinh trắc học và sử dụng CryptoObject để ngân hàng và giao dịch 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 lưu giữ logic mà bạn muốn xác thực người dùng.

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 của mình, bạn có thể triển khai hộp thoại có hoặc không có của người dùng. Để tránh gian lận, bạn nên thêm dữ liệu sinh trắc học hộp thoại kèm theo hành động rõ ràng của người dùng đối với 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, nhưng do bản chất của thông tin được xử lý trong giao dịch ngân hàng và thông tin sinh trắc học đó thì việc xác thực mượt mà hơn các phương pháp xác thực khác. Chúng tôi cho rằng việc này để 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. Sử dụng khoá truy cập 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ư vân tay hoặc khuôn mặt nhận dạng cá nhân. Điều này giúp người dùng không phải nhớ và quản lý mật khẩu. và cung cấp khả năng bảo mật được cải thiện đáng kể.

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ẽ tấn công giả mạo và tránh gây phiền hà cho người dùng khi sử dụng tin nhắn SMS hoặc ứng dụng một lần mật khẩu. Vì khoá truy cập được chuẩn hoá, nên việc triển khai duy nhất cho phép của tất cả người dùng mà không cần mật khẩu thiết bị, trình duyệt và hệ điều hành.

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

Để ngăn chặn hành vi truy cập trái phép trong trường hợp thiết bị bị đánh cắp, đã mở khoá, bạn phải kết hợp khoá truy cập với một khoảng thời gian chờ xác thực hợp lý. Một kẻ tấn công đánh cắp thiết bị sẽ không thể sử dụng ứng dụng 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 được bạn phải xác minh danh tính của mình thông qua chính sá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 điện thoại của bạn để sử dụng mật khẩu trên các thiết bị khác – khoá truy cập dành riêng cho từng 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, nên bạn có thể đăng nhập vào tài khoản Google của mình Tài khoản 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. 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 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, khoá truy cập sẽ bị được đồng bộ hoá trở lại với thiết bị mới bởi nhà cung cấp thông tin xác thực đã tạo và đồng bộ hoá khoá truy cập. 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 khoá truy cập của mình trên một thiết bị mới bằng cách ký quay lại Tài khoản Google của họ và cung cấp phương thức khoá màn hình thiết bị.

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. Người nhận hãy làm theo các bước sau để bắt đầu sử dụng khoá truy cập:

  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. 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 dành cho nhà phát triển của chúng tôi để biết thêm thông tin 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 điện thoại bị lấy cắp) sẽ tìm cách 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ố đặt lại tài khoản cần truy cập. Quy trình đặt lại tài khoản không chỉ dựa vào vào thông tin có thể dễ dàng truy cập trên thiết bị, chẳng hạn như email hoặc OTP qua tin nhắn SMS đặt lại liên kết.

Sau đây là các phương pháp hay nhất, phổ biến mà bạn có thể áp dụng vào quá trình đặt lại ứng dụng luồ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 hoặc mục yêu thích bài hát)
  • Xác minh bằng giấy tờ tuỳ thân

API Retriever SMS

SMS Retriever API cho phép bạn thực hiện quy trình xác minh người dùng dựa trên SMS trong ứng dụng Android tự động. Bằng cách đó, người dùng không cần tự nhập mã xác minh. Ngoài ra, API này không yêu cầu người dùng để cấp các quyền cho ứng dụng bổ sung, 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 để bảo vệ thiết bị khỏi hành vi truy cập trái phép 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, dễ bị lừa đảo.

SMS Retriever API cho phép ứng dụng truy xuất trực tiếp mã SMS mà không cần tương tác của người dùng và có thể cung cấp mức độ bảo vệ chống 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ử dụng tính năng xác minh số điện thoại của người dùng SMS Retriever API, nó sẽ cố gắng lấy OTP. Nếu thành công, đó là nỗ lực tín hiệu cho biết tin nhắn SMS đó đã được nhận tự động trên thiết bị. Nếu không thành công và người dùng cần tự nhập OTP, đó có thể là dấu hiệu cảnh báo mà người dùng có thể đang gặp phải 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 không còn khả năng sử dụng đến 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ị đã mở khoá; hoặc SIM nhân bản. 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ể. Bật những thiết bị không có cảm biến sinh trắc học, thì quy trình xác thực người dùng dựa vào ít nhất một yếu tố không dễ dàng đạt đượ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: