Secure Text Entry — що це, захист введення та паролі в Android

Автор: IT Sectr Опубліковано: 2026-07-07 Час читання: 9 хв

Secure Text Entry — це режим введення тексту в Android, при якому введені символи відображаються в прихованому вигляді (крапками або зірочками) замість фактичних символів. Цей режим застосовується для полів введення паролів, PIN-кодів, CVV-кодів та іншої конфіденційної інформації. Secure Text Entry не тільки захищає дані від візуального перехоплення, але й запобігає витоку через знімки екрана, записи екрана та функції автовиправлення. За даними Android Security Best Practices (2026), приховане введення є обов'язковою вимогою для додатків, що обробляють аутентифікаційні дані користувачів.

Головне

  • Secure Text Entry — режим прихованого введення, що відображає крапки замість символів при введенні пароля.
  • Активація — через inputType="textPassword" в XML або TYPE_TEXT_VARIATION_PASSWORD в коді.
  • Захист — запобігає візуальному перехопленню, знімкам екрана та витоку через автовиправлення/словник.
  • TransformationMethod — механізм Android, що замінює відображення символів на приховані.
  • Перемикання видимості — можливість показати пароль через endIconMode="password_toggle" в TextInputLayout.

Що таке Secure Text Entry в Android

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 для відтворення маскуючих символів. Розмір маскуючого символу збігається з розміром шрифту поля, що запобігає витоку інформації через довжину слова — всі символи виглядають однаково по ширині. Це важливо для захисту від атак, заснованих на аналізі довжини введених даних.

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

Як працює Secure Text Entry

Механізм 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).

kotlin
// 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), іконка показу пароля повинна бути видима завжди, а не тільки коли поле у фокусі. Користувач повинен мати можливість перевірити пароль у будь-який момент. Іконка не повинна автоматично ховати пароль через певний час — тільки за дією користувача.

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>

Програмне налаштування Secure Text Entry

Програмне встановлення Secure Text Entry в Kotlin здійснюється через встановлення inputType або через setTransformationMethod(). Обидва підходи приводять до однакового результату, але відрізняються в деталях. Встановлення inputType додатково конфігурує автовиправлення та підказки, в той час як setTransformationMethod впливає тільки на відображення символів.

Приклад перемикання пароля через TextInputLayout

kotlin
// 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))
}

Кастомний TransformationMethod

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

Кращі практики Secure Text Entry

Розробникам Android слід дотримуватися кількох ключових практик при роботі з прихованим введенням. По-перше, завжди використовуй TextInputLayout з endIconMode="password_toggle" для полів пароля — це сучасний стандарт Material Design. По-друге, не вимикай можливість показати пароль — користувач повинен мати можливість перевірити, що він ввів, особливо на мобільних пристроях з маленькою клавіатурою.

Secure Text Entry також вимагає правильного налаштування автозаповнення. Для полів пароля обов'язково вкажи autofillHints="password" або autofillHints="newPassword", щоб менеджери паролів могли коректно заповнювати та зберігати дані. Для поля підтвердження нового пароля використовуй autofillHints="newPassword", щоб система не пропонувала заповнити його поточним збереженим паролем.

  • TextInputLayout — використовуй Material Design TextInputLayout з endIconMode для перемикання видимості.
  • Autofill — додавай autofillHints="password" та importantForAutofill="yes" для підтримки менеджерів.
  • Очищення — очищай поле пароля при згортанні додатка (onPause/onStop).
  • Довжина — не обмежуй довжину пароля занадто строго (мінімум 8 символів, без жорсткого максимуму).
  • Біометрія — пропонуй вхід за біометрією (BiometricPrompt) як альтернативу ручному введенню пароля.
kotlin
// 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?

textPassword приховує всі введені символи та вимикає автовиправлення. textVisiblePassword теж вимикає автовиправлення, але показує символи у відкритому вигляді. textVisiblePassword використовується при перемиканні видимості пароля — це не звичайний текст, оскільки автовиправлення та підказки залишаються вимкненими для безпеки.

Чи можна зробити кастомний символ для маскування пароля?

Так, створи кастомний клас, що реалізує інтерфейс TransformationMethod. Перевизнач метод getTransformation(), що повертає CharSequence з потрібним символом-замінником. Встанови його через editText.transformationMethod = CustomPasswordTransformation(). Пам'ятай, що символ повинен бути моноширинним для безпеки.

Чому не рекомендується вимикати можливість показати пароль?

На мобільних пристроях з маленькими екранами та сенсорною клавіатурою ймовірність помилки при введенні пароля значно вища, ніж на десктопі. Можливість перевірити введений пароль знижує кількість помилок введення та зменшує число запитів на відновлення пароля, що покращує користувацький досвід та знижує навантаження на підтримку.

Як захистити пароль від знімків екрана додатка?

Встанови прапорець FLAG_SECURE на вікно Activity або Dialog: window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE). Це запобіжить створенню знімків екрана та запису екрана для всього вікна. Однак врахуй, що це вимкне також знімки екрана для звичайного вмісту, що може бути небажаним.

Як працює autofill для password-полів?

Починаючи з Android 8.0 (API 26), Autofill Framework автоматично визначає password-поля за inputType. Для коректної роботи встанови importantForAutofill="yes" та вкажи autofillHints ("password", "newPassword", "emailAddress"). Gboard та менеджери паролів використовують ці атрибути для пропозиції збережених паролів.

Підсумки

  • Secure Text Entry — режим прихованого введення, що замінює символи на маскуючі (крапки) через PasswordTransformationMethod.
  • Активація — через inputType="textPassword" або програмне встановлення TYPE_TEXT_VARIATION_PASSWORD.
  • PasswordTransformationMethod — вбудований клас Android, що замінює відображення символів без зміни Editable.
  • Перемикання видимості — реалізується через TextInputLayout з endIconMode="password_toggle" та TYPE_TEXT_VARIATION_VISIBLE_PASSWORD.
  • Захист — запобігає shoulder surfing, знімкам екрана (з FLAG_SECURE), автовиправленню та запису в словник.
  • Autofill — для підтримки менеджерів паролів додавай importantForAutofill та autofillHints="password".
  • Кращі практики — використовуй TextInputLayout, очищай поле при згортанні, не обмежуй довжину пароля жорстко.

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також