Secure Text Entry — ay isang mode ng pag-input ng teksto sa Android kung saan ang mga ipinasok na character ay ipinapakita sa nakatagong anyo (mga tuldok o asterisk) sa halip na mga aktwal na character. Ang mode na ito ay ginagamit para sa mga field ng pag-input ng password, PIN code, CVV code, at iba pang kumpidensyal na impormasyon. Ang Secure Text Entry ay hindi lamang nagpoprotekta ng data mula sa visual na panghihimasok, ngunit pinipigilan din ang pagtagas sa pamamagitan ng mga screenshot, screen recording, at mga function ng autocorrect. Ayon sa Android Security Best Practices (2026), ang nakatagong pag-input ay isang mandatoryong kinakailangan para sa mga application na nagpoproseso ng data ng pagpapatotoo ng mga user.
Mga Pangunahing Punto
Secure Text Entry (protektadong pag-input ng teksto) — ay isang function ng Android na pumapalit sa pagpapakita ng bawat ipinasok na character ng isang masking symbol, karaniwang tuldok (•) o asterisk (*). Pinipigilan nito ang pagbabasa ng password sa balikat (shoulder surfing) at itinatago ang ipinasok na data mula sa mga mata ng iba. Ang function ay kilala rin bilang password masking at isang karaniwang kasanayan sa mga mobile application.
Hindi tulad ng iOS, kung saan ang Secure Text Entry ay isang hiwalay na setting ng UITextField, sa Android ang function na ito ay na-activate sa pamamagitan ng attribute na inputType na may variation na PASSWORD. Kapag ang EditText ay nakatanggap ng inputType="textPassword", awtomatiko itong naglalapat ng PasswordTransformationMethod — ang klase na responsable sa pagpapalit ng mga character. Sa bawat pag-input ng bagong character, agad itong pinapalitan ng EditText ng masking symbol sa pamamagitan ng mekanismo ng TransformationMethod ng interface.
Ayon sa Android Source Code (AOSP, 2026), ang implementasyon ng PasswordTransformationMethod ay gumagamit ng klase na TextPaint para sa pagguhit ng mga masking symbol. Ang laki ng masking symbol ay tumutugma sa laki ng font ng field, na pumipigil sa pagtagas ng impormasyon sa pamamagitan ng haba ng salita — lahat ng character ay magkamukha sa lapad. Ito ay mahalaga para sa proteksyon laban sa mga atake batay sa pagsusuri ng haba ng ipinasok na data.
<!-- 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" />
Ang mekanismo ng Secure Text Entry sa Android ay batay sa interface na TransformationMethod, na tinukoy sa package na android.text.method. Ang PasswordTransformationMethod — ay isang built-in na implementasyon na nag-o-override sa method na getTransformation(), na nagbabalik ng pinalitang sequence ng mga character para sa pagpapakita. Samantala, ang orihinal na teksto sa Editable ay nananatiling hindi nababago — tanging ang visual na representasyon nito ang nagbabago.
Kapag ang user ay nag-input ng character, ang EditText ay tumatawag ng dispatchEvent at ipinapasa ang character sa InputConnection, na nagdaragdag nito sa Editable. Pagkatapos ay tinatawag ng EditText ang method na getTransformation() ng kasalukuyang TransformationMethod, na tumatanggap ng orihinal na CharSequence at nagbabalik ng SpannableString na may mga masking symbol. Ang SpannableString na ito ay iginuhit sa screen sa halip ng orihinal na teksto. Ang pangunahing tampok — ang transformasyon mismo ay hindi nagbabago sa nilalaman ng Editable, kaya naman sa pagtawag ng getText().toString() ang aktwal na ipinasok na teksto ay ibinabalik.
Ayon sa Android Developers Reference (2026), ang PasswordTransformationMethod ay nagdaragdag sa bawat character ng MetricAffectingSpan na pumapalit sa glyph ng tuldok. Ang mga span na ito ay hindi nakakaapekto sa haba ng teksto, kaya ang cursor at posisyon ng pag-input ay nananatiling tama kahit na sa nakatagong pagpapakita. Mayroon ding VisiblePasswordTransformationMethod, na nagpapakita ng huling ipinasok na character sa maikling panahon (katulad ng iOS).
// PasswordTransformationMethod - built-in na masking
editText.transformationMethod = PasswordTransformationMethod.getInstance()
// VisiblePasswordTransformationMethod - nagpapakita ng huling character
editText.transformationMethod = VisiblePasswordTransformationMethod.getInstance()
Pagpapalit ng visibility (password visibility toggle) — ay isang function na nagpapahintulot sa user na pansamantalang ipakita ang ipinasok na password upang suriin ito bago ipadala ang form. Sa Android, ang function na ito ay naipapatupad sa pamamagitan ng TextInputLayout na may attribute na app:endIconMode="password_toggle". Sa pag-click ng icon ng mata, ang field ay lumilipat sa pagitan ng textPassword at textVisiblePassword.
Ang implementasyon ng password_toggle sa TextInputLayout ay awtomatikong nagbabago ng inputType ng panloob na EditText at nag-a-animate ng icon (bukas/sarado ang mata). Mahalagang tandaan na sa pagpapalit na ito, ang posisyon ng cursor ay maaaring ma-reset, kaya naman ang TextInputLayout ay nagse-save at nagre-restore ng posisyon pagkatapos ng pagbabago ng mode. Gayundin, sa paglipat sa nakikitang password, ang autocorrect at mga mungkahi ay hindi naa-activate — ang TYPE_TEXT_VARIATION_VISIBLE_PASSWORD ay ginagamit, hindi ordinaryong text.
Ayon sa Material Design Guidelines (2025), ang icon ng pagpapakita ng password ay dapat palaging nakikita, hindi lamang kapag ang field ay nakatutok. Ang user ay dapat magkaroon ng kakayahang suriin ang password anumang oras. Ang icon ay hindi dapat awtomatikong itago ang password pagkatapos ng isang tiyak na oras — sa pamamagitan lamang ng aksyon ng user.
<!-- 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>
Ang programatikong pagtatakda ng Secure Text Entry sa Kotlin ay ginagawa sa pamamagitan ng pagtatakda ng inputType o sa pamamagitan ng setTransformationMethod(). Ang parehong mga approach ay humahantong sa parehong resulta, ngunit nagkakaiba sa mga detalye. Ang pagtatakda ng inputType ay nagko-configure din ng autocorrect at mga mungkahi, habang ang setTransformationMethod ay nakakaapekto lamang sa pagpapakita ng mga character.
// Programatikong pagpapalit ng visibility ng password
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
}
// Ibalik ang posisyon ng cursor
val cursorPos = editText.selectionStart
editText.setSelection(maxOf(0, cursorPos))
}
// Custom na masking — nagpapakita lamang ng huling 4 na character
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 ay nagbibigay ng proteksyon sa maraming antas. Ang visual na masking ay pumipigil sa pagbabasa ng password sa balikat (shoulder surfing) — ang pinakakaraniwang paraan ng pagnanakaw ng password sa mga pampublikong lugar. Ang pag-disable ng autocorrect ay pumipigil sa pag-save ng password sa diksyunaryo ng user, na nag-aalis ng pagtagas sa pamamagitan ng predictive input. Ang proteksyon mula sa mga screenshot (kung naka-enable ang FLAG_SECURE) ay pumipigil sa ibang mga application na makuha ang nilalaman ng field.
Gayunpaman ang Secure Text Entry ay hindi kumpletong proteksyon. Ang mga atake sa pamamagitan ng panghihimasok sa pag-input (keylogging) sa antas ng system ay maaaring makakuha ng mga aktwal na character mula sa InputConnection. Ang mga malisyosong application na may accessibility service ay maaaring magbasa ng nilalaman ng EditText, kahit na ang mga character ay nakatago sa screen. Gayundin ang SSL-sniffing sa pagpapadala ng data sa server ay maaaring magbunyag ng password kung hindi ginagamit ang HTTPS na may tamang pagpapatunay ng sertipiko.
Ayon sa OWASP Mobile Security Testing Guide (2025), para sa maximum na proteksyon ng mga password sa Android ay inirerekomenda: gamitin ang inputType="textPassword" + i-disable ang autofill para sa mga kritikal na field; huwag i-cache ang password sa memory nang mas mahaba kaysa kinakailangan; linisin ang field ng password kapag pinaliit ang application (onPause/onStop); gamitin ang masking kahit na sa pansamantalang pagpapakita ng password.
| Antas ng proteksyon | Secure Text Entry | Mga karagdagang hakbang |
|---|---|---|
| Visual na panghihimasok | Masking ng mga character | Biometric auth, iwasan ang shoulder surfing |
| Mga screenshot | Bahagyang (depende sa implementasyon) | FLAG_SECURE sa Window |
| Keylogging | Hindi pinoprotektahan | Gumamit ng IME na may ligtas na pag-input |
| Autocorrect/diksyonaryo | Naka-disable | naka-disable bilang default para sa password |
| Panghihimasok sa network | Hindi pinoprotektahan | HTTPS na may certificate pinning |
Ang mga developer ng Android ay dapat sumunod sa ilang mahahalagang kasanayan kapag nagtatrabaho sa nakatagong pag-input. Una, palaging gamitin ang TextInputLayout na may endIconMode="password_toggle" para sa mga field ng password — ito ang modernong pamantayan ng Material Design. Pangalawa, huwag i-disable ang kakayahang ipakita ang password — ang user ay dapat magkaroon ng kakayahang suriin kung ano ang kanilang ininput, lalo na sa mga mobile device na may maliit na keyboard.
Secure Text Entry ay nangangailangan din ng tamang konpigurasyon ng autofill. Para sa mga field ng password, tiyaking tukuyin ang autofillHints="password" o autofillHints="newPassword" upang ang mga manager ng password ay maaaring wastong mag-fill at mag-save ng data. Para sa field ng kumpirmasyon ng bagong password, gamitin ang autofillHints="newPassword" upang hindi imungkahi ng system na punan ito ng kasalukuyang naka-save na password.
// Buong field ng password na may autofill at paglilinis
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()
}
}
Mga Madalas Itanong
textPassword ay nagtatago ng lahat ng ipinasok na character at nagdi-disable ng autocorrect. textVisiblePassword ay nagdi-disable din ng autocorrect, ngunit nagpapakita ng mga character sa bukas na anyo. Ang textVisiblePassword ay ginagamit sa pagpapalit ng visibility ng password — ito ay hindi ordinaryong text, dahil ang autocorrect at mga mungkahi ay nananatiling naka-disable para sa seguridad.
Oo, gumawa ng custom na klase na nag-i-implement ng interface na TransformationMethod. I-override ang method na getTransformation(), na nagbabalik ng CharSequence na may nais na simbolo ng kapalit. Itakda ito sa pamamagitan ng editText.transformationMethod = CustomPasswordTransformation(). Tandaan na ang simbolo ay dapat na monospace para sa seguridad.
Sa mga mobile device na may maliliit na screen at touch keyboard, ang posibilidad ng pagkakamali sa pag-input ng password ay mas mataas kaysa sa desktop. Ang kakayahang suriin ang ipinasok na password ay nagbabawas sa bilang ng mga error sa pag-input at nagpapababa sa bilang ng mga kahilingan sa pag-recover ng password, na nagpapabuti sa karanasan ng user at nagbabawas ng load ng suporta.
Itakda ang flag na FLAG_SECURE sa window ng Activity o Dialog: window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE). Pipigilan nito ang paggawa ng mga screenshot at pag-record ng screen para sa buong window. Gayunpaman, tandaan na ito ay magdi-disable din ng mga screenshot para sa ordinaryong nilalaman, na maaaring hindi kanais-nais.
Mula Android 8.0 (API 26), awtomatikong na-detect ng Autofill Framework ang mga password field sa pamamagitan ng inputType. Para sa tamang paggana, itakda ang importantForAutofill="yes" at tukuyin ang autofillHints ("password", "newPassword", "emailAddress"). Ginagamit ng Gboard at mga manager ng password ang mga attribute na ito para magmungkahi ng mga naka-save na password.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din