web-dev-qa-db-ja.com

PHPセッションにパスワードを保存しても安全ですか?

Webサイトのプライベートゾーンで暗号化を行う必要があり、ユーザーのパスワードをbcryptしたいです。

ユーザーがログインするときにセッションにパスワードを保存して、後で使用できるようにしても安全ですか?

8

パスワードをセッション変数に保存しないでください。代わりに、代理キーを使用してください。

例えば:

  1. ランダムなキーを生成します。これが代理キーです。
  2. そのキーを使用して、必要なデータを暗号化します。
  3. 適切なキー導出関数(例:PBKDF2またはbcrypt)を使用して、パスワードからストレージキーを生成します。
  4. ストレージキーを使用して代理キーを暗号化します。 2つの鍵の長さが等しい場合、2つの鍵のビット単位のxorは暗号化の理想的な形式です。これは単純であり、鍵の1つを知らないと壊れないためです。
  5. 暗号化された代理キーを保存します。

ユーザーがログインすると、次のようになります。

  1. パスワードからストレージキーを計算します。
  2. ストレージキーを使用して、暗号化された代理キーを復号化します。
  3. 復号化された代理鍵をセッション変数に格納します。
  4. 必要に応じて、代理キーを使用してデータを復号化します。
  5. セッションが終了したら、復号化された代理キーを破棄します。

攻撃者が/tmpディレクトリに保存されているセッションデータへの読み取りアクセス権を取得すると、代理キーが抽出される可能性があります。ただし、ユーザーのパスワードを取得することはできません。これはサーバー上で暗号化しているデータを保護しませんが、ユーザーのアカウントへの不正アクセスを防ぎ、ユーザーが他の場所で同じパスワードを使用した場合の攻撃を阻止します。

10
Polynomial

PHPを安全に使用したい場合は、 Suoshin Hardened PHP patch がインストールされている必要があります。このパッチには、セッションデータを自動的に暗号化する機能が含まれており、特定の種類の攻撃から保護するのに十分です。

ただし、セッションハッキングはハッカーのツールボックスの1つの項目にすぎず、パスワードが主なターゲットであるため、プログラムは(メモリ内であっても)しばらくの間ハングアップするものとして扱われるべきではありません。パスワードは入力後できるだけ早くハッシュ化する必要があり、パスワード文字列自体はすぐにクリアされます。

したがって、あなたの質問に対する私の答えは「いいえ」です。後で再利用するためにパスワードを保持することを検討すべきではありません。

1
SDC