19

パスワードを保存して再度使用する必要があります。これはまったく安全ではないと思います。

シナリオ:

ユーザーがユーザー名とパスワードを使用してログインし、メールを確認するWebメールプログラムを作成したいと思います。このツールは、dbにパスワードを保存することを意図していません。ただし、PHPでは、ユーザーが移動する各ページでメールサーバーに接続する必要があります。したがって、メールサーバーに接続するにはユーザー名とパスワードが必要です。これを最も安全な方法で行うにはどうすればよいですか?

4

1 に答える 1

25

パスワードを保存することは意図されていませんが、パスワードを何度も再入力する必要があることも望ましくないため、私が見る唯一の解決策は次のとおりです。

  • 十分な長さのランダム キーでパスワードを暗号化します (AES などを使用)。
  • 暗号化されたパスワードとユーザー名をセッションに保存する
  • 念のため、ユーザー名とメール サーバーも暗号化するのはおそらく間違いではありません。害はなく、推定される攻撃者はサーバー上に既知のユーザー名を持っていません.
  • 暗号化キーを Cookie に保存する

これは完璧ではありませんが、適度にうまく機能するはずです。

要求ごとに、ユーザーのブラウザーは Cookie を送信し、PHP スクリプトは Cookie を使用してセッションに保存されたデータを復号化し、IMAP/POP サーバーで要求を実行できます。

誰かがあなたのサーバーを悪用してセッション ストアへのアクセスを取得すると、暗号化されたパスワードを盗むことができますが、ランダム キーが十分な長さでランダムな品質が高い場合、これはほとんど役に立ちません。

重要なのは、自分が知らない秘密を持つものだけを本当に確保できるということです。サーバー上の一部の情報 (この場合は IMAP パスワード) を復号​​化するために必要な情報がある場合、たとえばセッション ストア内にある場合、サーバーを悪用するすべてのユーザーが同じことを実行できます。暗号化がどれほど強力であっても、違いはありません。
シークレットを確実に秘密のままにする唯一の方法は、ユーザー (またはこの場合はユーザーのブラウザー) だけが知っている、あなたが知らない何かでそれらを暗号化することです。

これは、ある時点で、少なくともほんの一瞬でも明らかに を知る必要があるという解決不可能な問題につながります。これは、Web サーバーが Cookie を受信して​​から PHP スクリプトが終了するまでの時間です。理論的には、root アクセス権を持つ誰かがその間にプロセス メモリを読み取っていた場合、その人もその秘密を知っていることになります。しかし悲しいかな、それはあなたが本当に防ぐことのできないものです.
ただし、情報がどこにも (セッション内であっても) 保存されない限り、かなり安全なはずです。

もちろん、これはすべて、少なくともサイトのログイン ページ (できればすべて) が 経由https://で提供され、メール サーバーとの通信に TLS/SSL を使用していることを前提としています。そうしないと、もっと些細な攻撃を受けやすくなります。

于 2013-01-12T14:05:57.197 に答える