Otentikasi pengguna yang aman

Untuk melindungi sistem autentikasi di Android, sebaiknya beralih dari model berbasis sandi, terutama untuk akun sensitif seperti rekening bank dan email pengguna. Perlu diingat bahwa beberapa aplikasi yang diinstal pengguna mungkin tidak memiliki niat terbaik dan mungkin mencoba melakukan phishing terhadap pengguna.

Selain itu, jangan berasumsi bahwa hanya pengguna yang diotorisasi yang akan menggunakan perangkat. Pencurian ponsel adalah masalah umum, dan penyerang menargetkan perangkat yang tidak terkunci untuk mendapatkan keuntungan langsung dari data pengguna atau aplikasi keuangan. Sebaiknya semua aplikasi yang sensitif menerapkan waktu tunggu autentikasi yang wajar (15 menit?) dengan verifikasi biometrik dan memerlukan autentikasi tambahan sebelum tindakan sensitif seperti transfer uang.

Dialog autentikasi biometrik

Library Biometrik menawarkan serangkaian fungsi untuk menampilkan perintah yang meminta autentikasi biometrik seperti pengenalan wajah atau pengenalan sidik jari. Namun, perintah biometrik dapat dikonfigurasi untuk kembali ke LSKF, yang memiliki risiko penjelajahan bahu yang diketahui. Untuk aplikasi sensitif, sebaiknya jangan beralih kembali ke PIN biometrik, dan setelah upaya biometrik habis, pengguna dapat menunggu, atau login kembali dengan sandi atau mereset akun. Reset akun harus mewajibkan faktor yang tidak mudah diakses di perangkat (praktik terbaik di bawah).

Bagaimana hal ini membantu mencegah penipuan dan pencurian telepon

Satu kasus penggunaan tertentu yang dapat membantu mencegah penipuan adalah meminta autentikasi biometrik dalam aplikasi Anda sebelum transaksi. Ketika pengguna Anda ingin melakukan transaksi keuangan, dialog biometrik akan muncul untuk memverifikasi bahwa memang pengguna yang dituju yang melakukan transaksi tersebut. Praktik terbaik ini akan melindungi dari penyerang yang mencuri perangkat, terlepas dari penyerang mengetahui atau tidak mengetahui LSKF, karena mereka perlu menyelidiki bahwa mereka adalah pemilik perangkat tersebut.

Untuk tingkat keamanan tambahan, sebaiknya developer aplikasi meminta Autentikasi Biometrik Kelas 3 dan menggunakan CryptoObject untuk transaksi perbankan dan keuangan.

Penerapan

  1. Pastikan Anda menyertakan library androidx.biometric.
  2. Sertakan dialog login biometrik dalam aktivitas atau fragmen yang menyimpan logika yang Anda inginkan untuk diautentikasi pengguna.

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);
    });
}

Praktik terbaik

Sebaiknya mulai dengan codelab untuk mengetahui selengkapnya tentang biometrik.

Bergantung pada kasus penggunaan, Anda dapat menerapkan dialog dengan atau tanpa tindakan pengguna yang eksplisit. Untuk menghindari penipuan, sebaiknya tambahkan dialog biometrik dengan tindakan pengguna yang eksplisit untuk setiap transaksi. Kami memahami bahwa menambahkan autentikasi dapat menimbulkan hambatan dalam UX, tetapi karena sifat informasi ditangani dalam transaksi bank dan autentikasi biometrik lebih lancar daripada metode autentikasi lainnya, kami merasa perlu menambahkan tingkat navigasi ini.

Pelajari autentikasi biometrik lebih lanjut.

Kunci sandi

Kunci sandi merupakan alternatif sandi yang lebih aman dan lebih mudah. Kunci sandi menggunakan kriptografi kunci publik agar pengguna dapat login ke aplikasi dan situs menggunakan mekanisme kunci layar perangkat mereka, seperti sidik jari atau pengenalan wajah. Dengan begitu, pengguna tidak perlu mengingat dan mengelola sandi, serta memberikan keamanan yang jauh lebih baik.

Kunci sandi dapat memenuhi persyaratan autentikasi multi-faktor dalam satu langkah, mengganti kode sandi dan OTP untuk memberikan perlindungan yang kuat terhadap serangan phishing, dan menghindari kesulitan yang dialami pengguna saat menggunakan SMS atau sandi sekali pakai berbasis aplikasi. Karena kunci sandi telah distandardisasi, satu implementasi memungkinkan pengalaman tanpa sandi di semua perangkat, browser, dan sistem operasi pengguna.

Di Android, kunci sandi didukung menggunakan library Jetpack Pengelola Kredensial yang menyatukan metode autentikasi utama, termasuk kunci sandi, sandi, dan login gabungan (seperti Login dengan Google).

Bagaimana hal ini membantu memitigasi penipuan

Kunci sandi melindungi Anda dari serangan phishing karena hanya berfungsi di aplikasi dan situs Anda yang terdaftar.

Komponen inti kunci sandi adalah kunci pribadi kriptografis. Biasanya, kunci pribadi ini hanya berada di perangkat Anda, seperti laptop atau ponsel, dan disinkronkan di seluruh perangkat tersebut oleh penyedia kredensial (juga dikenal sebagai pengelola sandi), seperti Pengelola Sandi Google. Hanya kunci publik yang sesuai yang disimpan oleh layanan online saat kunci sandi dibuat. Selama login, layanan menggunakan kunci pribadi untuk menandatangani verifikasi login dari kunci publik. Panggilan ini hanya dapat berasal dari salah satu perangkat Anda. Selain itu, agar hal ini terjadi, Anda harus membuka kunci perangkat atau penyimpanan kredensial, yang mencegah login tidak sah (misalnya, dari ponsel curian).

Untuk mencegah akses tidak sah jika terjadi perangkat yang dicuri dan tidak terkunci, kunci sandi harus ditambah dengan periode waktu tunggu autentikasi yang logis. Penyerang yang mencuri perangkat seharusnya tidak dapat menggunakan aplikasi hanya karena pengguna sebelumnya telah login. Sebagai gantinya, masa berlaku kredensial akan berakhir secara berkala (misalnya, setiap 15 menit), dan pengguna harus diwajibkan untuk memverifikasi identitas mereka melalui autentikasi ulang kunci layar.

Jika ponsel Anda dicuri, kunci sandi akan melindungi Anda karena pencuri tidak dapat mencuri sandi Anda untuk digunakan di perangkat lain – kunci sandi bersifat khusus perangkat. Jika Anda menggunakan Pengelola Sandi Google dan ponsel Anda dicuri, Anda dapat login ke Akun Google Anda dari perangkat lain (seperti komputer) dan logout dari jarak jauh dari ponsel yang dicuri. Tindakan ini membuat Pengelola Sandi Google di ponsel yang dicuri tidak dapat digunakan, termasuk kunci sandi yang tersimpan.

Dalam skenario terburuk, jika perangkat yang dicuri tidak dipulihkan, kunci sandi akan disinkronkan kembali ke perangkat baru oleh penyedia kredensial yang membuat dan menyinkronkan kunci sandi. Misalnya, pengguna mungkin telah memilih Pengelola Sandi Google untuk membuat kunci sandi, dan mereka dapat mengakses kunci sandinya di perangkat baru dengan login kembali ke Akun Google dan memberikan kunci layar dari perangkat sebelumnya.

Pelajari lebih lanjut di artikel Keamanan Kunci Sandi di Pengelola Sandi Google.

Penerapan

Kunci sandi didukung di perangkat yang menjalankan Android 9 (API level 28) atau yang lebih tinggi. Sandi dan Login dengan Google didukung mulai dari Android 4.4. Untuk mulai menggunakan kunci sandi, ikuti langkah-langkah berikut:

  1. Ikuti codelab Pengelola Kredensial untuk mendapatkan pemahaman awal tentang cara menerapkan kunci sandi.
  2. Tinjau panduan desain pengalaman pengguna kunci sandi. Dokumen ini menunjukkan alur yang direkomendasikan untuk kasus penggunaan Anda.
  3. Pelajari Pengelola Kredensial dengan mengikuti panduan.
  4. Rencanakan penerapan Pengelola Kredensial dan kunci sandi untuk aplikasi Anda. Rencanakan penambahan dukungan untuk Digital Asset Links.

