Secure Text Entry, Android'de girilen karakterlerin gerçek karakterler yerine gizli biçimde (noktalar veya yıldızlar) görüntülendiği bir metin giriş modudur. Bu mod, şifre alanları, PIN kodları, CVV kodları ve diğer gizli bilgiler için kullanılır. Secure Text Entry, verileri yalnızca görsel müdahaleden korumakla kalmaz, aynı zamanda ekran görüntüleri, ekran kayıtları ve otomatik düzeltme işlevleri yoluyla sızıntıyı da önler. Android Security Best Practices (2026)'ya göre, gizli giriş, kullanıcı kimlik doğrulama verilerini işleyen uygulamalar için zorunlu bir gerekliliktir.
Önemli Noktalar
Secure Text Entry (korunan metin girişi), girilen her karakterin görüntülenmesini genellikle bir nokta (•) veya yıldız (*) gibi bir maskeleme karakteriyle değiştiren bir Android özelliğidir. Bu, omuz üzerinden şifre okumayı (shoulder surfing) önler ve girilen verileri meraklı gözlerden gizler. Bu özellik aynı zamanda şifre maskeleme olarak da bilinir ve mobil uygulamalarda standart bir uygulamadır.
iOS'ta Secure Text Entry'nin ayrı bir UITextField ayarı olmasının aksine, Android'de bu özellik PASSWORD varyasyonuyla inputType niteliği aracılığıyla etkinleştirilir. Bir EditText inputType="textPassword" aldığında, otomatik olarak PasswordTransformationMethod'u uygular — karakter değiştirmeden sorumlu bir sınıf. Her yeni karakter girildiğinde, EditText onu TransformationMethod arayüz mekanizması aracılığıyla anında bir maskeleme karakteriyle değiştirir.
Android Source Code (AOSP, 2026)'ya göre, PasswordTransformationMethod'un uygulanması, maskeleme karakterlerini işlemek için TextPaint sınıfını kullanır. Maskeleme karakterinin boyutu alanın yazı tipi boyutuyla eşleşir, bu da kelime uzunluğu aracılığıyla bilgi sızıntısını önler — tüm karakterler genişlikte aynı görünür. Bu, girilen verilerin uzunluğunun analizine dayalı saldırılara karşı koruma için önemlidir.
<!-- 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" />
Android'deki Secure Text Entry mekanizması, android.text.method paketinde tanımlanan TransformationMethod arayüzüne dayanır. PasswordTransformationMethod, getTransformation() yöntemini geçersiz kılan ve görüntüleme için değiştirilmiş bir karakter dizisi döndüren yerleşik bir uygulamadır. Editable'daki orijinal metin değişmeden kalır — yalnızca görsel temsili değiştirilir.
Bir kullanıcı karakter girdiğinde, EditText dispatchEvent'i çağırır ve karakteri InputConnection'a iletir, bu da onu Editable'a ekler. Ardından EditText, geçerli TransformationMethod'un getTransformation() yöntemini çağırır, bu da orijinal CharSequence'ı alır ve maskeleme karakterleriyle bir SpannableString döndürür. Bu SpannableString, orijinal metin yerine ekranda işlenir. Temel özellik, dönüşümün kendisinin Editable içeriğini değiştirmemesidir, bu nedenle getText().toString() çağrısı gerçek girilen metni döndürür.
Android Developers Reference (2026)'ya göre, PasswordTransformationMethod her karaktere bir MetricAffectingSpan ekler ve glifi bir noktayla değiştirir. Bu span'lar metin uzunluğunu etkilemez, bu nedenle gizli görüntülemede bile imleç ve giriş konumu doğru şekilde korunur. Ayrıca, son girilen karakteri kısa bir süre gösteren VisiblePasswordTransformationMethod da bulunur (iOS'a benzer).
// PasswordTransformationMethod - built-in masking
editText.transformationMethod = PasswordTransformationMethod.getInstance()
// VisiblePasswordTransformationMethod - shows last char
editText.transformationMethod = VisiblePasswordTransformationMethod.getInstance()
Görünürlük değiştirme (password visibility toggle), kullanıcının formu göndermeden önce girilen şifreyi geçici olarak gösterip kontrol etmesini sağlayan bir özelliktir. Android'de bu özellik, app:endIconMode="password_toggle" niteliğine sahip TextInputLayout aracılığıyla uygulanır. Göz simgesine dokunulduğunda, alan textPassword ve textVisiblePassword arasında geçiş yapar.
TextInputLayout'taki password_toggle uygulaması, dahili EditText'in inputType'ını otomatik olarak değiştirir ve simgeyi canlandırır (göz açık/kapalı). Bu geçiş sırasında imleç konumunun sıfırlanabileceğini unutmamak önemlidir, bu nedenle TextInputLayout mod değişikliğinden sonra konumu kaydeder ve geri yükler. Ayrıca, görünür şifreye geçerken otomatik düzeltme ve öneriler etkinleştirilmez — normal metin değil, TYPE_TEXT_VARIATION_VISIBLE_PASSWORD kullanılır.
Material Design Guidelines (2025)'e göre, şifre gösterme simgesi yalnızca alan odaklandığında değil, her zaman görünür olmalıdır. Kullanıcı herhangi bir anda şifreyi kontrol edebilmelidir. Simge, belirli bir süre sonra şifreyi otomatik olarak gizlememelidir — yalnızca kullanıcı eylemiyle.
<!-- 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>
Kotlin'de Secure Text Entry'nin programlı ayarı, inputType ayarlanarak veya setTransformationMethod() aracılığıyla yapılır. Her iki yaklaşım da aynı sonuca götürür ancak ayrıntılarda farklılık gösterir. inputType ayarlamak ayrıca otomatik düzeltme ve önerileri de yapılandırırken, setTransformationMethod yalnızca karakter görüntülemeyi etkiler.
// 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 birden çok düzeyde koruma sağlar. Görsel maskeleme, omuz üzerinden şifre okumayı (shoulder surfing) önler — halka açık yerlerde şifre hırsızlığının en yaygın yöntemi. Otomatik düzeltmeyi devre dışı bırakmak, şifrenin kullanıcının sözlüğünde kaydedilmesini önleyerek tahmine dayalı giriş yoluyla sızıntıyı ortadan kaldırır. Ekran görüntülerine karşı koruma (FLAG_SECURE etkinse) diğer uygulamaların alan içeriğini yakalamasını engeller.
Ancak Secure Text Entry tam bir koruma değildir. Sistem düzeyinde giriş müdahalesi (keylogging) saldırıları, InputConnection'dan gerçek karakterleri alabilir. Erişilebilirlik hizmetine sahip kötü amaçlı uygulamalar, karakterler ekranda gizli olsa bile EditText içeriğini okuyabilir. Ayrıca, sunucuya veri iletimi sırasında SSL dinlemesi, uygun sertifika doğrulamasıyla HTTPS kullanılmazsa şifreyi ifşa edebilir.
OWASP Mobile Security Testing Guide (2025)'e göre, Android'de maksimum şifre koruması için önerilir: kritik alanlar için inputType="textPassword" + autofill'i devre dışı bırakın; şifreyi gerekenden daha uzun süre bellekte önbelleğe almayın; uygulama simge durumuna küçültüldüğünde şifre alanını temizleyin (onPause/onStop); şifrenin kısa süreli gösterimi sırasında bile maskeleme kullanın.
| Koruma düzeyi | Secure Text Entry | Ek önlemler |
|---|---|---|
| Görsel müdahale | Karakter maskeleme | Biyometrik kimlik doğrulama, shoulder surfing'den kaçınma |
| Ekran görüntüleri | Kısmi (uygulamaya bağlı) | Window'da FLAG_SECURE |
| Keylogging | Korumaz | Güvenli girişli IME kullanın |
| Otomatik düzeltme/sözlük | Devre dışı | şifre için varsayılan olarak devre dışı |
| Ağ müdahalesi | Korumaz | Sertifika sabitlemeli HTTPS |
Android geliştiricileri, gizli girişle çalışırken birkaç temel uygulamayı izlemelidir. Birincisi, şifre alanları için her zaman endIconMode="password_toggle" ile TextInputLayout kullanın — bu modern Material Design standardıdır. İkincisi, şifreyi gösterme yeteneğini devre dışı bırakmayın — kullanıcı, özellikle küçük klavyeli mobil cihazlarda ne girdiğini doğrulayabilmelidir.
Secure Text Entry ayrıca uygun otomatik doldurma yapılandırması gerektirir. Şifre alanları için, şifre yöneticilerinin verileri doğru şekilde doldurup kaydedebilmesi için her zaman autofillHints="password" veya autofillHints="newPassword" belirtin. Yeni şifre onay alanı için autofillHints="newPassword" kullanın, böylece sistem onu mevcut kayıtlı şifreyle doldurmayı önermez.
// 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()
}
}
Sıkça Sorulan Sorular
textPassword girilen tüm karakterleri gizler ve otomatik düzeltmeyi devre dışı bırakır. textVisiblePassword da otomatik düzeltmeyi devre dışı bırakır ancak karakterleri açıkça gösterir. textVisiblePassword, şifre görünürlüğü değiştirilirken kullanılır — güvenlik için otomatik düzeltme ve öneriler devre dışı kaldığından normal metin değildir.
Evet, TransformationMethod arayüzünü uygulayan özel bir sınıf oluşturun. İstenen değiştirme karakteriyle bir CharSequence döndüren getTransformation() yöntemini geçersiz kılın. editText.transformationMethod = CustomPasswordTransformation() ile ayarlayın. Güvenlik için karakterin sabit genişlikli olması gerektiğini unutmayın.
Küçük ekranlı ve dokunmatik klavyeli mobil cihazlarda, şifre girerken hata olasılığı masaüstüne göre önemli ölçüde daha yüksektir. Girilen şifreyi kontrol etme yeteneği, giriş hatalarını azaltır ve şifre sıfırlama taleplerinin sayısını düşürerek kullanıcı deneyimini iyileştirir ve destek yükünü azaltır.
Activity veya Dialog penceresinde FLAG_SECURE bayrağını ayarlayın: window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE). Bu, tüm pencere için ekran görüntülerini ve ekran kaydını önler. Ancak, bunun normal içerik için de ekran görüntülerini devre dışı bırakacağını unutmayın, bu istenmeyebilir.
Android 8.0 (API 26) ile başlayarak, Autofill Framework şifre alanlarını inputType ile otomatik olarak algılar. Doğru çalışma için importantForAutofill="yes" ayarlayın ve autofillHints ("password", "newPassword", "emailAddress") belirtin. Gboard ve şifre yöneticileri, kayıtlı şifreleri önermek için bu nitelikleri kullanır.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun