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))
}
// پوشاندن سفارشی — فقط ۴ کاراکتر آخر را نشان میدهد
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" استفاده کنید تا سیستم پیشنهاد پر کردن آن با رمز عبور ذخیره شده فعلی را ندهد.
// فیلد کامل رمز عبور با تکمیل خودکار و پاکسازی
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() تنظیم کنید. به یاد داشته باشید که کاراکتر باید برای امنیت تکعرض (monospace) باشد.
در دستگاههای موبایل با صفحههای کوچک و صفحه کلید لمسی، احتمال خطا در وارد کردن رمز عبور به طور قابل توجهی بیشتر از دسکتاپ است. امکان بررسی رمز عبور وارد شده تعداد خطاهای ورود را کاهش میدهد و تعداد درخواستهای بازیابی رمز عبور را کاهش میدهد که تجربه کاربر را بهبود میبخشد و بار پشتیبانی را کاهش میدهد.
پرچم 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 از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید