Secure Text Entry — co to je, ochrana zadávání a hesla v Androidu

Autor: IT Sectr Publikováno: 2026-07-07 Doba čtení: 9 min

Secure Text Entry — je režim zadávání textu v Androidu, při kterém se zadávané znaky zobrazují ve skryté podobě (tečky nebo hvězdičky) místo skutečných znaků. Tento režim se používá pro pole zadávání hesel, PIN kódů, CVV kódů a dalších důvěrných informací. Secure Text Entry nejen chrání data před vizuálním odposlechem, ale také zabraňuje únikům prostřednictvím snímků obrazovky, nahrávek obrazovky a funkcí automatické opravy. Podle Android Security Best Practices (2026) je skryté zadávání povinným požadavkem pro aplikace zpracovávající autentizační údaje uživatelů.

Hlavní body

  • Secure Text Entry — režim skrytého zadávání, zobrazující tečky místo znaků při zadávání hesla.
  • Aktivace — přes inputType="textPassword" v XML nebo TYPE_TEXT_VARIATION_PASSWORD v kódu.
  • Ochrana — zabraňuje vizuálnímu odposlechu, snímkům obrazovky a únikům přes automatickou opravu/slovník.
  • TransformationMethod — mechanismus Androidu nahrazující zobrazení znaků skrytými.
  • Přepínač viditelnosti — možnost zobrazit heslo pomocí endIconMode="password_toggle" v TextInputLayout.

Co je Secure Text Entry v Androidu

Secure Text Entry (chráněné zadávání textu) — je funkce Androidu, která nahrazuje zobrazení každého zadaného znaku maskovacím symbolem, obvykle tečkou (•) nebo hvězdičkou (*). Tím se zabraňuje čtení hesla přes rameno (shoulder surfing) a skrývá zadaná data před zvědavými pohledy. Tato funkce je také známá jako maskování hesla a je standardní praxí v mobilních aplikacích.

Na rozdíl od iOS, kde je Secure Text Entry samostatným nastavením UITextField, v Androidu se tato funkce aktivuje pomocí atributu inputType s variací PASSWORD. Když EditText obdrží inputType="textPassword", automaticky použije PasswordTransformationMethod — třídu odpovědnou za nahrazování znaků. Při zadávání každého nového znaku jej EditText okamžitě nahradí maskovacím symbolem prostřednictvím mechanismu TransformationMethod rozhraní.

Podle Android Source Code (AOSP, 2026) implementace PasswordTransformationMethod používá třídu TextPaint pro kreslení maskovacích symbolů. Velikost maskovacího symbolu odpovídá velikosti písma pole, což zabraňuje úniku informací prostřednictvím délky slova — všechny znaky vypadají stejně na šířku. To je důležité pro ochranu před útoky založenými na analýze délky zadávaných dat.

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

Jak Secure Text Entry funguje

Mechanismus Secure Text Entry v Androidu je založen na rozhraní TransformationMethod definovaném v balíčku android.text.method. PasswordTransformationMethod — je vestavěná implementace, která přepisuje metodu getTransformation(), vracející nahrazenou sekvenci znaků pro zobrazení. Původní text v Editable přitom zůstává nezměněn — mění se pouze jeho vizuální reprezentace.

Když uživatel zadá znak, EditText zavolá dispatchEvent a předá znak do InputConnection, který jej přidá do Editable. Poté EditText zavolá metodu getTransformation() aktuálního TransformationMethod, která obdrží původní CharSequence a vrátí SpannableString s maskovacími symboly. Tento SpannableString je vykreslen na obrazovce místo původního textu. Klíčová vlastnost — samotná transformace nemění obsah Editable, proto při volání getText().toString() je vrácen skutečně zadaný text.

Podle Android Developers Reference (2026) přidává PasswordTransformationMethod ke každému znaku MetricAffectingSpan, který nahrazuje glyf tečkou. Tyto span-y neovlivňují délku textu, takže kurzor a pozice zadávání zůstávají správně zachovány i při skrytém zobrazení. Existuje také VisiblePasswordTransformationMethod, který zobrazuje poslední zadaný znak na krátkou dobu (podobně jako iOS).

kotlin
// PasswordTransformationMethod - vestavěné maskování
editText.transformationMethod = PasswordTransformationMethod.getInstance()

// VisiblePasswordTransformationMethod - zobrazuje poslední znak
editText.transformationMethod = VisiblePasswordTransformationMethod.getInstance()

Přepínání viditelnosti hesla

Přepínání viditelnosti (password visibility toggle) — je funkce umožňující uživateli dočasně zobrazit zadané heslo pro kontrolu před odesláním formuláře. V Androidu je tato funkce implementována pomocí TextInputLayout s atributem app:endIconMode="password_toggle". Po kliknutí na ikonu oka se pole přepíná mezi textPassword a textVisiblePassword.

Implementace password_toggle v TextInputLayout automaticky mění inputType interního EditText a animuje ikonu (otevřené/zavřené oko). Je důležité si uvědomit, že při tomto přepínání se může pozice kurzoru resetovat, proto TextInputLayout ukládá a obnovuje pozici po změně režimu. Také při přepnutí na viditelné heslo se automatická oprava a návrhy nezapínají — používá se TYPE_TEXT_VARIATION_VISIBLE_PASSWORD, nikoli běžný text.

Podle Material Design Guidelines (2025) by ikona pro zobrazení hesla měla být vždy viditelná, nejen když je pole v ohnisku. Uživatel by měl mít možnost zkontrolovat heslo kdykoli. Ikona by neměla automaticky skrývat heslo po určité době — pouze na akci uživatele.

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>

Programové nastavení Secure Text Entry

Programové nastavení Secure Text Entry v Kotlinu se provádí pomocí nastavení inputType nebo pomocí setTransformationMethod(). Oba přístupy vedou ke stejnému výsledku, ale liší se v detailech. Nastavení inputType dále konfiguruje automatickou opravu a návrhy, zatímco setTransformationMethod ovlivňuje pouze zobrazení znaků.

Příklad přepínače hesla přes TextInputLayout

kotlin
// Programové přepínání viditelnosti hesla
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
    }

    // Obnovení pozice kurzoru
    val cursorPos = editText.selectionStart
    editText.setSelection(maxOf(0, cursorPos))
}

Vlastní TransformationMethod

kotlin
// Vlastní maskování — zobrazuje pouze poslední 4 znaky
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?) {}
}

Bezpečnostní aspekty skrytého zadávání

Secure Text Entry poskytuje ochranu na několika úrovních. Vizuální maskování zabraňuje čtení hesla přes rameno (shoulder surfing) — nejrozšířenější metodě krádeže hesel na veřejných místech. Vypnutí automatické opravy zabraňuje uložení hesla do uživatelského slovníku, což vylučuje jeho únik prostřednictvím prediktivního zadávání. Ochrana před snímky obrazovky (pokud je zapnut FLAG_SECURE) nedovoluje jiným aplikacím zachytit obsah pole.

Secure Text Entry však není úplnou ochranou. Útoky prostřednictvím odposlechu zadávání (keylogging) na úrovni systému mohou získat skutečné znaky z InputConnection. Škodlivé aplikace se službou usnadnění přístupu mohou číst obsah EditText, i když jsou znaky na obrazovce skryty. Také SSL-sniffing při přenosu dat na server může odhalit heslo, pokud se nepoužívá HTTPS se správnou validací certifikátu.

Podle OWASP Mobile Security Testing Guide (2025) se pro maximální ochranu hesel v Androidu doporučuje: používat inputType="textPassword" + vypnout autofill pro kritická pole; neuchovávat heslo v paměti déle, než je nutné; vyčistit pole hesla při minimalizaci aplikace (onPause/onStop); používat maskování i při krátkodobém zobrazení hesla.

Úroveň ochranySecure Text EntryDalší opatření
Vizuální odposlechMaskování znakůBiometric auth, vyhněte se shoulder surfing
Snímky obrazovkyČástečná (závisí na implementaci)FLAG_SECURE na Window
KeyloggingNechráníPoužívejte IME s bezpečným zadáváním
Automatická oprava/slovníkVypnutove výchozím nastavení vypnuto pro password
Odposlech sítěNechráníHTTPS s certificate pinning

Nejlepší postupy Secure Text Entry

Vývojáři Androidu by měli při práci se skrytým zadáváním dodržovat několik klíčových postupů. Za prvé, vždy používejte TextInputLayout s endIconMode="password_toggle" pro pole hesel — to je moderní standard Material Design. Za druhé, nevypínejte možnost zobrazení hesla — uživatel by měl mít možnost zkontrolovat, co zadal, zejména na mobilních zařízeních s malou klávesnicí.

Secure Text Entry také vyžaduje správné nastavení automatického vyplňování. Pro pole hesel vždy určete autofillHints="password" nebo autofillHints="newPassword", aby správci hesel mohli správně vyplňovat a ukládat data. Pro pole potvrzení nového hesla použijte autofillHints="newPassword", aby systém nenavrhoval jeho vyplnění aktuálně uloženým heslem.

  • TextInputLayout — používejte Material Design TextInputLayout s endIconMode pro přepínač viditelnosti.
  • Autofill — přidejte autofillHints="password" a importantForAutofill="yes" pro podporu správců.
  • Čištění — vyčistěte pole hesla při minimalizaci aplikace (onPause/onStop).
  • Délka — neomezujte délku hesla příliš přísně (minimálně 8 znaků, bez pevného maxima).
  • Biometrie — nabízejte biometrické přihlášení (BiometricPrompt) jako alternativu k ručnímu zadávání hesla.
kotlin
// Plné pole hesla s autofill a čištěním
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()
    }
}

Často kladené otázky

Jaký je rozdíl mezi textPassword a textVisiblePassword?

textPassword skrývá všechny zadávané znaky a vypíná automatickou opravu. textVisiblePassword také vypíná automatickou opravu, ale zobrazuje znaky v otevřené podobě. textVisiblePassword se používá při přepínání viditelnosti hesla — není to běžný text, protože automatická oprava a návrhy zůstávají z bezpečnostních důvodů vypnuty.

Lze vytvořit vlastní symbol pro maskování hesla?

Ano, vytvořte vlastní třídu implementující rozhraní TransformationMethod. Přepište metodu getTransformation(), která vrací CharSequence s požadovaným náhradním symbolem. Nastavte ji pomocí editText.transformationMethod = CustomPasswordTransformation(). Pamatujte, že symbol by měl být pro bezpečnost proporcionální.

Proč se nedoporučuje vypínat možnost zobrazení hesla?

Na mobilních zařízeních s malými obrazovkami a dotykovou klávesnicí je pravděpodobnost chyby při zadávání hesla výrazně vyšší než na stolním počítači. Možnost zkontrolovat zadané heslo snižuje počet chyb při zadávání a snižuje počet žádostí o obnovení hesla, což zlepšuje uživatelský zážitek a snižuje zátěž podpory.

Jak chránit heslo před snímky obrazovky aplikace?

Nastavte příznak FLAG_SECURE na okno Activity nebo Dialog: window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE). Tím zabráníte vytváření snímků obrazovky a nahrávání obrazovky pro celé okno. Mějte však na paměti, že to také vypne snímky obrazovky pro běžný obsah, což může být nežádoucí.

Jak funguje autofill pro password pole?

Od Androidu 8.0 (API 26) Autofill Framework automaticky detekuje password pole podle inputType. Pro správnou funkci nastavte importantForAutofill="yes" a určete autofillHints ("password", "newPassword", "emailAddress"). Gboard a správci hesel používají tyto atributy k navrhování uložených hesel.

Shrnutí

  • Secure Text Entry — režim skrytého zadávání, nahrazující znaky maskovacími symboly (tečkami) prostřednictvím PasswordTransformationMethod.
  • Aktivace — přes inputType="textPassword" nebo programové nastavení TYPE_TEXT_VARIATION_PASSWORD.
  • PasswordTransformationMethod — vestavěná třída Androidu nahrazující zobrazení znaků bez změny Editable.
  • Přepínač viditelnosti — implementován pomocí TextInputLayout s endIconMode="password_toggle" a TYPE_TEXT_VARIATION_VISIBLE_PASSWORD.
  • Ochrana — zabraňuje shoulder surfing, snímkům obrazovky (s FLAG_SECURE), automatické opravě a ukládání do slovníku.
  • Autofill — pro podporu správců hesel přidejte importantForAutofill a autofillHints="password".
  • Nejlepší postupy — používejte TextInputLayout, vyčistěte pole při minimalizaci, neomezujte délku hesla příliš přísně.

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také