Secure Text Entry ist ein Texteingabemodus in Android, bei dem eingegebene Zeichen in versteckter Form (Punkte oder Sternchen) anstelle der tatsächlichen Zeichen angezeigt werden. Dieser Modus wird für Passwortfelder, PIN-Codes, CVV-Codes und andere vertrauliche Informationen verwendet. Secure Text Entry schützt Daten nicht nur vor visuellem Abfangen, sondern verhindert auch Leaks durch Screenshots, Bildschirmaufnahmen und Autokorrekturfunktionen. Laut Android Security Best Practices (2026) ist die versteckte Eingabe eine zwingende Anforderung für Anwendungen, die Benutzerauthentifizierungsdaten verarbeiten.
Wichtige Erkenntnisse
Secure Text Entry (geschützte Texteingabe) ist eine Android-Funktion, die die Anzeige jedes eingegebenen Zeichens durch ein Maskierungszeichen, normalerweise einen Punkt (•) oder ein Sternchen (*), ersetzt. Dies verhindert das Ausspähen von Passwörtern über die Schulter (Shoulder Surfing) und verbirgt eingegebene Daten vor neugierigen Blicken. Diese Funktion wird auch als Passwortmaskierung bezeichnet und ist eine Standardpraxis in mobilen Anwendungen.
Im Gegensatz zu iOS, wo Secure Text Entry eine separate UITextField-Einstellung ist, wird diese Funktion in Android über das Attribut inputType mit der Variante PASSWORD aktiviert. Wenn ein EditText inputType="textPassword" erhält, wendet er automatisch PasswordTransformationMethod an — eine Klasse, die für die Zeichenersetzung verantwortlich ist. Bei der Eingabe jedes neuen Zeichens ersetzt EditText es sofort durch ein Maskierungszeichen über den Mechanismus der TransformationMethod-Schnittstelle.
Laut Android Source Code (AOSP, 2026) verwendet die Implementierung von PasswordTransformationMethod die Klasse TextPaint zum Rendern von Maskierungszeichen. Die Größe des Maskierungszeichens entspricht der Schriftgröße des Feldes, was Informationslecks über die Wortlänge verhindert — alle Zeichen sehen in der Breite gleich aus. Dies ist wichtig für den Schutz vor Angriffen, die auf der Analyse der Länge eingegebener Daten basieren.
<!-- 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" />
Der Secure Text Entry-Mechanismus in Android basiert auf der TransformationMethod-Schnittstelle, definiert im Paket android.text.method. PasswordTransformationMethod ist eine integrierte Implementierung, die die Methode getTransformation() überschreibt und eine ersetzte Zeichenfolge zur Anzeige zurückgibt. Der ursprüngliche Text in Editable bleibt unverändert — nur seine visuelle Darstellung wird geändert.
Wenn ein Benutzer ein Zeichen eingibt, ruft EditText dispatchEvent auf und übergibt das Zeichen an InputConnection, das es zu Editable hinzufügt. Dann ruft EditText die Methode getTransformation() des aktuellen TransformationMethod auf, die das ursprüngliche CharSequence nimmt und ein SpannableString mit Maskierungszeichen zurückgibt. Dieses SpannableString wird anstelle des ursprünglichen Textes auf dem Bildschirm gerendert. Das Hauptmerkmal ist, dass die Transformation selbst den Editable-Inhalt nicht ändert, sodass getText().toString() den tatsächlich eingegebenen Text zurückgibt.
Laut Android Developers Reference (2026) fügt PasswordTransformationMethod jedem Zeichen ein MetricAffectingSpan hinzu, das die Glyphe durch einen Punkt ersetzt. Diese Spans beeinflussen die Textlänge nicht, sodass Cursor und Eingabeposition auch bei versteckter Anzeige korrekt erhalten bleiben. Es gibt auch VisiblePasswordTransformationMethod, das das letzte eingegebene Zeichen für kurze Zeit anzeigt (ähnlich wie iOS).
// PasswordTransformationMethod - built-in masking
editText.transformationMethod = PasswordTransformationMethod.getInstance()
// VisiblePasswordTransformationMethod - shows last char
editText.transformationMethod = VisiblePasswordTransformationMethod.getInstance()
Sichtbarkeitsumschaltung (password visibility toggle) ist eine Funktion, die es dem Benutzer ermöglicht, das eingegebene Passwort vor dem Absenden des Formulars vorübergehend anzuzeigen, um es zu überprüfen. In Android wird diese Funktion über TextInputLayout mit dem Attribut app:endIconMode="password_toggle" implementiert. Beim Antippen des Augensymbols wechselt das Feld zwischen textPassword und textVisiblePassword.
Die Implementierung von password_toggle in TextInputLayout ändert automatisch den inputType des internen EditText und animiert das Symbol (Auge offen/geschlossen). Es ist wichtig zu beachten, dass während dieses Wechsels die Cursorposition zurückgesetzt werden kann, daher speichert und stellt TextInputLayout die Position nach dem Moduswechsel wieder her. Beim Umschalten auf sichtbares Passwort werden Autokorrektur und Vorschläge nicht aktiviert — es wird TYPE_TEXT_VARIATION_VISIBLE_PASSWORD verwendet, nicht normaler Text.
Laut Material Design Guidelines (2025) sollte das Passwort-Anzeigesymbol immer sichtbar sein, nicht nur wenn das Feld fokussiert ist. Der Benutzer sollte das Passwort jederzeit überprüfen können. Das Symbol sollte das Passwort nicht nach einer bestimmten Zeit automatisch ausblenden — nur durch Benutzeraktion.
<!-- 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>
Die programmatische Einstellung von Secure Text Entry in Kotlin erfolgt durch Setzen von inputType oder über setTransformationMethod(). Beide Ansätze führen zum gleichen Ergebnis, unterscheiden sich jedoch in Details. Das Setzen von inputType konfiguriert zusätzlich Autokorrektur und Vorschläge, während setTransformationMethod nur die Zeichenanzeige beeinflusst.
// Programmatic password visibility toggle
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
}
// Restore cursor position
val cursorPos = editText.selectionStart
editText.setSelection(maxOf(0, cursorPos))
}
// Custom masking — shows only last 4 chars
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 bietet Schutz auf mehreren Ebenen. Die visuelle Maskierung verhindert das Ausspähen von Passwörtern über die Schulter (Shoulder Surfing) — die häufigste Methode des Passwortdiebstahls an öffentlichen Orten. Das Deaktivieren der Autokorrektur verhindert, dass das Passwort im Benutzerwörterbuch gespeichert wird, wodurch Lecks durch predictive Input vermieden werden. Der Schutz vor Screenshots (wenn FLAG_SECURE aktiviert ist) verhindert, dass andere Anwendungen den Feldinhalt erfassen.
Allerdings bietet Secure Text Entry keinen vollständigen Schutz. Angriffe durch Eingabeabfangen (Keylogging) auf Systemebene können tatsächliche Zeichen aus InputConnection abrufen. Böswillige Anwendungen mit Barrierefreiheitsdiensten können den EditText-Inhalt lesen, selbst wenn Zeichen auf dem Bildschirm ausgeblendet sind. Auch SSL-Sniffing während der Datenübertragung an den Server kann das Passwort offenlegen, wenn HTTPS mit ordnungsgemäßer Zertifikatsvalidierung nicht verwendet wird.
Laut OWASP Mobile Security Testing Guide (2025) wird für maximalen Passwortschutz in Android empfohlen: inputType="textPassword" + Autofill für kritische Felder deaktivieren; Passwort nicht länger als nötig im Arbeitsspeicher cachen; Passwortfeld beim Minimieren der Anwendung löschen (onPause/onStop); Maskierung auch bei kurzer Passwortanzeige verwenden.
| Schutzebene | Secure Text Entry | Zusätzliche Maßnahmen |
|---|---|---|
| Visuelles Abfangen | Zeichenmaskierung | Biometrische Authentifizierung, Shoulder Surfing vermeiden |
| Screenshots | Teilweise (implementierungsabhängig) | FLAG_SECURE auf Window |
| Keylogging | Schützt nicht | IME mit sicherer Eingabe verwenden |
| Autokorrektur/Wörterbuch | Deaktiviert | standardmäßig für Passwort deaktiviert |
| Netzwerkabfangen | Schützt nicht | HTTPS mit Zertifikatspinning |
Android-Entwickler sollten bei der Arbeit mit versteckter Eingabe mehrere wichtige Praktiken befolgen. Erstens, verwenden Sie immer TextInputLayout mit endIconMode="password_toggle" für Passwortfelder — dies ist der moderne Material Design-Standard. Zweitens, deaktivieren Sie nicht die Möglichkeit, das Passwort anzuzeigen — der Benutzer sollte überprüfen können, was er eingegeben hat, insbesondere auf mobilen Geräten mit kleinen Tastaturen.
Secure Text Entry erfordert auch eine ordnungsgemäße Autofill-Konfiguration. Für Passwortfelder geben Sie immer autofillHints="password" oder autofillHints="newPassword" an, damit Passwortmanager Daten korrekt ausfüllen und speichern können. Für das Bestätigungsfeld für ein neues Passwort verwenden Sie autofillHints="newPassword", damit das System nicht vorschlägt, es mit dem aktuell gespeicherten Passwort zu füllen.
// Full password field with autofill and cleanup
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()
}
}
Häufig gestellte Fragen
textPassword verbirgt alle eingegebenen Zeichen und deaktiviert die Autokorrektur. textVisiblePassword deaktiviert ebenfalls die Autokorrektur, zeigt die Zeichen aber in Klartext an. textVisiblePassword wird beim Umschalten der Passwortsichtbarkeit verwendet — es ist kein normaler Text, da Autokorrektur und Vorschläge aus Sicherheitsgründen deaktiviert bleiben.
Ja, erstellen Sie eine benutzerdefinierte Klasse, die die TransformationMethod-Schnittstelle implementiert. Überschreiben Sie die Methode getTransformation(), die ein CharSequence mit dem gewünschten Ersatzzeichen zurückgibt. Setzen Sie es über editText.transformationMethod = CustomPasswordTransformation(). Denken Sie daran, dass das Zeichen aus Sicherheitsgründen monospaced sein muss.
Auf mobilen Geräten mit kleinen Bildschirmen und Touch-Tastaturen ist die Wahrscheinlichkeit von Eingabefehlern bei der Passworteingabe erheblich höher als auf dem Desktop. Die Möglichkeit, das eingegebene Passwort zu überprüfen, reduziert Eingabefehler und verringert die Anzahl der Passwort-Zurücksetzungsanfragen, was die Benutzererfahrung verbessert und die Support-Last reduziert.
Setzen Sie das Flag FLAG_SECURE auf dem Activity- oder Dialog-Fenster: window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE). Dies verhindert Screenshots und Bildschirmaufnahmen für das gesamte Fenster. Beachten Sie jedoch, dass dies auch Screenshots für normale Inhalte deaktiviert, was unerwünscht sein kann.
Ab Android 8.0 (API 26) erkennt das Autofill-Framework Passwortfelder automatisch anhand von inputType. Für den korrekten Betrieb setzen Sie importantForAutofill="yes" und geben Sie autofillHints ("password", "newPassword", "emailAddress") an. Gboard und Passwortmanager verwenden diese Attribute, um gespeicherte Passwörter vorzuschlagen.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch