Otentikasi pengguna yang aman

Untuk melindungi sistem autentikasi Anda di Android, pertimbangkan untuk beralih dari model berbasis sandi, khususnya untuk akun sensitif seperti bank dan akun email. Perlu diingat bahwa beberapa aplikasi yang diinstal pengguna mungkin tidak memiliki niat terbaik dan mungkin mencoba untuk melakukan {i>phishing <i}pada pengguna Anda.

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 sensitif menerapkan waktu tunggu otentikasi yang wajar (15 menit?) dengan verifikasi biometrik dan memerlukan autentikasi tambahan sebelum melakukan tindakan sensitif seperti uang transfer data.

Dialog autentikasi biometrik

Library Biometrik menyediakan serangkaian fungsi untuk menampilkan prompt yang meminta seperti otentikasi biometrik, seperti pengenalan wajah atau pengenalan sidik jari. Namun, perintah biometrik dapat dikonfigurasi untuk kembali ke LSKF, risiko penjelajahan bahu yang diketahui. Untuk aplikasi sensitif, sebaiknya tidak menggunakan kembali PIN secara biometrik, dan setelah kehabisan upaya biometrik, pengguna dapat menunggu, atau {i>login<i} kembali dengan {i>password<i} atau mengatur ulang akun. Akun direset harus mewajibkan faktor yang tidak dapat diakses dengan mudah di perangkat (praktik terbaik di bawah).

Bagaimana hal ini membantu mencegah penipuan dan pencurian telepon

Satu kasus penggunaan tertentu yang bisa membantu mencegah penipuan adalah meminta autentikasi biometrik dalam aplikasi Anda sebelum transaksi. Kapan pengguna ingin melakukan transaksi keuangan, dialog biometrik muncul untuk memverifikasi bahwa memang pengguna yang dituju yang melakukan transaksi. Ini praktik terbaik melindungi sistem dari pencurian perangkat, terlepas dari penyerang mengetahui atau tidak mengetahui LSKF, karena mereka perlu menyelidiki bahwa mereka pemilik perangkat.

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

Implementasi

  1. Pastikan Anda menyertakan library androidx.biometric.
  2. Menyertakan dialog login biometrik dalam aktivitas atau fragmen yang menyimpan logika yang Anda inginkan untuk otentikasi 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 yang eksplisit dari pengguna. Untuk menghindari penipuan, sebaiknya tambahkan kode biometrik dialog dengan tindakan pengguna yang eksplisit untuk setiap transaksi. Kami paham bahwa menambahkan otentikasi dapat menimbulkan friksi dalam UX, tetapi karena sifat informasi yang ditangani dalam transaksi bank dan bahwa data biometrik otentikasi lebih lancar dibandingkan metode otentikasi lainnya, kami rasa untuk 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 wajah pengenalan objek. Hal ini membebaskan pengguna dari harus mengingat dan mengelola {i>password<i}, dan memberikan peningkatan keamanan yang signifikan.

Kunci sandi dapat memenuhi persyaratan otentikasi multifaktor dalam satu langkah, mengganti {i>password<i} dan kode OTP untuk memberikan perlindungan yang kuat terhadap serangan {i>phishing <i}dan menghindari kesusahan pengalaman pengguna akibat SMS atau aplikasi {i>password<i}. Karena kunci sandi distandarisasi, satu implementasi memungkinkan pengalaman tanpa sandi di semua pengguna perangkat, browser, dan sistem operasi.

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

Bagaimana hal ini membantu memitigasi penipuan

Kunci sandi melindungi Anda dari serangan {i>phishing<i} karena hanya berfungsi pada aplikasi dan situs web yang terdaftar.

Komponen inti kunci sandi adalah kunci pribadi kriptografis. Biasanya, proses ini kunci pribadi berada hanya di perangkat Anda, seperti laptop atau ponsel, dan disinkronkan di seluruh kredensial tersebut oleh penyedia kredensial (juga dikenal sebagai sandi pengelola), seperti Pengelola Sandi Google. Hanya kunci publik yang sesuai yang yang disimpan oleh layanan online saat kunci sandi dibuat. Selama login, layanan menggunakan kunci pribadi untuk menandatangani tantangan dari kunci publik. 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 tanpa izin (misalnya, dari ponsel curian).

Untuk mencegah akses yang tidak sah ketika perangkat dicuri dan tidak terkunci, kunci sandi harus ditambah dengan periode waktu tunggu otentikasi yang masuk akal. Channel penyerang yang mencuri perangkat seharusnya tidak dapat menggunakan aplikasi hanya karena pengguna sebelumnya telah masuk. Sebagai gantinya, kredensial harus berakhir dengan interval reguler (misalnya, setiap 15 menit), dan pengguna harus yang diperlukan untuk memverifikasi identitas mereka melalui autentikasi ulang kunci layar.

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

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 menandatangani mengakses kembali Akun Google mereka dan memberikan kunci layar dari perangkat seluler.

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

Implementasi

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. Kepada 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. Merencanakan penambahan dukungan untuk Digital Asset Links.

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

Amankan reset akun

Penyerang yang tidak sah dengan akses ke perangkat yang tidak terkunci (seperti saat ponsel diambil) akan mencoba mengakses aplikasi yang sensitif, khususnya aplikasi perbankan atau aplikasi tunai. Jika aplikasi menerapkan verifikasi biometrik, penyerang akan mencoba mereset akun tersebut untuk masuk. Penting agar alur reset akun tidak hanya mengandalkan pada informasi yang mudah diakses di perangkat, seperti OTP email atau SMS mereset link.

Berikut adalah praktik terbaik umum yang dapat Anda sertakan dalam proses reset aplikasi {i>flow<i} (alur):

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

SMS Retriever API

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

Bagaimana hal ini membantu memitigasi penipuan

Beberapa pengguna menggunakan kode SMS sebagai satu-satunya faktor otentikasi mereka yang memberikan titik entri yang mudah untuk penipuan.

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

Implementasi

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, ia mencoba mendapatkan OTP. Jika berhasil, itu pertanda kuat sinyal bahwa SMS diterima di perangkat secara otomatis. Jika tidak berhasil dan pengguna perlu mengetik OTP secara manual, itu bisa berupa tanda peringatan pengguna mungkin mengalami penipuan.

SMS tidak boleh digunakan sebagai satu-satunya mekanisme verifikasi pengguna jika SMS dapat meninggalkan ruang terhadap serangan lokal, seperti penyerang yang merampok perangkat yang tidak terkunci; atau SIM serangan kloning. Sebaiknya gunakan Biometrik jika memungkinkan. Aktif 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: