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 που αντικαθιστά το γλύφο με τελεία. Αυτά τα span δεν επηρεάζουν το μήκος του κειμένου, έτσι ο δρομέας και η θέση εισαγωγής διατηρούνται σωστά ακόμα και κατά την κρυφή εμφάνιση. Υπάρχει επίσης το VisiblePasswordTransformationMethod, το οποίο εμφανίζει τον τελευταίο εισαγόμενο χαρακτήρα για σύντομο χρονικό διάστημα (παρόμοια με το iOS).
// 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), το εικονίδιο εμφάνισης κωδικού πρόσβασης πρέπει να είναι πάντα ορατό, όχι μόνο όταν το πεδίο είναι σε εστίαση. Ο χρήστης πρέπει να έχει τη δυνατότητα να ελέγχει τον κωδικό πρόσβασης ανά πάσα στιγμή. Το εικονίδιο δεν πρέπει να κρύβει αυτόματα τον κωδικό πρόσβασης μετά από ορισμένο χρόνο — μόνο με ενέργεια του χρήστη.
<!-- 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 επηρεάζει μόνο την εμφάνιση χαρακτήρων.
// Προγραμματιστική εναλλαγή ορατότητας κωδικού πρόσβασης
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))
}
// Προσαρμοσμένη απόκρυψη — εμφανίζει μόνο τους τελευταίους 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 |
Οι προγραμματιστές Android θα πρέπει να ακολουθούν αρκετές βασικές πρακτικές κατά την εργασία με κρυφή εισαγωγή. Πρώτον, χρησιμοποιείτε πάντα TextInputLayout με endIconMode="password_toggle" για πεδία κωδικού πρόσβασης — αυτό είναι το σύγχρονο πρότυπο Material Design. Δεύτερον, μην απενεργοποιείτε τη δυνατότητα εμφάνισης του κωδικού πρόσβασης — ο χρήστης πρέπει να μπορεί να ελέγξει τι έχει εισάγει, ειδικά σε φορητές συσκευές με μικρό πληκτρολόγιο.
Το Secure Text Entry απαιτεί επίσης σωστή ρύθμιση της αυτόματης συμπλήρωσης. Για πεδία κωδικού πρόσβασης, ορίστε οπωσδήποτε autofillHints="password" ή autofillHints="newPassword" ώστε οι διαχειριστές κωδικών πρόσβασης να μπορούν να συμπληρώνουν και να αποθηκεύουν σωστά τα δεδομένα. Για το πεδίο επιβεβαίωσης νέου κωδικού πρόσβασης, χρησιμοποιήστε autofillHints="newPassword" ώστε το σύστημα να μην προτείνει τη συμπλήρωσή του με τον τρέχοντα αποθηκευμένο κωδικό πρόσβασης.
// Πλήρες πεδίο κωδικού πρόσβασης με 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 επίσης απενεργοποιεί την αυτόματη διόρθωση, αλλά εμφανίζει τους χαρακτήρες σε ανοιχτή μορφή. Το textVisiblePassword χρησιμοποιείται κατά την εναλλαγή ορατότητας του κωδικού πρόσβασης — δεν είναι απλό text, επειδή η αυτόματη διόρθωση και οι προτάσεις παραμένουν απενεργοποιημένες για ασφάλεια.
Ναι, δημιουργήστε μια προσαρμοσμένη κλάση που υλοποιεί τη διεπαφή 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. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης