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
// پوشاندن سفارشی — فقط ۴ کاراکتر آخر را نشان می‌دهد
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) فیلد رمز عبور را پاک کنید.
  • طول — طول رمز عبور را خیلی سخت محدود نکنید (حداقل ۸ کاراکتر، بدون حداکثر سخت).
  • بیومتریک — ورود بیومتریک (BiometricPrompt) را به عنوان جایگزینی برای ورود دستی رمز عبور ارائه دهید.
kotlin
// فیلد کامل رمز عبور با تکمیل خودکار و پاکسازی
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() تنظیم کنید. به یاد داشته باشید که کاراکتر باید برای امنیت تک‌عرض (monospace) باشد.

چرا غیرفعال کردن امکان نمایش رمز عبور توصیه نمی‌شود؟

در دستگاه‌های موبایل با صفحه‌های کوچک و صفحه کلید لمسی، احتمال خطا در وارد کردن رمز عبور به طور قابل توجهی بیشتر از دسکتاپ است. امکان بررسی رمز عبور وارد شده تعداد خطاهای ورود را کاهش می‌دهد و تعداد درخواست‌های بازیابی رمز عبور را کاهش می‌دهد که تجربه کاربر را بهبود می‌بخشد و بار پشتیبانی را کاهش می‌دهد.

چگونه از رمز عبور در برابر اسکرین‌شات‌های برنامه محافظت کنیم؟

پرچم 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 از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید