Secure Text Entry — adalah mode input teks di Android di mana karakter yang dimasukkan ditampilkan dalam bentuk tersembunyi (titik atau bintang) sebagai ganti karakter sebenarnya. Mode ini digunakan untuk bidang input sandi, kode PIN, kode CVV, dan informasi rahasia lainnya. Secure Text Entry tidak hanya melindungi data dari penyadapan visual, tetapi juga mencegah kebocoran melalui tangkapan layar, rekaman layar, dan fungsi koreksi otomatis. Menurut Android Security Best Practices (2026), input tersembunyi adalah persyaratan wajib untuk aplikasi yang memproses data autentikasi pengguna.
Poin Utama
Secure Text Entry (input teks terlindungi) — adalah fungsi Android yang mengganti tampilan setiap karakter yang dimasukkan dengan simbol penutup, biasanya titik (•) atau bintang (*). Ini mencegah pembacaan sandi dari balik bahu (shoulder surfing) dan menyembunyikan data yang dimasukkan dari mata yang mengintip. Fungsi ini juga dikenal sebagai masking sandi dan merupakan praktik standar dalam aplikasi seluler.
Tidak seperti iOS, di mana Secure Text Entry adalah pengaturan terpisah UITextField, di Android fungsi ini diaktifkan melalui atribut inputType dengan variasi PASSWORD. Ketika EditText menerima inputType="textPassword", ia secara otomatis menerapkan PasswordTransformationMethod — kelas yang bertanggung jawab untuk mengganti karakter. Saat setiap karakter baru dimasukkan, EditText segera menggantinya dengan simbol penutup melalui mekanisme TransformationMethod dari antarmuka.
Menurut Android Source Code (AOSP, 2026), implementasi PasswordTransformationMethod menggunakan kelas TextPaint untuk menggambar simbol penutup. Ukuran simbol penutup sesuai dengan ukuran font bidang, yang mencegah kebocoran informasi melalui panjang kata — semua karakter terlihat identik dalam hal lebar. Ini penting untuk perlindungan terhadap serangan berdasarkan analisis panjang data yang dimasukkan.
<!-- Basic Secure Text Entry example -->
@+id/etPassword
android:layout_width="match_parent"
android:hint="Enter password"
android:inputType="textPassword"
android:maxLength="64"
android:importantForAutofill="yes" />
Mekanisme Secure Text Entry di Android didasarkan pada antarmuka TransformationMethod, yang didefinisikan dalam paket android.text.method. PasswordTransformationMethod — adalah implementasi bawaan yang mengganti metode getTransformation(), mengembalikan urutan karakter yang diganti untuk ditampilkan. Sementara itu, teks asli di Editable tetap tidak berubah — hanya representasi visualnya yang berubah.
Ketika pengguna memasukkan karakter, EditText memanggil dispatchEvent dan mengirimkan karakter ke InputConnection, yang menambahkannya ke Editable. Kemudian EditText memanggil metode getTransformation() dari TransformationMethod saat ini, yang menerima CharSequence asli dan mengembalikan SpannableString dengan simbol penutup. SpannableString ini digambar di layar sebagai ganti teks asli. Fitur utama — transformasi itu sendiri tidak mengubah konten Editable, oleh karena itu saat memanggil getText().toString() teks yang benar-benar dimasukkan dikembalikan.
Menurut Android Developers Reference (2026), PasswordTransformationMethod menambahkan ke setiap karakter MetricAffectingSpan yang mengganti glyph dengan titik. Span ini tidak memengaruhi panjang teks, sehingga kursor dan posisi input tetap dipertahankan dengan benar bahkan saat tampilan tersembunyi. Ada juga VisiblePasswordTransformationMethod, yang menampilkan karakter terakhir yang dimasukkan untuk waktu singkat (mirip dengan iOS).
// PasswordTransformationMethod - masking bawaan
editText.transformationMethod = PasswordTransformationMethod.getInstance()
// VisiblePasswordTransformationMethod - menampilkan karakter terakhir
editText.transformationMethod = VisiblePasswordTransformationMethod.getInstance()
Mengalihkan visibilitas (password visibility toggle) — adalah fungsi yang memungkinkan pengguna untuk sementara menampilkan sandi yang dimasukkan untuk memeriksanya sebelum mengirim formulir. Di Android, fungsi ini diimplementasikan melalui TextInputLayout dengan atribut app:endIconMode="password_toggle\). Saat mengklik ikon mata, bidang beralih antara textPassword dan textVisiblePassword.
Implementasi password_toggle di TextInputLayout secara otomatis mengubah inputType dari EditText internal dan menganimasikan ikon (mata terbuka/tertutup). Penting untuk diingat bahwa saat peralihan ini, posisi kursor dapat direset, oleh karena itu TextInputLayout menyimpan dan memulihkan posisi setelah perubahan mode. Juga saat beralih ke sandi terlihat, koreksi otomatis dan saran tidak diaktifkan — TYPE_TEXT_VARIATION_VISIBLE_PASSWORD digunakan, bukan text biasa.
Menurut Material Design Guidelines (2025), ikon untuk menampilkan sandi harus selalu terlihat, bukan hanya saat bidang dalam fokus. Pengguna harus dapat memeriksa sandi kapan saja. Ikon tidak boleh secara otomatis menyembunyikan sandi setelah waktu tertentu — hanya dengan tindakan pengguna.
<!-- TextInputLayout with password toggle -->
@+id/tilPassword
android:layout_width="match_parent"
app:endIconMode="password_toggle"
app:passwordToggleTint="@color/primary">
@+id/etPassword
android:inputType="textPassword"
android:hint="Password" />
</com.google.android.material.textfield.TextInputLayout>
Pengaturan pemrograman Secure Text Entry di Kotlin dilakukan melalui pengaturan inputType atau melalui setTransformationMethod(). Kedua pendekatan menghasilkan hasil yang sama, tetapi berbeda dalam detail. Pengaturan inputType juga mengonfigurasi koreksi otomatis dan saran, sementara setTransformationMethod hanya memengaruhi tampilan karakter.
// Mengalihkan visibilitas sandi secara pemrograman
fun togglePasswordVisibility(til: TextInputLayout) {
val editText = til.editText ?: return
val currentType = editText.inputType
val isPassword = (currentType and
InputType.TYPE_TEXT_VARIATION_PASSWORD) != 0
if (isPassword) {
editText.inputType = InputType.TYPE_CLASS_TEXT or
InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD
} else {
editText.inputType = InputType.TYPE_CLASS_TEXT or
InputType.TYPE_TEXT_VARIATION_PASSWORD
}
// Memulihkan posisi kursor
val cursorPos = editText.selectionStart
editText.setSelection(maxOf(0, cursorPos))
}
// Masking kustom — hanya menampilkan 4 karakter terakhir
class PartialPasswordTransformation : TransformationMethod {
override fun getTransformation(source: CharSequence?,
view: View?): CharSequence {
val text = source?.toString() ?: ""
if (text.length <= 4) return text
val dots = "\u2022".repeat(text.length - 4)
return dots + text.substring(text.length - 4)
}
override fun onFocusChanged(view: View?,
sourceText: CharSequence?,
focused: Boolean,
direction: Int,
previouslyFocusedRect: android.graphics.Rect?) {}
}
Secure Text Entry memberikan perlindungan di beberapa tingkatan. Masking visual mencegah pembacaan sandi dari balik bahu (shoulder surfing) — metode pencurian sandi yang paling umum di tempat umum. Menonaktifkan koreksi otomatis mencegah penyimpanan sandi di kamus pengguna, yang menghilangkan kebocoran melalui input prediktif. Perlindungan dari tangkapan layar (jika FLAG_SECURE diaktifkan) mencegah aplikasi lain menangkap konten bidang.
Namun Secure Text Entry bukanlah perlindungan yang lengkap. Serangan melalui penyadapan input (keylogging) di tingkat sistem dapat memperoleh karakter asli dari InputConnection. Aplikasi berbahaya dengan layanan aksesibilitas dapat membaca konten EditText, bahkan jika karakter tersembunyi di layar. Juga SSL-sniffing saat mentransmisikan data ke server dapat mengungkapkan sandi jika HTTPS tidak digunakan dengan validasi sertifikat yang benar.
Menurut OWASP Mobile Security Testing Guide (2025), untuk perlindungan maksimal sandi di Android disarankan: gunakan inputType="textPassword" + nonaktifkan autofill untuk bidang kritis; jangan menyimpan sandi di memori lebih lama dari yang diperlukan; bersihkan bidang sandi saat meminimalkan aplikasi (onPause/onStop); gunakan masking bahkan saat menampilkan sandi sementara.
| Tingkat perlindungan | Secure Text Entry | Tindakan tambahan |
|---|---|---|
| Penyadapan visual | Masking karakter | Biometric auth, hindari shoulder surfing |
| Tangkapan layar | Sebagian (tergantung implementasi) | FLAG_SECURE pada Window |
| Keylogging | Tidak melindungi | Gunakan IME dengan input aman |
| Koreksi otomatis/kamus | Dinonaktifkan | dinonaktifkan secara default untuk password |
| Penyadapan jaringan | Tidak melindungi | HTTPS dengan certificate pinning |
Pengembang Android harus mengikuti beberapa praktik utama saat bekerja dengan input tersembunyi. Pertama, selalu gunakan TextInputLayout dengan endIconMode="password_toggle" untuk bidang sandi — ini adalah standar modern Material Design. Kedua, jangan nonaktifkan kemampuan untuk menampilkan sandi — pengguna harus dapat memeriksa apa yang telah mereka masukkan, terutama pada perangkat seluler dengan keyboard kecil.
Secure Text Entry juga memerlukan konfigurasi pengisian otomatis yang benar. Untuk bidang sandi, selalu tentukan autofillHints="password" atau autofillHints="newPassword" agar manajer sandi dapat mengisi dan menyimpan data dengan benar. Untuk bidang konfirmasi sandi baru, gunakan autofillHints="newPassword" agar sistem tidak menyarankan mengisinya dengan sandi tersimpan saat ini.
// Bidang sandi lengkap dengan pengisian otomatis dan pembersihan
class SecurePasswordField {
private fun setupPasswordField(til: TextInputLayout) {
val editText = til.editText ?: return
editText.inputType = InputType.TYPE_CLASS_TEXT or
InputType.TYPE_TEXT_VARIATION_PASSWORD
editText.setAutofillHints(View.AUTOFILL_HINT_PASSWORD>)
editText.importantForAutofill = View.IMPORTANT_FOR_AUTOFILL_YES
}
fun clearOnPause(editText: EditText) {
editText.text?.clear()
}
}
Pertanyaan yang Sering Diajukan
textPassword menyembunyikan semua karakter yang dimasukkan dan menonaktifkan koreksi otomatis. textVisiblePassword juga menonaktifkan koreksi otomatis, tetapi menampilkan karakter dalam bentuk terbuka. textVisiblePassword digunakan saat mengalihkan visibilitas sandi — ini bukan text biasa, karena koreksi otomatis dan saran tetap dinonaktifkan untuk keamanan.
Ya, buat kelas kustom yang mengimplementasikan antarmuka TransformationMethod. Ganti metode getTransformation(), yang mengembalikan CharSequence dengan simbol pengganti yang diinginkan. Setel melalui editText.transformationMethod = CustomPasswordTransformation(). Ingat bahwa simbol harus monospace untuk keamanan.
Pada perangkat seluler dengan layar kecil dan keyboard sentuh, kemungkinan kesalahan saat memasukkan sandi secara signifikan lebih tinggi daripada di desktop. Kemampuan untuk memeriksa sandi yang dimasukkan mengurangi jumlah kesalahan input dan mengurangi jumlah permintaan pemulihan sandi, yang meningkatkan pengalaman pengguna dan mengurangi beban dukungan.
Atur bendera FLAG_SECURE pada jendela Activity atau Dialog: window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE). Ini akan mencegah pembuatan tangkapan layar dan perekaman layar untuk seluruh jendela. Namun perlu diingat bahwa ini juga akan menonaktifkan tangkapan layar untuk konten biasa, yang mungkin tidak diinginkan.
Mulai Android 8.0 (API 26), Autofill Framework secara otomatis mendeteksi bidang password melalui inputType. Untuk pengoperasian yang benar, atur importantForAutofill="yes" dan tentukan autofillHints ("password", "newPassword", "emailAddress"). Gboard dan manajer sandi menggunakan atribut ini untuk menyarankan sandi yang tersimpan.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga