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-এ এই বৈশিষ্ট্যটি PASSWORD ভ্যারিয়েশন সহ inputType অ্যাট্রিবিউটের মাধ্যমে সক্রিয় হয়। যখন একটি 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" />
Android-এ Secure Text Entry প্রক্রিয়াটি android.text.method প্যাকেজে সংজ্ঞায়িত TransformationMethod ইন্টারফেসের উপর ভিত্তি করে। PasswordTransformationMethod হল একটি বিল্ট-ইন বাস্তবায়ন যা getTransformation() মেথডকে ওভাররাইড করে, প্রদর্শনের জন্য একটি প্রতিস্থাপিত ক্যারেক্টার সিকোয়েন্স ফেরত দেয়। Editable-এ মূল টেক্সট অপরিবর্তিত থাকে — শুধুমাত্র এর ভিজুয়াল উপস্থাপনা পরিবর্তিত হয়।
যখন একজন ব্যবহারকারী একটি ক্যারেক্টার প্রবেশ করান, EditText dispatchEvent কল করে এবং ক্যারেক্টারটি InputConnection-এ পাঠায়, যা এটি Editable-এ যোগ করে। তারপর EditText বর্তমান TransformationMethod-এর getTransformation() মেথড কল করে, যা মূল CharSequence নেয় এবং মাস্কিং ক্যারেক্টার সহ একটি SpannableString ফেরত দেয়। এই SpannableString মূল টেক্সটের পরিবর্তে স্ক্রিনে রেন্ডার হয়। মূল বৈশিষ্ট্য হল যে রূপান্তর নিজে Editable বিষয়বস্তু পরিবর্তন করে না, তাই getText().toString() কল করলে প্রকৃত প্রবেশ করানো টেক্সট ফেরত আসে।
Android Developers Reference (2026) অনুযায়ী, PasswordTransformationMethod প্রতিটি ক্যারেক্টারে একটি MetricAffectingSpan যোগ করে, যা গ্লিফকে একটি বিন্দু দিয়ে প্রতিস্থাপন করে। এই স্প্যানগুলি টেক্সটের দৈর্ঘ্যকে প্রভাবিত করে না, তাই লুকানো প্রদর্শনের সাথেও কার্সার এবং ইনপুট অবস্থান সঠিকভাবে সংরক্ষিত থাকে। VisiblePasswordTransformationMethod-ও বিদ্যমান, যা শেষ প্রবেশ করানো ক্যারেক্টারটি অল্প সময়ের জন্য দেখায় (iOS-এর অনুরূপ)।
// PasswordTransformationMethod - built-in masking
editText.transformationMethod = PasswordTransformationMethod.getInstance()
// VisiblePasswordTransformationMethod - shows last char
editText.transformationMethod = VisiblePasswordTransformationMethod.getInstance()
দৃশ্যমানা টগল (password visibility toggle) হল একটি বৈশিষ্ট্য যা ব্যবহারকারীকে ফর্ম জমা দেওয়ার আগে যাচাই করার জন্য অস্থায়ীভাবে প্রবেশ করানো পাসওয়ার্ড দেখাতে দেয়। Android-এ, এই বৈশিষ্ট্যটি app:endIconMode="password_toggle" অ্যাট্রিবিউট সহ TextInputLayout-এর মাধ্যমে বাস্তবায়িত হয়। চোখের আইকনে ট্যাপ করলে, ফিল্ডটি textPassword এবং textVisiblePassword-এর মধ্যে সুইচ হয়।
TextInputLayout-এ password_toggle-এর বাস্তবায়ন স্বয়ংক্রিয়ভাবে অভ্যন্তরীণ EditText-এর inputType পরিবর্তন করে এবং আইকনটি অ্যানিমেট করে (চোখ খোলা/বন্ধ)। এটি মনে রাখা গুরুত্বপূর্ণ যে এই ধরনের সুইচিংয়ের সময় কার্সার অবস্থান রিসেট হতে পারে, তাই TextInputLayout মোড পরিবর্তনের পরে অবস্থান সংরক্ষণ এবং পুনরুদ্ধার করে। এছাড়াও, দৃশ্যমান পাসওয়ার্ডে সুইচ করার সময়, অটোকারেক্ট এবং পরামর্শ সক্রিয় হয় না — TYPE_TEXT_VARIATION_VISIBLE_PASSWORD ব্যবহার করা হয়, সাধারণ টেক্সট নয়।
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>
Kotlin-এ Secure Text Entry-এর প্রোগ্রামেটিক সেটিং inputType সেট করে বা setTransformationMethod()-এর মাধ্যমে করা হয়। উভয় পদ্ধতিই একই ফলাফলের দিকে নিয়ে যায় কিন্তু বিবরণে ভিন্ন। inputType সেট করা অতিরিক্তভাবে অটোকারেক্ট এবং পরামর্শ কনফিগার করে, যখন setTransformationMethod শুধুমাত্র ক্যারেক্টার প্রদর্শনকে প্রভাবিত করে।
// 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 বিভিন্ন স্তরে সুরক্ষা প্রদান করে। ভিজুয়াল মাস্কিং কাঁধের উপর উঁকি দিয়ে (shoulder surfing) পাসওয়ার্ড পড়া প্রতিরোধ করে — পাবলিক জায়গায় পাসওয়ার্ড চুরির সবচেয়ে সাধারণ পদ্ধতি। অটোকারেক্ট অক্ষম করা পাসওয়ার্ড ব্যবহারকারীর অভিধানে সংরক্ষিত হওয়া প্রতিরোধ করে, যা পূর্বাভাসমূলক ইনপুটের মাধ্যমে লিকেজ দূর করে। স্ক্রিনশট থেকে সুরক্ষা (যদি FLAG_SECURE সক্ষম থাকে) অন্যান্য অ্যাপ্লিকেশনকে ফিল্ডের বিষয়বস্তু ক্যাপচার করতে বাধা দেয়।
তবে, Secure Text Entry সম্পূর্ণ সুরক্ষা নয়। সিস্টেম স্তরে ইনপুট ইন্টারসেপশন (কিলগিং) আক্রমণ InputConnection থেকে প্রকৃত ক্যারেক্টার পেতে পারে। অ্যাক্সেসিবিলিটি সার্ভিস সহ দূষিত অ্যাপ্লিকেশন EditText বিষয়বস্তু পড়তে পারে, এমনকি যদি ক্যারেক্টার স্ক্রিনে লুকানো থাকে। এছাড়াও, সার্ভারে ডেটা প্রেরণের সময় SSL স্নিফিং পাসওয়ার্ড উন্মুক্ত করতে পারে যদি সঠিক সার্টিফিকেট যাচাই সহ HTTPS ব্যবহার না করা হয়।
OWASP Mobile Security Testing Guide (2025) অনুযায়ী, Android-এ সর্বোচ্চ পাসওয়ার্ড সুরক্ষার জন্য সুপারিশ করা হয়: গুরুত্বপূর্ণ ফিল্ডের জন্য inputType="textPassword" + autofill নিষ্ক্রিয় করুন; পাসওয়ার্ড প্রয়োজনের চেয়ে বেশি সময় মেমরিতে ক্যাশ করবেন না; অ্যাপ্লিকেশন মিনিমাইজ করার সময় পাসওয়ার্ড ফিল্ড পরিষ্কার করুন (onPause/onStop); পাসওয়ার্ডের সংক্ষিপ্ত প্রদর্শনের সময়ও মাস্কিং ব্যবহার করুন।
| সুরক্ষা স্তর | Secure Text Entry | অতিরিক্ত ব্যবস্থা |
|---|---|---|
| ভিজুয়াল ইন্টারসেপশন | ক্যারেক্টার মাস্কিং | বায়োমেট্রিক প্রমাণীকরণ, shoulder surfing এড়ানো |
| স্ক্রিনশট | আংশিক (বাস্তবায়নের উপর নির্ভরশীল) | Window-এ FLAG_SECURE |
| কিলগিং | সুরক্ষা করে না | নিরাপদ ইনপুট সহ IME ব্যবহার করুন |
| অটোকারেক্ট/অভিধান | নিষ্ক্রিয় | পাসওয়ার্ডের জন্য ডিফল্টভাবে নিষ্ক্রিয় |
| নেটওয়ার্ক ইন্টারসেপশন | সুরক্ষা করে না | সার্টিফিকেট পিনিং সহ HTTPS |
Android ডেভেলপারদের লুকানো ইনপুট নিয়ে কাজ করার সময় বেশ কয়েকটি মূল অনুশীলন অনুসরণ করা উচিত। প্রথমত, পাসওয়ার্ড ফিল্ডের জন্য সর্বদা endIconMode="password_toggle" সহ TextInputLayout ব্যবহার করুন — এটি আধুনিক Material Design মান। দ্বিতীয়ত, পাসওয়ার্ড দেখানোর ক্ষমতা নিষ্ক্রিয় করবেন না — ব্যবহারকারী কী প্রবেশ করিয়েছেন তা যাচাই করতে সক্ষম হওয়া উচিত, বিশেষ করে ছোট কীবোর্ডযুক্ত মোবাইল ডিভাইসে।
Secure Text Entry-এর সঠিক অটোফিল কনফিগারেশনও প্রয়োজন। পাসওয়ার্ড ফিল্ডের জন্য, সর্বদা autofillHints="password" বা autofillHints="newPassword" নির্দিষ্ট করুন যাতে পাসওয়ার্ড ম্যানেজারগুলি সঠিকভাবে ডেটা পূরণ এবং সংরক্ষণ করতে পারে। নতুন পাসওয়ার্ড নিশ্চিতকরণ ফিল্ডের জন্য, autofillHints="newPassword" ব্যবহার করুন যাতে সিস্টেম বর্তমান সংরক্ষিত পাসওয়ার্ড দিয়ে এটি পূরণ করার পরামর্শ না দেয়।
// 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()
}
}
সচরাচর জিজ্ঞাসা
textPassword সমস্ত প্রবেশ করানো ক্যারেক্টার লুকায় এবং অটোকারেক্ট নিষ্ক্রিয় করে। textVisiblePassword-ও অটোকারেক্ট নিষ্ক্রিয় করে কিন্তু ক্যারেক্টার স্পষ্টভাবে দেখায়। textVisiblePassword পাসওয়ার্ড দৃশ্যমানা টগল করার সময় ব্যবহৃত হয় — এটি সাধারণ টেক্সট নয়, কারণ নিরাপত্তার জন্য অটোকারেক্ট এবং পরামর্শ নিষ্ক্রিয় থাকে।
হ্যাঁ, TransformationMethod ইন্টারফেস বাস্তবায়নকারী একটি কাস্টম ক্লাস তৈরি করুন। getTransformation() মেথড ওভাররাইড করুন যা পছন্দসই প্রতিস্থাপন ক্যারেক্টার সহ একটি CharSequence ফেরত দেয়। এটি editText.transformationMethod = CustomPasswordTransformation()-এর মাধ্যমে সেট করুন। মনে রাখবেন যে নিরাপত্তার জন্য ক্যারেক্টারটি মনোস্পেসড হতে হবে।
ছোট স্ক্রিন এবং টাচ কীবোর্ডযুক্ত মোবাইল ডিভাইসে, পাসওয়ার্ড প্রবেশ করানোর সময় ত্রুটির সম্ভাবনা ডেস্কটপের তুলনায় উল্লেখযোগ্যভাবে বেশি। প্রবেশ করানো পাসওয়ার্ড যাচাই করার ক্ষমতা ইনপুট ত্রুটি হ্রাস করে এবং পাসওয়ার্ড রিসেট অনুরোধের সংখ্যা কমায়, যা ব্যবহারকারীর অভিজ্ঞতা উন্নত করে এবং সহায়তা লোড হ্রাস করে।
Activity বা Dialog উইন্ডোতে FLAG_SECURE ফ্ল্যাগ সেট করুন: window.setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)। এটি পুরো উইন্ডোর জন্য স্ক্রিনশট এবং স্ক্রিন রেকর্ডিং প্রতিরোধ করে। তবে, মনে রাখবেন যে এটি সাধারণ বিষয়বস্তুর জন্যও স্ক্রিনশট নিষ্ক্রিয় করবে, যা অবাঞ্ছিত হতে পারে।
Android 8.0 (API 26) থেকে শুরু করে, Autofill Framework স্বয়ংক্রিয়ভাবে inputType দ্বারা পাসওয়ার্ড ফিল্ড সনাক্ত করে। সঠিক অপারেশনের জন্য, importantForAutofill="yes" সেট করুন এবং autofillHints ("password", "newPassword", "emailAddress") নির্দিষ্ট করুন। Gboard এবং পাসওয়ার্ড ম্যানেজারগুলি সংরক্ষিত পাসওয়ার্ড suggest করতে এই অ্যাট্রিবিউটগুলি ব্যবহার করে।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন