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 που αντικαθιστά το γλύφο με τελεία. Αυτά τα span δεν επηρεάζουν το μήκος του κειμένου, έτσι ο δρομέας και η θέση εισαγωγής διατηρούνται σωστά ακόμα και κατά την κρυφή εμφάνιση. Υπάρχει επίσης το VisiblePasswordTransformationMethod, το οποίο εμφανίζει τον τελευταίο εισαγόμενο χαρακτήρα για σύντομο χρονικό διάστημα (παρόμοια με το iOS).

kotlin
// PasswordTransformationMethod - ενσωματωμένη απόκρυψη
editText.transformationMethod = PasswordTransformationMethod.getInstance()

// VisiblePasswordTransformationMethod - εμφανίζει τον τελευταίο χαρακτήρα
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, όχι απλό text.

Σύμφωνα με το 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
// Προγραμματιστική εναλλαγή ορατότητας κωδικού πρόσβασης
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
    }

    // Επαναφορά θέσης δρομέα
    val cursorPos = editText.selectionStart
    editText.setSelection(maxOf(0, cursorPos))
}

Προσαρμοσμένο TransformationMethod

kotlin
// Προσαρμοσμένη απόκρυψη — εμφανίζει μόνο τους τελευταίους 4 χαρακτήρες
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. Οι κακόβουλες εφαρμογές με υπηρεσία προσβασιμότητας μπορούν να διαβάσουν το περιεχόμενο του EditText, ακόμα κι αν οι χαρακτήρες είναι κρυφοί στην οθόνη. Επίσης, το SSL-sniffing κατά τη μετάδοση δεδομένων στον διακομιστή μπορεί να αποκαλύψει τον κωδικό πρόσβασης εάν δεν χρησιμοποιείται HTTPS με σωστή επικύρωση πιστοποιητικού.

Σύμφωνα με το OWASP Mobile Security Testing Guide (2025), για μέγιστη προστασία κωδικών πρόσβασης στο Android συνιστάται: χρήση inputType="textPassword" + απενεργοποίηση autofill για κρίσιμα πεδία; μην αποθηκεύετε τον κωδικό πρόσβασης στη μνήμη περισσότερο από όσο χρειάζεται; καθαρίστε το πεδίο κωδικού πρόσβασης κατά την ελαχιστοποίηση της εφαρμογής (onPause/onStop); χρησιμοποιήστε απόκρυψη ακόμα και κατά τη σύντομη εμφάνιση του κωδικού πρόσβασης.

Επίπεδο προστασίαςSecure Text EntryΠρόσθετα μέτρα
Οπτική υποκλοπήΑπόκρυψη χαρακτήρωνBiometric auth, αποφύγετε το 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
// Πλήρες πεδίο κωδικού πρόσβασης με autofill και καθαρισμό
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 χρησιμοποιείται κατά την εναλλαγή ορατότητας του κωδικού πρόσβασης — δεν είναι απλό text, επειδή η αυτόματη διόρθωση και οι προτάσεις παραμένουν απενεργοποιημένες για ασφάλεια.

Μπορώ να φτιάξω ένα προσαρμοσμένο σύμβολο για απόκρυψη κωδικού πρόσβασης;

Ναι, δημιουργήστε μια προσαρμοσμένη κλάση που υλοποιεί τη διεπαφή 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. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης