Secure Text Entry — ce este, protecția introducerii și parolele în Android

Autor: IT Sectr Publicat: 2026-07-07 Timp de citire: 9 min

Secure Text Entry — este un mod de introducere a textului în Android, în care caracterele introduse sunt afișate într-o formă ascunsă (puncte sau asteriscuri) în locul caracterelor reale. Acest mod este utilizat pentru câmpurile de introducere a parolelor, codurilor PIN, codurilor CVV și a altor informații confidențiale. Secure Text Entry nu doar protejează datele împotriva interceptării vizuale, dar previne și scurgerile prin capturi de ecran, înregistrări ale ecranului și funcțiile de corectare automată. Conform Android Security Best Practices (2026), introducerea ascunsă este o cerință obligatorie pentru aplicațiile care procesează date de autentificare ale utilizatorilor.

Principalele puncte

  • Secure Text Entry — mod de introducere ascunsă, care afișează puncte în loc de caractere la tastarea parolei.
  • Activare — prin inputType="textPassword" în XML sau TYPE_TEXT_VARIATION_PASSWORD în cod.
  • Protecție — previne interceptarea vizuală, capturile de ecran și scurgerile prin corectare automată/dicționar.
  • TransformationMethod — mecanismul Android care înlocuiește afișarea caracterelor cu unele ascunse.
  • Comutator de vizibilitate — posibilitatea de a afișa parola prin endIconMode="password_toggle" în TextInputLayout.

Ce este Secure Text Entry în Android

Secure Text Entry (introducerea protejată a textului) — este o funcție Android care înlocuiește afișarea fiecărui caracter introdus cu un simbol de mascare, de obicei un punct (•) sau un asterisc (*). Aceasta previne citirea parolei peste umăr (shoulder surfing) și ascunde datele introduse de privirile indiscrete. Funcția este cunoscută și sub numele de mascare a parolei și este o practică standard în aplicațiile mobile.

Spre deosebire de iOS, unde Secure Text Entry este o setare separată a UITextField, în Android această funcție se activează prin atributul inputType cu variația PASSWORD. Când EditText primește inputType="textPassword", aplică automat PasswordTransformationMethod — clasa responsabilă pentru înlocuirea caracterelor. La introducerea fiecărui caracter nou, EditText îl înlocuiește instantaneu cu un simbol de mascare prin mecanismul TransformationMethod al interfeței.

Conform Android Source Code (AOSP, 2026), implementarea PasswordTransformationMethod utilizează clasa TextPaint pentru redarea simbolurilor de mascare. Dimensiunea simbolului de mascare coincide cu dimensiunea fontului câmpului, ceea ce previne scurgerea informațiilor prin lungimea cuvântului — toate caracterele arată identic ca lățime. Acest lucru este important pentru protecția împotriva atacurilor bazate pe analiza lungimii datelor introduse.

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

Cum funcționează Secure Text Entry

Mecanismul Secure Text Entry în Android se bazează pe interfața TransformationMethod, definită în pachetul android.text.method. PasswordTransformationMethod — este o implementare încorporată care suprascrie metoda getTransformation(), returnând o secvență de caractere înlocuite pentru afișare. Între timp, textul original din Editable rămâne neschimbat — se modifică doar reprezentarea sa vizuală.

Când utilizatorul introduce un caracter, EditText apelează dispatchEvent și transmite caracterul către InputConnection, care îl adaugă în Editable. Apoi EditText apelează metoda getTransformation() a TransformationMethod curent, care primește CharSequence-ul original și returnează un SpannableString cu simboluri de mascare. Acest SpannableString este redat pe ecran în locul textului original. Caracteristica cheie — transformarea în sine nu modifică conținutul Editable, de aceea la apelarea getText().toString() se returnează textul real introdus.

Conform Android Developers Reference (2026), PasswordTransformationMethod adaugă la fiecare caracter un MetricAffectingSpan care înlocuiește gliful cu un punct. Aceste span-uri nu afectează lungimea textului, astfel încât cursorul și poziția de introducere se păstrează corect chiar și în cazul afișării ascunse. Există și VisiblePasswordTransformationMethod, care afișează ultimul caracter introdus pentru o scurtă perioadă (similar cu iOS).

kotlin
// PasswordTransformationMethod - mascare încorporată
editText.transformationMethod = PasswordTransformationMethod.getInstance()

// VisiblePasswordTransformationMethod - arată ultimul caracter
editText.transformationMethod = VisiblePasswordTransformationMethod.getInstance()

Comutarea vizibilității parolei

Comutarea vizibilității (password visibility toggle) — este o funcție care permite utilizatorului să afișeze temporar parola introdusă pentru a o verifica înainte de trimiterea formularului. În Android, această funcție se realizează prin TextInputLayout cu atributul app:endIconMode="password_toggle". La apăsarea pictogramei ochiului, câmpul comută între textPassword și textVisiblePassword.

Implementarea password_toggle în TextInputLayout schimbă automat inputType-ul EditText-ului intern și animează pictograma (ochi deschis/închis). Este important de reținut că la această comutare, poziția cursorului se poate reseta, de aceea TextInputLayout salvează și restaurează poziția după schimbarea modului. De asemenea, la comutarea pe parola vizibilă, corectarea automată și sugestiile nu se activează — se utilizează TYPE_TEXT_VARIATION_VISIBLE_PASSWORD, nu text obișnuit.

Conform Material Design Guidelines (2025), pictograma de afișare a parolei trebuie să fie întotdeauna vizibilă, nu doar când câmpul este focalizat. Utilizatorul trebuie să aibă posibilitatea de a verifica parola în orice moment. Pictograma nu trebuie să ascundă automat parola după un anumit timp — ci doar la acțiunea utilizatorului.

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>

Configurarea programatică a Secure Text Entry

Setarea programatică a Secure Text Entry în Kotlin se realizează prin stabilirea inputType sau prin setTransformationMethod(). Ambele abordări duc la același rezultat, dar diferă în detalii. Setarea inputType configurează suplimentar corectarea automată și sugestiile, în timp ce setTransformationMethod influențează doar afișarea caracterelor.

Exemplu de comutare a parolei prin TextInputLayout

kotlin
// Comutarea programatică a vizibilității parolei
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
    }

    // Restaurarea poziției cursorului
    val cursorPos = editText.selectionStart
    editText.setSelection(maxOf(0, cursorPos))
}

TransformationMethod personalizat

kotlin
// Mascare personalizată — arată doar ultimele 4 caractere
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?) {}
}

Aspecte de securitate ale introducerii ascunse

Secure Text Entry asigură protecție la mai multe niveluri. Mascarea vizuală previne citirea parolei peste umăr (shoulder surfing) — cea mai răspândită metodă de furt al parolelor în locuri publice. Dezactivarea corectării automate previne salvarea parolei în dicționarul utilizatorului, ceea ce exclude scurgerea acesteia prin introducerea predictivă. Protecția împotriva capturilor de ecran (dacă FLAG_SECURE este activat) nu permite altor aplicații să captureze conținutul câmpului.

Totuși Secure Text Entry nu este o protecție completă. Atacurile prin interceptarea introducerii (keylogging) la nivel de sistem pot obține caractere reale din InputConnection. Aplicațiile rău intenționate cu serviciu de accesibilitate pot citi conținutul EditText, chiar dacă caracterele sunt ascunse pe ecran. De asemenea, SSL-sniffing-ul la transmiterea datelor către server poate dezvălui parola dacă nu se utilizează HTTPS cu validarea corectă a certificatului.

Conform OWASP Mobile Security Testing Guide (2025), pentru protecția maximă a parolelor în Android se recomandă: utilizarea inputType="textPassword" + dezactivarea autofill pentru câmpurile critice; nu păstrați parola în memorie mai mult decât este necesar; goliți câmpul parolei la minimizarea aplicației (onPause/onStop); utilizați mascarea chiar și la afișarea temporară a parolei.

Nivel de protecțieSecure Text EntryMăsuri suplimentare
Interceptare vizualăMascarea caracterelorBiometric auth, evitați shoulder surfing
Capturi de ecranParțială (depinde de implementare)FLAG_SECURE pe Window
KeyloggingNu protejeazăUtilizați IME cu introducere securizată
Corectare automată/dicționarDezactivatădezactivată implicit pentru password
Interceptare rețeaNu protejeazăHTTPS cu certificate pinning

Cele mai bune practici Secure Text Entry

Dezvoltatorii Android ar trebui să respecte câteva practici cheie atunci când lucrează cu introducerea ascunsă. În primul rând, utilizați întotdeauna TextInputLayout cu endIconMode="password_toggle" pentru câmpurile de parolă — acesta este standardul modern Material Design. În al doilea rând, nu dezactivați posibilitatea de a afișa parola — utilizatorul trebuie să poată verifica ce a introdus, în special pe dispozitivele mobile cu tastatură mică.

Secure Text Entry necesită, de asemenea, configurarea corectă a completării automate. Pentru câmpurile de parolă, specificați neapărat autofillHints="password" sau autofillHints="newPassword" pentru ca managerii de parole să poată completa și salva corect datele. Pentru câmpul de confirmare a noii parole, utilizați autofillHints="newPassword" pentru ca sistemul să nu propună completarea acestuia cu parola curentă salvată.

  • TextInputLayout — utilizați Material Design TextInputLayout cu endIconMode pentru comutatorul de vizibilitate.
  • Autofill — adăugați autofillHints="password" și importantForAutofill="yes" pentru suportul managerilor.
  • Golirea — goliți câmpul parolei la minimizarea aplicației (onPause/onStop).
  • Lungimea — nu limitați prea strict lungimea parolei (minimum 8 caractere, fără un maxim rigid).
  • Biometrie — oferiți autentificare biometrică (BiometricPrompt) ca alternativă la introducerea manuală a parolei.
kotlin
// Câmp complet de parolă cu completare automată și curățare
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()
    }
}

Întrebări frecvente

Care este diferența dintre textPassword și textVisiblePassword?

textPassword ascunde toate caracterele introduse și dezactivează corectarea automată. textVisiblePassword dezactivează și corectarea automată, dar afișează caracterele în formă deschisă. textVisiblePassword este utilizat la comutarea vizibilității parolei — nu este un text obișnuit, deoarece corectarea automată și sugestiile rămân dezactivate pentru securitate.

Se poate face un simbol personalizat pentru mascarea parolei?

Da, creați o clasă personalizată care implementează interfața TransformationMethod. Suprascrieți metoda getTransformation(), returnând un CharSequence cu simbolul de înlocuire dorit. Setați-l prin editText.transformationMethod = CustomPasswordTransformation(). Amintiți-vă că simbolul trebuie să fie monospațiat pentru securitate.

De ce nu se recomandă dezactivarea posibilității de a afișa parola?

Pe dispozitivele mobile cu ecrane mici și tastatură tactilă, probabilitatea de eroare la introducerea parolei este semnificativ mai mare decât pe desktop. Posibilitatea de a verifica parola introdusă reduce numărul de erori de introducere și scade numărul de cereri de recuperare a parolei, ceea ce îmbunătățește experiența utilizatorului și reduce sarcina asupra suportului.

Cum să protejați parola împotriva capturilor de ecran ale aplicației?

Setați flag-ul FLAG_SECURE pe fereastra Activity sau Dialog: window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE). Aceasta va împiedica crearea capturilor de ecran și înregistrarea ecranului pentru întreaga fereastră. Totuși, rețineți că aceasta va dezactiva și capturile de ecran pentru conținutul obișnuit, ceea ce poate fi nedorit.

Cum funcționează autofill pentru câmpurile password?

Începând cu Android 8.0 (API 26), Autofill Framework detectează automat câmpurile password după inputType. Pentru funcționarea corectă, setați importantForAutofill="yes" și specificați autofillHints ("password", "newPassword", "emailAddress"). Gboard și managerii de parole utilizează aceste atribute pentru a sugera parolele salvate.

Concluzii

  • Secure Text Entry — mod de introducere ascunsă, care înlocuiește caracterele cu simboluri de mascare (puncte) prin PasswordTransformationMethod.
  • Activare — prin inputType="textPassword" sau setarea programatică TYPE_TEXT_VARIATION_PASSWORD.
  • PasswordTransformationMethod — clasă Android încorporată care înlocuiește afișarea caracterelor fără a modifica Editable.
  • Comutator de vizibilitate — realizat prin TextInputLayout cu endIconMode="password_toggle" și TYPE_TEXT_VARIATION_VISIBLE_PASSWORD.
  • Protecție — previne shoulder surfing, capturile de ecran (cu FLAG_SECURE), corectarea automată și salvarea în dicționar.
  • Autofill — pentru suportul managerilor de parole, adăugați importantForAutofill și autofillHints="password".
  • Cele mai bune practici — utilizați TextInputLayout, goliți câmpul la minimizare, nu limitați prea strict lungimea parolei.

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și