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 (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.
<!-- 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" />
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).
// PasswordTransformationMethod - vestavěné maskování
editText.transformationMethod = PasswordTransformationMethod.getInstance()
// VisiblePasswordTransformationMethod - zobrazuje poslední znak
editText.transformationMethod = VisiblePasswordTransformationMethod.getInstance()
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.
<!-- 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 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ů.
// 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í 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?) {}
}
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ň ochrany | Secure Text Entry | Další opatření |
|---|---|---|
| Vizuální odposlech | Maskování znaků | Biometric auth, vyhněte se shoulder surfing |
| Snímky obrazovky | Částečná (závisí na implementaci) | FLAG_SECURE na Window |
| Keylogging | Nechrání | Používejte IME s bezpečným zadáváním |
| Automatická oprava/slovník | Vypnuto | ve výchozím nastavení vypnuto pro password |
| Odposlech sítě | Nechrání | HTTPS s certificate pinning |
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.
// 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
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.
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í.
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.
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í.
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í
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í.
Přečtěte si také