Baca dokumentasi developer kami untuk mengetahui detail selengkapnya tentang cara membuat, mendaftarkan, dan melakukan autentikasi dengan kunci sandi.

Amankan reset akun

Penyerang tidak sah yang memiliki akses ke perangkat yang tidak terkunci (seperti saat ponsel diambil) akan mencoba mengakses aplikasi sensitif, terutama aplikasi perbankan atau uang tunai. Jika aplikasi menerapkan verifikasi biometrik, penyerang akan mencoba mereset akun untuk masuk. Alur reset akun harus tidak hanya mengandalkan informasi yang mudah diakses di perangkat, seperti link reset OTP email atau SMS.

Berikut adalah praktik terbaik umum yang dapat Anda sertakan ke alur reset aplikasi:

  • Pengenalan wajah, selain OTP
  • Pertanyaan keamanan
  • Faktor pengetahuan (seperti nama gadis ibu, kota lahir, atau lagu favorit)
  • Verifikasi tanda pengenal

SMS Retriever API

SMS Retriever API memungkinkan Anda melakukan verifikasi pengguna berbasis SMS di aplikasi Android secara otomatis. Dengan demikian, pengguna tidak perlu diminta untuk mengetik kode verifikasi secara manual. Selain itu, API ini tidak meminta izin aplikasi tambahan yang berpotensi berbahaya seperti RECEIVE_SMS atau READ_SMS kepada pengguna. Namun, SMS tidak boleh digunakan sebagai satu-satunya verifikasi pengguna untuk melindungi dari akses lokal yang tidak sah ke perangkat.

Bagaimana hal ini membantu memitigasi penipuan

Beberapa pengguna menggunakan kode SMS sebagai satu-satunya faktor autentikasi yang memberikan titik masuk yang mudah untuk penipuan.

SMS Retriever API memungkinkan aplikasi mengambil kode SMS secara langsung tanpa interaksi pengguna, dan dapat memberikan tingkat perlindungan terhadap penipuan.

Penerapan

Ada dua bagian untuk mengimplementasikan SMS Retriever API: Android, dan Server.

Android: (panduan)

  1. Dapatkan nomor telepon pengguna.
  2. Mulai klien SMS retriever.
  3. Kirim nomor telepon ke server Anda.
  4. Menerima pesan verifikasi.
  5. Kirim OTP ke server Anda.

Server: (panduan)

  1. Buat pesan verifikasi.
  2. Kirim pesan verifikasi melalui SMS.
  3. Verifikasi OTP saat ditampilkan.

Praktik terbaik

Setelah aplikasi terintegrasi dan nomor telepon pengguna diverifikasi dengan SMS Retriever API, aplikasi akan mencoba mendapatkan OTP. Jika berhasil, itu adalah sinyal kuat bahwa SMS diterima di perangkat secara otomatis. Jika tidak berhasil dan pengguna harus mengetik OTP secara manual, hal ini dapat menjadi tanda peringatan bahwa pengguna mungkin mengalami penipuan.

SMS tidak boleh digunakan sebagai satu-satunya mekanisme verifikasi pengguna karena dapat menyebabkan serangan lokal, seperti penyerang yang merampok perangkat yang tidak terkunci; atau serangan cloning SIM. Sebaiknya gunakan Biometrik jika memungkinkan. Pada perangkat yang tidak menyediakan sensor Biometrik, autentikasi pengguna harus bergantung pada setidaknya satu faktor yang tidak mudah diperoleh dari perangkat saat ini.

Pelajari lebih lanjut

Untuk bacaan lebih lanjut tentang praktik terbaik, lihat referensi berikut: