Secure Text Entry é um modo de entrada de texto no Android onde os caracteres digitados são exibidos de forma oculta (pontos ou asteriscos) em vez dos caracteres reais. Este modo é usado para campos de senha, códigos PIN, códigos CVV e outras informações confidenciais. O Secure Text Entry não apenas protege os dados contra interceptação visual, mas também evita vazamentos através de capturas de tela, gravações de tela e funções de autocorreção. De acordo com Android Security Best Practices (2026), a entrada oculta é um requisito obrigatório para aplicativos que lidam com dados de autenticação de usuários.
Principais conclusões
Secure Text Entry (entrada de texto protegida) é um recurso do Android que substitui a exibição de cada caractere digitado por um caractere de mascaramento, geralmente um ponto (•) ou asterisco (*). Isso impede a leitura de senhas por cima do ombro (shoulder surfing) e oculta os dados digitados de olhares indiscretos. Esse recurso também é conhecido como mascaramento de senha e é uma prática padrão em aplicativos móveis.
Ao contrário do iOS, onde o Secure Text Entry é uma configuração separada do UITextField, no Android esse recurso é ativado através do atributo inputType com a variação PASSWORD. Quando um EditText recebe inputType="textPassword", ele aplica automaticamente o PasswordTransformationMethod — uma classe responsável pela substituição de caracteres. Ao digitar cada novo caractere, o EditText o substitui instantaneamente por um caractere de mascaramento através do mecanismo da interface TransformationMethod.
De acordo com Android Source Code (AOSP, 2026), a implementação do PasswordTransformationMethod usa a classe TextPaint para renderizar os caracteres de mascaramento. O tamanho do caractere de mascaramento corresponde ao tamanho da fonte do campo, evitando vazamento de informação através do comprimento da palavra — todos os caracteres têm a mesma largura. Isso é importante para proteção contra ataques baseados na análise do comprimento dos dados inseridos.
<!-- 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" />
O mecanismo de Secure Text Entry no Android é baseado na interface TransformationMethod, definida no pacote android.text.method. O PasswordTransformationMethod é uma implementação embutida que sobrescreve o método getTransformation(), retornando uma sequência de caracteres substituída para exibição. O texto original no Editable permanece inalterado — apenas sua representação visual é modificada.
Quando um usuário digita um caractere, o EditText chama dispatchEvent e passa o caractere para o InputConnection, que o adiciona ao Editable. Em seguida, o EditText chama o método getTransformation() do TransformationMethod atual, que recebe o CharSequence original e retorna um SpannableString com caracteres de mascaramento. Este SpannableString é renderizado na tela em vez do texto original. A principal característica é que a transformação em si não altera o conteúdo do Editable, então chamar getText().toString() retorna o texto real digitado.
De acordo com Android Developers Reference (2026), o PasswordTransformationMethod adiciona um MetricAffectingSpan a cada caractere, que substitui o glifo por um ponto. Esses spans não afetam o comprimento do texto, portanto o cursor e a posição de entrada são preservados corretamente mesmo com exibição oculta. Existe também o VisiblePasswordTransformationMethod, que exibe o último caractere digitado por um curto período (semelhante ao iOS).
// PasswordTransformationMethod - built-in masking
editText.transformationMethod = PasswordTransformationMethod.getInstance()
// VisiblePasswordTransformationMethod - shows last char
editText.transformationMethod = VisiblePasswordTransformationMethod.getInstance()
Alternância de visibilidade (password visibility toggle) é um recurso que permite ao usuário mostrar temporariamente a senha digitada para verificá-la antes de enviar o formulário. No Android, esse recurso é implementado através do TextInputLayout com o atributo app:endIconMode="password_toggle". Ao tocar no ícone de olho, o campo alterna entre textPassword e textVisiblePassword.
A implementação de password_toggle no TextInputLayout altera automaticamente o inputType do EditText interno e anima o ícone (olho aberto/fechado). É importante lembrar que durante essa alternância a posição do cursor pode ser redefinida, então o TextInputLayout salva e restaura a posição após a mudança de modo. Além disso, ao alternar para senha visível, a autocorreção e as sugestões não são ativadas — é usado TYPE_TEXT_VARIATION_VISIBLE_PASSWORD, não texto comum.
De acordo com Material Design Guidelines (2025), o ícone de mostrar senha deve estar sempre visível, não apenas quando o campo está em foco. O usuário deve ser capaz de verificar a senha a qualquer momento. O ícone não deve ocultar automaticamente a senha após um determinado tempo — apenas por ação do usuário.
<!-- 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>
A configuração programática do Secure Text Entry em Kotlin é feita definindo inputType ou através de setTransformationMethod(). Ambas as abordagens levam ao mesmo resultado, mas diferem em detalhes. Definir inputType também configura a autocorreção e as sugestões, enquanto setTransformationMethod afeta apenas a exibição de caracteres.
// 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?) {}
}
O Secure Text Entry fornece proteção em vários níveis. O mascaramento visual impede a leitura de senhas por cima do ombro (shoulder surfing) — o método mais comum de roubo de senhas em locais públicos. Desabilitar a autocorreção impede que a senha seja salva no dicionário do usuário, eliminando vazamentos através de entrada preditiva. A proteção contra capturas de tela (se FLAG_SECURE estiver ativado) impede que outros aplicativos capturem o conteúdo do campo.
No entanto, o Secure Text Entry não é uma proteção completa. Ataques através de interceptação de entrada (keylogging) em nível de sistema podem obter caracteres reais do InputConnection. Aplicativos maliciosos com serviços de acessibilidade podem ler o conteúdo do EditText mesmo que os caracteres estejam ocultos na tela. Além disso, a interceptação SSL durante a transmissão de dados para o servidor pode expor a senha se HTTPS com validação adequada de certificado não for usado.
De acordo com OWASP Mobile Security Testing Guide (2025), para máxima proteção de senhas no Android é recomendado: usar inputType="textPassword" + desativar autofill para campos críticos; não armazenar em cache a senha na memória por mais tempo que o necessário; limpar o campo de senha ao minimizar o aplicativo (onPause/onStop); usar mascaramento mesmo durante a exibição breve da senha.
| Nível de proteção | Secure Text Entry | Medidas adicionais |
|---|---|---|
| Interceptação visual | Mascaramento de caracteres | Autenticação biométrica, evitar shoulder surfing |
| Capturas de tela | Parcial (depende da implementação) | FLAG_SECURE na Window |
| Keylogging | Não protege | Usar IME com entrada segura |
| Autocorreção/dicionário | Desabilitada | desabilitada por padrão para password |
| Interceptação de rede | Não protege | HTTPS com certificate pinning |
Os desenvolvedores Android devem seguir várias práticas essenciais ao trabalhar com entrada oculta. Primeiro, sempre use TextInputLayout com endIconMode="password_toggle" para campos de senha — este é o padrão moderno do Material Design. Segundo, não desabilite a capacidade de mostrar a senha — o usuário deve poder verificar o que digitou, especialmente em dispositivos móveis com teclados pequenos.
O Secure Text Entry também requer configuração adequada de preenchimento automático. Para campos de senha, sempre especifique autofillHints="password" ou autofillHints="newPassword" para que gerenciadores de senhas possam preencher e salvar dados corretamente. Para o campo de confirmação de nova senha, use autofillHints="newPassword" para que o sistema não sugira preenchê-lo com a senha salva atual.
// 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()
}
}
Perguntas frequentes
textPassword oculta todos os caracteres digitados e desabilita a autocorreção. textVisiblePassword também desabilita a autocorreção, mas exibe os caracteres em texto claro. O textVisiblePassword é usado ao alternar a visibilidade da senha — não é texto comum, pois a autocorreção e as sugestões permanecem desabilitadas por segurança.
Sim, crie uma classe personalizada que implemente a interface TransformationMethod. Sobrescreva o método getTransformation() retornando um CharSequence com o caractere de substituição desejado. Defina-o através de editText.transformationMethod = CustomPasswordTransformation(). Lembre-se de que o caractere deve ser monoespaçado por segurança.
Em dispositivos móveis com telas pequenas e teclados touch, a probabilidade de erro ao digitar uma senha é significativamente maior do que no desktop. A capacidade de verificar a senha digitada reduz erros de entrada e diminui o número de solicitações de redefinição de senha, melhorando a experiência do usuário e reduzindo a carga de suporte.
Defina a flag FLAG_SECURE na janela da Activity ou Dialog: window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE). Isso impede capturas de tela e gravação de tela para toda a janela. No entanto, observe que isso também desabilitará capturas de tela para conteúdo normal, o que pode ser indesejável.
A partir do Android 8.0 (API 26), o Autofill Framework detecta automaticamente campos de senha pelo inputType. Para funcionamento correto, defina importantForAutofill="yes" e especifique autofillHints ("password", "newPassword", "emailAddress"). O Gboard e gerenciadores de senhas usam esses atributos para sugerir senhas salvas.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.
Leia também