Secure Text Entry — is een tekstinvoermodus in Android waarbij ingevoerde tekens worden weergegeven in verborgen vorm (punten of sterretjes) in plaats van de werkelijke tekens. Deze modus wordt gebruikt voor invoervelden van wachtwoorden, pincodes, CVV-codes en andere vertrouwelijke informatie. Secure Text Entry beschermt gegevens niet alleen tegen visuele onderschepping, maar voorkomt ook lekken via schermafbeeldingen, schermopnames en automatische correctiefuncties. Volgens Android Security Best Practices (2026) is verborgen invoer een verplichte vereiste voor applicaties die authenticatiegegevens van gebruikers verwerken.
Belangrijkste punten
Secure Text Entry (beveiligde tekstinvoer) — is een Android-functie die de weergave van elk ingevoerd teken vervangt door een maskerend symbool, meestal een punt (•) of een sterretje (*). Dit voorkomt het lezen van wachtwoorden over de schouder (shoulder surfing) en verbergt ingevoerde gegevens voor nieuwsgierige ogen. De functie staat ook bekend als wachtwoordmaskering en is een standaardpraktijk in mobiele applicaties.
In tegenstelling tot iOS, waar Secure Text Entry een aparte instelling van UITextField is, wordt deze functie in Android geactiveerd via het attribuut inputType met de variatie PASSWORD. Wanneer EditText inputType="textPassword" ontvangt, past het automatisch PasswordTransformationMethod toe — de klasse die verantwoordelijk is voor het vervangen van tekens. Bij het invoeren van elk nieuw teken vervangt EditText het onmiddellijk door een maskerend symbool via het TransformationMethod-mechanisme van de interface.
Volgens Android Source Code (AOSP, 2026) gebruikt de implementatie van PasswordTransformationMethod de klasse TextPaint voor het tekenen van maskerende symbolen. De grootte van het maskerende symbool komt overeen met de lettergrootte van het veld, wat lekkage van informatie via de woordlengte voorkomt — alle tekens zien er identiek uit qua breedte. Dit is belangrijk voor bescherming tegen aanvallen gebaseerd op analyse van de lengte van ingevoerde gegevens.
<!-- 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" />
Het mechanisme van Secure Text Entry in Android is gebaseerd op de interface TransformationMethod, gedefinieerd in het pakket android.text.method. PasswordTransformationMethod — is een ingebouwde implementatie die de methode getTransformation() overschrijft en een vervangen reeks tekens voor weergave retourneert. De originele tekst in Editable blijft onveranderd — alleen de visuele weergave verandert.
Wanneer de gebruiker een teken invoert, roept EditText dispatchEvent aan en geeft het teken door aan InputConnection, die het toevoegt aan Editable. Vervolgens roept EditText de methode getTransformation() van de huidige TransformationMethod aan, die de originele CharSequence ontvangt en een SpannableString met maskerende symbolen retourneert. Deze SpannableString wordt op het scherm weergegeven in plaats van de originele tekst. Het belangrijkste kenmerk — de transformatie zelf verandert de inhoud van Editable niet, daarom wordt bij aanroep van getText().toString() de werkelijk ingevoerde tekst geretourneerd.
Volgens Android Developers Reference (2026) voegt PasswordTransformationMethod aan elk teken een MetricAffectingSpan toe die de glyph vervangt door een punt. Deze spans hebben geen invloed op de tekstlengte, waardoor de cursor en invoerpositie correct blijven, zelfs bij verborgen weergave. Er bestaat ook VisiblePasswordTransformationMethod, die het laatst ingevoerde teken kort weergeeft (vergelijkbaar met iOS).
// PasswordTransformationMethod - ingebouwde maskering
editText.transformationMethod = PasswordTransformationMethod.getInstance()
// VisiblePasswordTransformationMethod - toont laatste teken
editText.transformationMethod = VisiblePasswordTransformationMethod.getInstance()
Zichtbaarheid schakelen (password visibility toggle) — is een functie waarmee de gebruiker het ingevoerde wachtwoord tijdelijk kan tonen om het te controleren voordat het formulier wordt verzonden. In Android wordt deze functie geïmplementeerd via TextInputLayout met het attribuut app:endIconMode="password_toggle". Bij het klikken op het oogpictogram schakelt het veld tussen textPassword en textVisiblePassword.
De implementatie van password_toggle in TextInputLayout verandert automatisch de inputType van de interne EditText en animeert het pictogram (oog open/gesloten). Het is belangrijk om te onthouden dat bij deze schakeling de cursorpositie kan worden gereset, daarom slaat TextInputLayout de positie op en herstelt deze na moduswijziging. Ook worden bij het overschakelen naar zichtbaar wachtwoord automatische correctie en suggesties niet ingeschakeld — TYPE_TEXT_VARIATION_VISIBLE_PASSWORD wordt gebruikt, niet gewone text.
Volgens Material Design Guidelines (2025) moet het pictogram voor het tonen van het wachtwoord altijd zichtbaar zijn, niet alleen wanneer het veld in focus is. De gebruiker moet te allen tijde het wachtwoord kunnen controleren. Het pictogram moet het wachtwoord niet automatisch verbergen na een bepaalde tijd — alleen door gebruikersactie.
<!-- 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>
Programmatische instelling van Secure Text Entry in Kotlin gebeurt via het instellen van inputType of via setTransformationMethod(). Beide benaderingen leiden tot hetzelfde resultaat, maar verschillen in details. Het instellen van inputType configureert ook automatische correctie en suggesties, terwijl setTransformationMethod alleen de weergave van tekens beïnvloedt.
// Programmatisch schakelen van wachtwoordzichtbaarheid
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
}
// Cursorpositie herstellen
val cursorPos = editText.selectionStart
editText.setSelection(maxOf(0, cursorPos))
}
// Aangepaste maskering — toont alleen laatste 4 tekens
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 biedt bescherming op meerdere niveaus. Visuele maskering voorkomt het lezen van wachtwoorden over de schouder (shoulder surfing) — de meest voorkomende methode van wachtwoorddiefstal op openbare plaatsen. Het uitschakelen van automatische correctie voorkomt opslag van het wachtwoord in het gebruikerswoordenboek, wat lekkage via voorspellende invoer uitsluit. Bescherming tegen schermafbeeldingen (als FLAG_SECURE is ingeschakeld) voorkomt dat andere applicaties de inhoud van het veld kunnen vastleggen.
Secure Text Entry is echter geen volledige bescherming. Aanvallen via invoeronderschepping (keylogging) op systeemniveau kunnen echte tekens uit InputConnection verkrijgen. Kwaadaardige applicaties met een toegankelijkheidsservice kunnen de inhoud van EditText lezen, zelfs als tekens op het scherm verborgen zijn. Ook SSL-sniffing bij gegevensoverdracht naar de server kan het wachtwoord onthullen als HTTPS niet met correcte certificaatvalidatie wordt gebruikt.
Volgens OWASP Mobile Security Testing Guide (2025) wordt voor maximale bescherming van wachtwoorden in Android aanbevolen: gebruik inputType="textPassword" + schakel autofill uit voor kritieke velden; bewaar het wachtwoord niet langer in het geheugen dan nodig; maak het wachtwoordveld leeg bij het minimaliseren van de app (onPause/onStop); gebruik maskering zelfs bij kortstondige weergave van het wachtwoord.
| Beschermingsniveau | Secure Text Entry | Aanvullende maatregelen |
|---|---|---|
| Visuele onderschepping | Maskering van tekens | Biometric auth, vermijd shoulder surfing |
| Schermafbeeldingen | Gedeeltelijk (afhankelijk van implementatie) | FLAG_SECURE op Window |
| Keylogging | Beschermt niet | Gebruik IME met beveiligde invoer |
| Automatische correctie/woordenboek | Uitgeschakeld | standaard uitgeschakeld voor password |
| Netwerkonderschepping | Beschermt niet | HTTPS met certificate pinning |
Android-ontwikkelaars moeten enkele belangrijke praktijken volgen bij het werken met verborgen invoer. Ten eerste, gebruik altijd TextInputLayout met endIconMode="password_toggle" voor wachtwoordvelden — dit is de moderne standaard van Material Design. Ten tweede, schakel de mogelijkheid om het wachtwoord te tonen niet uit — de gebruiker moet kunnen controleren wat hij heeft ingevoerd, vooral op mobiele apparaten met een klein toetsenbord.
Secure Text Entry vereist ook een correcte configuratie van automatisch aanvullen. Specificeer voor wachtwoordvelden altijd autofillHints="password" of autofillHints="newPassword", zodat wachtwoordmanagers gegevens correct kunnen invullen en opslaan. Gebruik voor het bevestigingsveld van een nieuw wachtwoord autofillHints="newPassword" om te voorkomen dat het systeem voorstelt het in te vullen met het huidige opgeslagen wachtwoord.
// Volledig wachtwoordveld met automatisch aanvullen en opschonen
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()
}
}
Veelgestelde vragen
textPassword verbergt alle ingevoerde tekens en schakelt automatische correctie uit. textVisiblePassword schakelt ook automatische correctie uit, maar toont tekens in open vorm. textVisiblePassword wordt gebruikt bij het schakelen van de wachtwoordzichtbaarheid — dit is geen gewone text, omdat automatische correctie en suggesties voor de veiligheid uitgeschakeld blijven.
Ja, maak een aangepaste klasse die de interface TransformationMethod implementeert. Overschrijf de methode getTransformation(), die een CharSequence met het gewenste vervangende symbool retourneert. Stel deze in via editText.transformationMethod = CustomPasswordTransformation(). Onthoud dat het symbool monospace moet zijn voor de veiligheid.
Op mobiele apparaten met kleine schermen en een aanraaktoetsenbord is de kans op fouten bij het invoeren van een wachtwoord aanzienlijk hoger dan op een desktop. De mogelijkheid om het ingevoerde wachtwoord te controleren vermindert het aantal invoerfouten en vermindert het aantal aanvragen voor wachtwoordherstel, wat de gebruikerservaring verbetert en de ondersteuningslast vermindert.
Stel de vlag FLAG_SECURE in op het venster van Activity of Dialog: window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE). Dit voorkomt het maken van schermafbeeldingen en schermopnames voor het hele venster. Houd er echter rekening mee dat dit ook schermafbeeldingen voor gewone inhoud uitschakelt, wat ongewenst kan zijn.
Sinds Android 8.0 (API 26) detecteert het Autofill Framework automatisch password-velden via inputType. Stel voor correcte werking importantForAutofill="yes" in en specificeer autofillHints ("password", "newPassword", "emailAddress"). Gboard en wachtwoordmanagers gebruiken deze attributen om opgeslagen wachtwoorden voor te stellen.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook