多くのサイトで ワンタイムパスワード (OTP)(通常はSMSによって送信されます)を要求すると、入力がパスワードフィールドと同じように非表示になることに気づきました。
私の理解では、OTPを使用すると、OTPは何の役にも立たなくなります。
これらのフィールドの入力を非表示にする正当な理由はありますか?
私は、従来のユーザー名とパスワードの組み合わせに加えて、ワンタイムパスワードが第2の要素として使用されるという仮定に基づいて答えを出しています。これが当てはまらず、ワンタイムパスワードが唯一の要素である場合、 ギレスの回答 の方が確かに適しています。
ほとんどの場合 Cargo Cult Programming が原因です。これは、他の場所で観察されているパターンを盲目的に追跡することを意味します。
開発者は、「ワンタイムパスワード」の「パスワード」を見て喜んで<input type="password">
。結局のところ、それが目的ですよね?
セキュリティ面では、違います。ワンタイムパスワードを第三者に開示する(例: shoulder surfing を使用)ことはそれほど問題ではありません。これは、パスワードが1回使用した後、または一定の時間が経過すると有効性が失われるためです。
ユーザーが入力した内容を受け取ったパスワードと実際に一致させることが難しい場合があるため、考えられる唯一の欠点は、ユーザーエクスペリエンスが低下することです。
パスワードを非表示にする理由は、ショルダーサーフィンを防ぐためです。物理的に存在する誰か(またはカメラを通して観察している誰か)が画面上でパスワードを読み取ることができる可能性があります。これはワンタイムパスワードのリスクでもありますが、2つの理由ではるかに少ないです。ワンタイムパスワードが有効なのは短時間だけであり、それはOTPデバイスに表示されます。しかし、それでもリスクです。 OTPの種類に応じて、数分(時間ベースでサーバーが再生から保護されていない場合)、または正当なユーザーが入力を完了するまで(シーケンスベースまたはサーバーの場合)リプレイから保護します)。多くの場合、OTPデバイスの画面は、ユーザーがOTPを入力するコンピューターよりも、肩のサーファーには見えません。
フィールドをパスワードとして宣言すると、データを非表示にする以外のことが行われます。これにより、クリップボードへのコピーが妨げられ、アプリケーションがOTPをフォームのエントリ履歴に記録しない場合があります。これらのどれもセキュリティ上の利点はありませんが、エントリ履歴からOTPを省略することには使いやすさの利点があります。OTPが後で有効な入力であるという印象をユーザーに与えないようにします。
これらはかなり弱い理由です。主な理由は、フォームの設計者が入力が何らかのパスワードであることを認識しているため、パスワードとして宣言しているためです。
他の開発者の動機について推測することはおそらく時間の使い方が不十分ですが、言及されていない利点の1つを見ることができます。
心理的には、パスワードのように見せることで、人々がパスワードをセキュリティと関連付けるのに役立ちます。これは、何十年にもわたってプッシュしてきた「ユーザーにパスワードを知らせない」というメッセージをOTPに転送し、Bob Hackermanが電話をかけてきて、送信した6桁のコードを確認するように求めるときに、数人のユーザーが一時停止して質問できるようにするのに役立ちますそれら。通常、ユーザーはシステムの最も弱い部分であるため、投資するのに合理的な場所のようです。
技術的には、デメリット(ブラウザに保存するなど)があり、OTP専用のHTMLフィールドを使用する方が良いでしょう。たとえそれがあったとしても、それをデフォルトのUXとして点在させることは完全に合理的です。
フィールドの入力を非表示にする理由は、(@ MechMK1で述べたように)プログラミングパターンが原因である可能性があります。開発者は提供された認証タイプごとに個別のフィールドをコーディングしないため、フィールドをタイプパスワードで再利用するためです。そうしないと、コードが膨張する可能性があります。
攻撃者は、ユーザーがパスワードを入力するのを見たときに、ワンタイムパスワードを使用する可能性があります。
それはタイミングの問題に帰着します。彼が高度な攻撃者である場合、非表示ではないワンタイムパスワードを読み取り、同時にenterを押す前にネットワーク接続をブロックする可能性があります。そのため、彼はあなたが入力しているOTPを読み取り、フォームの送信を妨げ、OTPを使用してログインすることができます。
これは非常に厄介に聞こえるかもしれませんが、私たちの意見では、誠実なOTP実装でこれを処理する必要があります。 @ MechMK1が指摘したように、OTPは-名前が示すように-有効なonceのみです。ただし、OTPはサーバーが確認したときにのみ無効になります。そして前述のように、攻撃者がOTPをサーバーに送信できないようにできる場合、otpは無効化されず、攻撃者はこれをOTP beforeを使用できます。