web-dev-qa-db-ja.com

サインインリンクをメールで送信することは悪い習慣ですか?

私のSpringアプリケーションでは、ユーザーのメールアドレスに「マジックサインインリンク」を送信して、認証プロセスからパスワードを削除することを計画していました。ただし、 この質問 Rob Winch(Spring Securityのリーダー)は次のように述べています。

メール内のリンクからのログインを許可するという意味で、自分が何をしているのかを知っていることに注意してください。 SMTPは安全なプロトコルではないため、通常、認証の形式として電子メールを持っている人に依存するのはよくありません。

それは本当ですか?もしそうなら、パスワードをリセットするためのリンクを送ることはどのようにもっと安全ですか?マジックリンクを使用したログインは、パスワードをリセットするためのマジックリンクを送信することと同じではありませんか?

32
Utku

魔法のリンクだけでは必ずしも悪いわけではありません。 512ビットの完全にランダムな値は、512ビットの秘密鍵よりも簡単に推測できます。一般に、妥当な期間が経過した後は期限切れにすることをお勧めします。良い方法-データベースエントリを保存する必要もないのは、トークンデータをURLに埋め込み、秘密鍵で署名することです。つまり.

site.com/login?type=login&user=[username]&expires=[datetime]&sig=[signature of other parameters].

ただし、送信メカニズムとしてのメールは安全ではありません。

デフォルトでは、SMTPは傍受に対する保護をほとんど提供していません。トラフィックはサーバー間で暗号化される場合がありますが、保証はありません。暗号化を使用していても、接続の途中で実行できることがよくあります(暗号化は認証と同じではありません)。

もしそうなら、パスワードをリセットするためのリンクを送ることはどのようにもっと安全ですか?

そうではありません。これが、いくつかのサービスがリンクを送信する前(またはリンクをクリックした後)に追加の証拠を要求する理由です。

30
Hector

ここには3つの問題があります。

  1. ドキュメントが書いているように、電子メールは安全なプロトコルではありません。メールはメールサーバー上で平文で送信されます。サーバー間およびサーバーとクライアント間の暗号化はオプションであり、制御不能です。また、電子メールの上に構築されたオプションのエンドツーエンド暗号化システム(PGP、S/MIMEなど)を使用できるシナリオではない可能性が非常に高くなります。したがって、意図された受信者以外の誰もが平文で電子メールを見ることを保証することはできません。
  2. シークレットはURLに属していません。 URLは、ブラウザの履歴、プロキシキャッシュ、サーバーログ、および秘密情報を表示したくない他の多くの場所に表示されます。
  3. ユーザーはパスワードの仕組みを知っています。簡単なことではありませんでしたが、長い苦闘の末、ようやくパスワードは秘密にしておかなければならないということを全員の頭に入れました。あなたのシステムでは、ユーザーはあなたのサービスでの認証に関連する秘密が何であるかを知らないかもしれません。そのため、それらの情報は誤って処理され、ソーシャルエンジニアリング攻撃の影響を受けやすくなります。

Ifメールで秘密のログイントークンを使用してリンクを送信する場合、リンクは使い捨てで、すぐに期限切れになります。

23
Philipp