Secure Text Entry — це режим введення тексту в Android, при якому введені символи відображаються в прихованому вигляді (крапками або зірочками) замість фактичних символів. Цей режим застосовується для полів введення паролів, PIN-кодів, CVV-кодів та іншої конфіденційної інформації. Secure Text Entry не тільки захищає дані від візуального перехоплення, але й запобігає витоку через знімки екрана, записи екрана та функції автовиправлення. За даними Android Security Best Practices (2026), приховане введення є обов'язковою вимогою для додатків, що обробляють аутентифікаційні дані користувачів.
Головне
Secure Text Entry (захищене введення тексту) — це функція Android, яка замінює відображення кожного введеного символу на маскуючий символ, зазвичай крапку (•) або зірочку (*). Це запобігає читанню пароля через плече (shoulder surfing) та приховує введені дані від сторонніх очей. Функція також відома як маскування пароля і є стандартною практикою в мобільних додатках.
На відміну від iOS, де Secure Text Entry є окремим налаштуванням UITextField, в Android ця функція активується через атрибут inputType з варіацією PASSWORD. Коли EditText отримує inputType="textPassword", він автоматично застосовує PasswordTransformationMethod — клас, який відповідає за заміну символів. При введенні кожного нового символу EditText миттєво замінює його на маскуючий символ через механізм інтерфейсу TransformationMethod.
За даними Android Source Code (AOSP, 2026), реалізація PasswordTransformationMethod використовує клас TextPaint для відтворення маскуючих символів. Розмір маскуючого символу збігається з розміром шрифту поля, що запобігає витоку інформації через довжину слова — всі символи виглядають однаково по ширині. Це важливо для захисту від атак, заснованих на аналізі довжини введених даних.
<!-- 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" />
Механізм Secure Text Entry в Android заснований на інтерфейсі TransformationMethod, визначеному в пакеті android.text.method. PasswordTransformationMethod — це вбудована реалізація, яка перевизначає метод getTransformation(), повертаючи замінену послідовність символів для відображення. При цьому оригінальний текст в Editable залишається незмінним — змінюється тільки його візуальне представлення.
Коли користувач вводить символ, EditText викликає dispatchEvent і передає символ в InputConnection, який додає його в Editable. Потім EditText викликає метод getTransformation() поточного TransformationMethod, який отримує оригінальний CharSequence і повертає SpannableString з маскуючими символами. Цей SpannableString відображається на екрані замість оригінального тексту. Ключова особливість — саме перетворення не змінює вміст Editable, тому при виклику getText().toString() повертається реальний введений текст.
За даними Android Developers Reference (2026), PasswordTransformationMethod додає до кожного символу MetricAffectingSpan, який замінює гліф на крапку. Ці спани не впливають на довжину тексту, тому курсор і позиція введення зберігаються коректно навіть при прихованому відображенні. Існує також VisiblePasswordTransformationMethod, який відображає останній введений символ на короткий час (аналогічно iOS).
// PasswordTransformationMethod - built-in masking
editText.transformationMethod = PasswordTransformationMethod.getInstance()
// VisiblePasswordTransformationMethod - shows last char
editText.transformationMethod = VisiblePasswordTransformationMethod.getInstance()
Перемикання видимості (password visibility toggle) — це функція, яка дозволяє користувачеві тимчасово показати введений пароль, щоб перевірити його перед відправкою форми. В Android ця функція реалізується через TextInputLayout з атрибутом app:endIconMode="password_toggle". При натисканні на іконку ока поле перемикається між textPassword та textVisiblePassword.
Реалізація password_toggle в TextInputLayout автоматично змінює inputType внутрішнього EditText та анімує іконку (око відкрите/закрите). Важливо пам'ятати, що при такому перемиканні позиція курсора може скидатися, тому TextInputLayout зберігає та відновлює позицію після зміни режиму. Також при перемиканні на видимий пароль автовиправлення та підказки не вмикаються — використовується TYPE_TEXT_VARIATION_VISIBLE_PASSWORD, а не звичайний текст.
За даними Material Design Guidelines (2025), іконка показу пароля повинна бути видима завжди, а не тільки коли поле у фокусі. Користувач повинен мати можливість перевірити пароль у будь-який момент. Іконка не повинна автоматично ховати пароль через певний час — тільки за дією користувача.
<!-- 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>
Програмне встановлення Secure Text Entry в Kotlin здійснюється через встановлення inputType або через setTransformationMethod(). Обидва підходи приводять до однакового результату, але відрізняються в деталях. Встановлення inputType додатково конфігурує автовиправлення та підказки, в той час як setTransformationMethod впливає тільки на відображення символів.
// 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?) {}
}
Secure Text Entry забезпечує захист на кількох рівнях. Візуальне маскування запобігає читанню пароля через плече (shoulder surfing) — найпоширеніший метод крадіжки паролів у публічних місцях. Вимкнення автовиправлення запобігає збереженню пароля в словнику користувача, що виключає його витік через предиктивне введення. Захист від знімків екрана (якщо включено FLAG_SECURE) не дає іншим додаткам захопити вміст поля.
Однак Secure Text Entry не є повним захистом. Атаки через перехоплення введення (keylogging) на рівні системи можуть отримати реальні символи з InputConnection. Шкідливі додатки з accessibility-сервісом можуть читати вміст EditText, навіть якщо символи приховані на екрані. Також SSL-сніфінг при передачі даних на сервер може розкрити пароль, якщо не використовується HTTPS з правильною валідацією сертифіката.
За даними OWASP Mobile Security Testing Guide (2025), для максимального захисту паролів в Android рекомендується: використовувати inputType="textPassword" + вимкнути autofill для критичних полів; не кешувати пароль у пам'яті довше необхідного; очищати поле пароля при згортанні додатка (onPause/onStop); використовувати маскування навіть при короткочасному показі пароля.
| Рівень захисту | Secure Text Entry | Додаткові заходи |
|---|---|---|
| Візуальне перехоплення | Маскування символів | Біометрична аутентифікація, уникнення shoulder surfing |
| Знімки екрана | Частковий (залежить від реалізації) | FLAG_SECURE на Window |
| Keylogging | Не захищає | Використовувати IME з безпечним введенням |
| Автовиправлення/словник | Вимкнено | вимкнено за замовчуванням для password |
| Перехоплення мережі | Не захищає | HTTPS з certificate pinning |
Розробникам Android слід дотримуватися кількох ключових практик при роботі з прихованим введенням. По-перше, завжди використовуй TextInputLayout з endIconMode="password_toggle" для полів пароля — це сучасний стандарт Material Design. По-друге, не вимикай можливість показати пароль — користувач повинен мати можливість перевірити, що він ввів, особливо на мобільних пристроях з маленькою клавіатурою.
Secure Text Entry також вимагає правильного налаштування автозаповнення. Для полів пароля обов'язково вкажи autofillHints="password" або autofillHints="newPassword", щоб менеджери паролів могли коректно заповнювати та зберігати дані. Для поля підтвердження нового пароля використовуй autofillHints="newPassword", щоб система не пропонувала заповнити його поточним збереженим паролем.
// 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()
}
}
Часті запитання
textPassword приховує всі введені символи та вимикає автовиправлення. textVisiblePassword теж вимикає автовиправлення, але показує символи у відкритому вигляді. textVisiblePassword використовується при перемиканні видимості пароля — це не звичайний текст, оскільки автовиправлення та підказки залишаються вимкненими для безпеки.
Так, створи кастомний клас, що реалізує інтерфейс TransformationMethod. Перевизнач метод getTransformation(), що повертає CharSequence з потрібним символом-замінником. Встанови його через editText.transformationMethod = CustomPasswordTransformation(). Пам'ятай, що символ повинен бути моноширинним для безпеки.
На мобільних пристроях з маленькими екранами та сенсорною клавіатурою ймовірність помилки при введенні пароля значно вища, ніж на десктопі. Можливість перевірити введений пароль знижує кількість помилок введення та зменшує число запитів на відновлення пароля, що покращує користувацький досвід та знижує навантаження на підтримку.
Встанови прапорець FLAG_SECURE на вікно Activity або Dialog: window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE). Це запобіжить створенню знімків екрана та запису екрана для всього вікна. Однак врахуй, що це вимкне також знімки екрана для звичайного вмісту, що може бути небажаним.
Починаючи з Android 8.0 (API 26), Autofill Framework автоматично визначає password-поля за inputType. Для коректної роботи встанови importantForAutofill="yes" та вкажи autofillHints ("password", "newPassword", "emailAddress"). Gboard та менеджери паролів використовують ці атрибути для пропозиції збережених паролів.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.