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 — パスワード入力時に文字の代わりにドットを表示する非表示入力モード。
  • 有効化 — XMLでのinputType="textPassword"またはコードでのTYPE_TEXT_VARIATION_PASSWORDによる。
  • 保護 — 視覚的傍受、スクリーンショット、自動修正/辞書による漏洩を防止。
  • TransformationMethod — 文字表示を非表示記号に置き換えるAndroidの仕組み。
  • 表示切り替え — TextInputLayoutのendIconMode="password_toggle"によるパスワード表示機能。

AndroidにおけるSecure Text Entryとは

Secure Text Entry(保護テキスト入力)は、入力された各文字の表示をマスキング文字(通常はドット(•)またはアスタリスク(*))に置き換えるAndroidの機能です。これにより、肩越しのパスワード読み取り(ショルダーサーフィン)を防ぎ、入力データを詮索する目から隠します。この機能はパスワードマスキングとも呼ばれ、モバイルアプリケーションの標準的な慣行です。

iOSでSecure Text Entryが別個のUITextField設定であるのとは異なり、Androidではこの機能はPASSWORDバリエーションのinputType属性によって有効化されます。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の仕組み

AndroidのSecure Text Entryの仕組みは、android.text.methodパッケージで定義されたTransformationMethodインターフェースに基づいています。PasswordTransformationMethodは、getTransformation()メソッドをオーバーライドし、表示用に置き換えられた文字シーケンスを返す組み込み実装です。Editable内の元のテキストは変更されず — 視覚的表现のみが変更されます。

ユーザーが文字を入力すると、EditTextはdispatchEventを呼び出し、文字をInputConnectionに渡します。InputConnectionはそれをEditableに追加します。次にEditTextは現在のTransformationMethodのgetTransformation()メソッドを呼び出し、元のCharSequenceを受け取ってマスキング文字を含むSpannableStringを返します。このSpannableStringが元のテキストの代わりに画面に描画されます。重要な特徴は、変換自体がEditableの内容を変更しないことであり、getText().toString()を呼び出すと実際に入力されたテキストが返されます。

Android Developers Reference (2026) によると、PasswordTransformationMethodは各文字にMetricAffectingSpanを追加し、グリフをドットに置き換えます。これらのスパンはテキストの長さに影響しないため、非表示表示でもカーソルと入力位置は正しく保持されます。VisiblePasswordTransformationMethodも存在し、最後に入力された文字を短時間表示します(iOSと同様)。

kotlin
// 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) によると、パスワード表示アイコンはフィールドがフォーカスされているときだけでなく、常に表示されるべきです。ユーザーはいつでもパスワードを確認できる必要があります。アイコンは一定時間後に自動的にパスワードを非表示にするべきではありません — ユーザーの操作によってのみ行うべきです。

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のプログラム設定

KotlinでのSecure Text Entryのプログラム設定は、inputTypeを設定するか、setTransformationMethod()を使用して行います。どちらのアプローチも同じ結果につながりますが、詳細が異なります。inputTypeの設定は自動修正と候補も追加で設定しますが、setTransformationMethodは文字表示のみに影響します。

TextInputLayoutを使用したパスワード切り替えの例

kotlin
// 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))
}

カスタムTransformationMethod

kotlin
// 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は複数のレベルで保護を提供します。視覚的マスキングは肩越しのパスワード読み取り(ショルダーサーフィン)を防ぎます — 公共の場でのパスワード盗難の最も一般的な方法です。自動修正を無効にすることで、パスワードがユーザーの辞書に保存されるのを防ぎ、予測入力による漏洩を排除します。スクリーンショットからの保護(FLAG_SECUREが有効な場合)は、他のアプリケーションがフィールドの内容をキャプチャするのを防ぎます。

ただし、Secure Text Entryは完全な保護ではありません。システムレベルでの入力傍受(キーロギング)攻撃はInputConnectionから実際の文字を取得できます。アクセシビリティサービスを持つ悪意のあるアプリケーションは、画面上で文字が非表示でもEditTextの内容を読み取れます。また、サーバーへのデータ送信中に適切な証明書検証付きHTTPSが使用されていない場合、SSLスニッフィングによってパスワードが漏洩する可能性があります。

OWASP Mobile Security Testing Guide (2025) によると、Androidでの最大限のパスワード保護には以下が推奨されます:重要なフィールドにはinputType="textPassword" + autofillを無効化;必要以上にパスワードをメモリにキャッシュしない;アプリケーション最小化時にパスワードフィールドをクリア(onPause/onStop);パスワードの短時間表示時でもマスキングを使用。

保護レベルSecure Text Entry追加対策
視覚的傍受文字マスキング生体認証、ショルダーサーフィンの回避
スクリーンショット部分的(実装による)WindowへのFLAG_SECURE
キーロギング保護しない安全な入力付きIMEを使用
自動修正/辞書無効パスワードではデフォルトで無効
ネットワーク傍受保護しない証明書ピニング付きHTTPS

Secure Text Entryのベストプラクティス

Android開発者は非表示入力を扱う際にいくつかの重要な実践に従う必要があります。第一に、パスワードフィールドには常にendIconMode="password_toggle"付きのTextInputLayoutを使用してください — これが現代のMaterial Design標準です。第二に、パスワードを表示する機能を無効にしないでください — ユーザーは入力内容を確認できる必要があります。特に小型キーボードのモバイル端末では重要です。

Secure Text Entryは適切なオートフィル設定も必要とします。パスワードフィールドには、パスワードマネージャーが正しくデータを入力および保存できるように、autofillHints="password"またはautofillHints="newPassword"を常に指定してください。新しいパスワード確認フィールドにはautofillHints="newPassword"を使用し、システムが現在保存されているパスワードで入力を提案しないようにします。

  • TextInputLayout — 表示切り替えにはendIconMode付きのMaterial Design TextInputLayoutを使用。
  • Autofill — マネージャーサポートのためにautofillHints="password"とimportantForAutofill="yes"を追加。
  • クリア — アプリ最小化時にパスワードフィールドをクリア(onPause/onStop)。
  • 長さ — パスワードの長さを厳しく制限しない(最小8文字、厳格な最大値なし)。
  • 生体認証 — 手動パスワード入力の代替として生体認証ログイン(BiometricPrompt)を提供。
kotlin
// 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の違いは何ですか?

textPasswordは入力されたすべての文字を非表示にし、自動修正を無効にします。textVisiblePasswordも自動修正を無効にしますが、文字を明確に表示します。textVisiblePasswordはパスワード表示切り替え時に使用されます — セキュリティのために自動修正と候補が無効のままであるため、通常のテキストではありません。

パスワードマスキング用のカスタム文字を作成できますか?

はい、TransformationMethodインターフェースを実装するカスタムクラスを作成してください。目的の置き換え文字を含むCharSequenceを返すgetTransformation()メソッドをオーバーライドします。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やパスワードマネージャーはこれらの属性を使用して保存されたパスワードを提案します。

まとめ

  • Secure Text Entry — PasswordTransformationMethodを介して文字をマスキング記号(ドット)に置き換える非表示入力モード。
  • 有効化 — inputType="textPassword"またはTYPE_TEXT_VARIATION_PASSWORDのプログラム設定による。
  • PasswordTransformationMethod — Editableを変更せずに文字表示を置き換える組み込みAndroidクラス。
  • 表示切り替え — endIconMode="password_toggle"とTYPE_TEXT_VARIATION_VISIBLE_PASSWORDを使用したTextInputLayoutで実装。
  • 保護 — ショルダーサーフィン、スクリーンショット(FLAG_SECURE使用時)、自動修正、辞書保存を防止。
  • Autofill — パスワードマネージャーサポートのためにimportantForAutofillとautofillHints="password"を追加。
  • ベストプラクティス — TextInputLayoutを使用、最小化時にフィールドをクリア、パスワード長を厳しく制限しない。

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください