Secure Text Entry — vad är det, skydd av inmatning och lösenord i Android

Författare: IT Sectr Publicerad: 2026-07-07 Lästid: 9 min

Secure Text Entry — är ett textinmatningsläge i Android där inskrivna tecken visas i dold form (punkter eller asterisker) istället för faktiska tecken. Detta läge används för inmatningsfält för lösenord, PIN-koder, CVV-koder och annan konfidentiell information. Secure Text Entry skyddar inte bara data mot visuell avlyssning utan förhindrar också läckage via skärmbilder, skärminspelningar och automatiska korrigeringsfunktioner. Enligt Android Security Best Practices (2026) är dold inmatning ett obligatoriskt krav för applikationer som behandlar användares autentiseringsdata.

Huvudpunkter

  • Secure Text Entry — dolt inmatningsläge som visar punkter istället för tecken vid lösenordsinmatning.
  • Aktivering — via inputType="textPassword" i XML eller TYPE_TEXT_VARIATION_PASSWORD i kod.
  • Skydd — förhindrar visuell avlyssning, skärmbilder och läckage via autokorrigering/ordbok.
  • TransformationMethod — Android-mekanism som ersätter visning av tecken med dolda.
  • Synlighetsväxlare — möjlighet att visa lösenordet via endIconMode="password_toggle" i TextInputLayout.

Vad är Secure Text Entry i Android

Secure Text Entry (skyddad textinmatning) — är en Android-funktion som ersätter visningen av varje inskrivet tecken med en maskeringssymbol, vanligtvis en punkt (•) eller en asterisk (*). Detta förhindrar att lösenord läses över axeln (shoulder surfing) och döljer inmatad data från obehöriga ögon. Funktionen är också känd som lösenordsmaskering och är standardpraxis i mobila applikationer.

Till skillnad från iOS, där Secure Text Entry är en separat inställning för UITextField, aktiveras denna funktion i Android via attributet inputType med variationen PASSWORD. När EditText får inputType="textPassword" tillämpar det automatiskt PasswordTransformationMethod — klassen som ansvarar för att ersätta tecken. Vid varje inskrivet nytt tecken ersätter EditText det omedelbart med en maskeringssymbol genom TransformationMethod-gränssnittets mekanism.

Enligt Android Source Code (AOSP, 2026) använder implementeringen av PasswordTransformationMethod klassen TextPaint för att rita maskeringssymboler. Storleken på maskeringssymbolen matchar fältets teckenstorlek, vilket förhindrar informationsläckage via ordlängd — alla tecken ser identiska ut i bredd. Detta är viktigt för skydd mot attacker baserade på analys av längden på inmatad data.

xml
<!-- 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" />

Hur Secure Text Entry fungerar

Mekanismen för Secure Text Entry i Android är baserad på gränssnittet TransformationMethod, definierat i paketet android.text.method. PasswordTransformationMethod — är en inbyggd implementering som åsidosätter metoden getTransformation() och returnerar en ersatt teckensekvens för visning. Under tiden förblir den ursprungliga texten i Editable oförändrad — endast dess visuella representation ändras.

När användaren anger ett tecken anropar EditText dispatchEvent och skickar tecknet till InputConnection, som lägger till det i Editable. Därefter anropar EditText metoden getTransformation() för aktuell TransformationMethod, som tar emot den ursprungliga CharSequence och returnerar en SpannableString med maskeringssymboler. Denna SpannableString visas på skärmen istället för den ursprungliga texten. Nyckelfunktionen — själva transformationen ändrar inte innehållet i Editable, därför returneras den faktiskt inskrivna texten vid anrop av getText().toString().

Enligt Android Developers Reference (2026) lägger PasswordTransformationMethod till en MetricAffectingSpan till varje tecken som ersätter glyfen med en punkt. Dessa span påverkar inte textlängden, så markören och inmatningspositionen bibehålls korrekt även vid dold visning. Det finns också VisiblePasswordTransformationMethod som visar det senast inskrivna tecknet under en kort tid (liknande iOS).

kotlin
// PasswordTransformationMethod - inbyggd maskering
editText.transformationMethod = PasswordTransformationMethod.getInstance()

// VisiblePasswordTransformationMethod - visar sista tecknet
editText.transformationMethod = VisiblePasswordTransformationMethod.getInstance()

Växla lösenordssynlighet

Växla synlighet (password visibility toggle) — är en funktion som gör att användaren tillfälligt kan visa det inskrivna lösenordet för att kontrollera det innan formuläret skickas. I Android implementeras denna funktion via TextInputLayout med attributet app:endIconMode="password_toggle". När man klickar på ögonikonen växlar fältet mellan textPassword och textVisiblePassword.

Implementeringen av password_toggle i TextInputLayout ändrar automatiskt inputType för den interna EditText och animerar ikonen (öppet/stängt öga). Det är viktigt att komma ihåg att vid denna växling kan markörpositionen återställas, därför sparar och återställer TextInputLayout positionen efter lägesändringen. Vid växling till synligt lösenord aktiveras inte heller autokorrigering och förslag — TYPE_TEXT_VARIATION_VISIBLE_PASSWORD används, inte vanlig text.

Enligt Material Design Guidelines (2025) bör ikonen för att visa lösenordet alltid vara synlig, inte bara när fältet är i fokus. Användaren ska kunna kontrollera lösenordet när som helst. Ikonen bör inte automatiskt dölja lösenordet efter en viss tid — endast genom användarens handling.

xml
<!-- 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>

Programmatisk konfiguration av Secure Text Entry

Programmatisk inställning av Secure Text Entry i Kotlin görs genom att ställa in inputType eller via setTransformationMethod(). Båda metoderna leder till samma resultat men skiljer sig i detaljer. Att ställa in inputType konfigurerar även autokorrigering och förslag, medan setTransformationMethod endast påverkar visningen av tecken.

Exempel på lösenordsväxlare via TextInputLayout

kotlin
// Programmatisk växling av lösenordssynlighet
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
    }

    // Återställ markörposition
    val cursorPos = editText.selectionStart
    editText.setSelection(maxOf(0, cursorPos))
}

Anpassad TransformationMethod

kotlin
// Anpassad maskering — visar endast de 4 sista tecknen
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?) {}
}

Säkerhetsaspekter av dold inmatning

Secure Text Entry ger skydd på flera nivåer. Visuell maskering förhindrar att lösenord läses över axeln (shoulder surfing) — den vanligaste metoden för lösenordsstöld på offentliga platser. Att stänga av autokorrigering förhindrar att lösenordet sparas i användarens ordbok, vilket utesluter läckage via prediktiv inmatning. Skydd mot skärmbilder (om FLAG_SECURE är aktiverat) hindrar andra applikationer från att fånga fältets innehåll.

Secure Text Entry är dock inte ett fullständigt skydd. Attacker via inmatningsavlyssning (keylogging) på systemnivå kan få verkliga tecken från InputConnection. Skadliga applikationer med tillgänglighetstjänst kan läsa innehållet i EditText, även om tecknen är dolda på skärmen. Även SSL-sniffing vid dataöverföring till servern kan avslöja lösenordet om HTTPS inte används med korrekt certifikatvalidering.

Enligt OWASP Mobile Security Testing Guide (2025) rekommenderas följande för maximalt skydd av lösenord i Android: använd inputType="textPassword" + stäng av autofill för kritiska fält; lagra inte lösenordet i minnet längre än nödvändigt; rensa lösenordsfältet vid minimering av applikationen (onPause/onStop); använd maskering även vid tillfällig visning av lösenordet.

SkyddsnivåSecure Text EntryYtterligare åtgärder
Visuell avlyssningMaskering av teckenBiometric auth, undvik shoulder surfing
SkärmbilderDelvis (beror på implementering)FLAG_SECURE på Window
KeyloggingSkyddar inteAnvänd IME med säker inmatning
Autokorrigering/ordbokAvstängdsom standard avstängd för lösenord
NätverksavlyssningSkyddar inteHTTPS med certificate pinning

Bästa praxis för Secure Text Entry

Android-utvecklare bör följa flera viktiga metoder när de arbetar med dold inmatning. För det första, använd alltid TextInputLayout med endIconMode="password_toggle" för lösenordsfält — detta är den moderna standarden för Material Design. För det andra, stäng inte av möjligheten att visa lösenordet — användaren måste kunna kontrollera vad den har skrivit in, särskilt på mobila enheter med litet tangentbord.

Secure Text Entry kräver också korrekt konfiguration av autofyll. För lösenordsfält, ange alltid autofillHints="password" eller autofillHints="newPassword" så att lösenordshanterare kan fylla i och spara data korrekt. För bekräftelsefältet för nytt lösenord, använd autofillHints="newPassword" så att systemet inte föreslår att fylla i det med det aktuella sparade lösenordet.

  • TextInputLayout — använd Material Design TextInputLayout med endIconMode för synlighetsväxlaren.
  • Autofill — lägg till autofillHints="password" och importantForAutofill="yes" för stöd av hanterare.
  • Rensning — rensa lösenordsfältet vid minimering av applikationen (onPause/onStop).
  • Längd — begränsa inte lösenordslängden alltför strikt (minst 8 tecken, utan hårt maximum).
  • Biometri — erbjud biometrisk inloggning (BiometricPrompt) som alternativ till manuell lösenordsinmatning.
kotlin
// Fullt lösenordsfält med autofyll och rensning
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()
    }
}

Vanliga frågor

Vad är skillnaden mellan textPassword och textVisiblePassword?

textPassword döljer alla inskrivna tecken och stänger av autokorrigering. textVisiblePassword stänger också av autokorrigering men visar tecken i öppen form. textVisiblePassword används vid växling av lösenordssynlighet — detta är inte vanlig text, eftersom autokorrigering och förslag förblir avstängda av säkerhetsskäl.

Kan man skapa en anpassad symbol för lösenordsmaskering?

Ja, skapa en anpassad klass som implementerar gränssnittet TransformationMethod. Åsidosätt metoden getTransformation() som returnerar en CharSequence med önskad ersättningssymbol. Ställ in den via editText.transformationMethod = CustomPasswordTransformation(). Kom ihåg att symbolen bör vara monospace för säkerheten.

Varför rekommenderas det inte att stänga av möjligheten att visa lösenordet?

På mobila enheter med små skärmar och pektangentbord är sannolikheten för fel vid lösenordsinmatning betydligt högre än på en stationär dator. Möjligheten att kontrollera det inskrivna lösenordet minskar antalet inmatningsfel och minskar antalet begäranden om lösenordsåterställning, vilket förbättrar användarupplevelsen och minskar supportbördan.

Hur skyddar man lösenordet från applikationens skärmbilder?

Ställ in flaggan FLAG_SECURE på fönstret för Activity eller Dialog: window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE). Detta förhindrar skapande av skärmbilder och skärminspelning för hela fönstret. Observera dock att detta också stänger av skärmbilder för vanligt innehåll, vilket kan vara oönskat.

Hur fungerar autofill för lösenordsfält?

Från och med Android 8.0 (API 26) upptäcker Autofill Framework automatiskt lösenordsfält via inputType. För korrekt funktion, ställ in importantForAutofill="yes" och ange autofillHints ("password", "newPassword", "emailAddress"). Gboard och lösenordshanterare använder dessa attribut för att föreslå sparade lösenord.

Sammanfattning

  • Secure Text Entry — dolt inmatningsläge som ersätter tecken med maskeringssymboler (punkter) via PasswordTransformationMethod.
  • Aktivering — via inputType="textPassword" eller programmatisk inställning av TYPE_TEXT_VARIATION_PASSWORD.
  • PasswordTransformationMethod — inbyggd Android-klass som ersätter teckenvisning utan att ändra Editable.
  • Synlighetsväxlare — implementeras via TextInputLayout med endIconMode="password_toggle" och TYPE_TEXT_VARIATION_VISIBLE_PASSWORD.
  • Skydd — förhindrar shoulder surfing, skärmbilder (med FLAG_SECURE), autokorrigering och lagring i ordbok.
  • Autofill — för stöd av lösenordshanterare, lägg till importantForAutofill och autofillHints="password".
  • Bästa praxis — använd TextInputLayout, rensa fältet vid minimering, begränsa inte lösenordslängden alltför strikt.

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också