5

MVC を使用していますが、どの時点でユーザー パスワードをハッシュするかを知りたいです。

  1. サーバーに送信する前 (ビュー)
  2. サーバーで、オブジェクト フィールド (モデル) を設定すると
  3. サーバーで、オブジェクトをコントローラー(コントローラー)に送信すると
  4. サーバーで、ステートメントを準備するとき(コントローラー)
  5. データベースで、

たとえば"set password = sha256(:password)"、ステートメントで使用する

オブジェクトを作成して「パスワード」フィールドを設定するときは常にパスワードをハッシュしてきましたが、どこかで読んだことがありますが、それは十分に安全ではありません。わからない。

4

4 に答える 4

5
  • ビュー: これは高すぎます。アプリケーションには、パスワードを処理する複数のビュー (ログイン フォームとパスワード変更フォームの 2 つの単純なもの) がほぼ確実に存在し、ビューでパスワード ハッシュを使用すると重複が発生します。

  • データベース内: 低すぎます。データベースは平文のパスワードを決して見るべきではありません。これを行うと、状況によっては、ネットワーク経由で平文のパスワードが送信されたり、エラー メッセージに表示されたり、データベース ログに書き込まれたりする可能性があります。さらに、データベースでサポートされているハッシュ関数のほとんどは速すぎて、パスワードの保存には安全ではありません。

  • モデルで:ちょうどいい。次のようなユーザー オブジェクトにメソッドを実装することをお勧めします。

    $user->setPassword($password)    # sets password to specified value
    $user->passwordEquals($password) # returns true if value passed in matches the password
    

    これらのメソッドのいずれも、パスワードやその保存方法を公開しないことに注意してください。これはすべて、オブジェクトの実装の詳細です。

于 2013-01-18T04:01:12.897 に答える
1

ロジックを表すドメイン オブジェクトでエンティティを使用しますUser。それはモデルレイヤー内にあります。

また、SHA256 は十分とは見なされません。bcryptを使用する必要があります。できればcrypt()機能付き。

于 2013-01-18T12:29:09.057 に答える
1

できるだけ早くサーバー上でハッシュします。すなわち。お客様からの依頼を受け次第。元のパスワードを使用する必要はありません。ハッシュを保存して忘れます。

経験則として、パスワードまたはパスワードのハッシュはホット ポテトとして扱う必要があります。できるだけ早くそれらの処理を停止する必要があります。

また、万が一サーバー プロセスが侵害された場合でも、機密情報がサーバーのメモリに潜んでいるのは望ましくありません。そのため、元のパスワードが長時間メモリに残ることは避けてください。

于 2013-01-18T04:03:16.167 に答える
0

まず、そのフィールドの値を取得します。次に、hash関数を適用します。コントローラーで上記の操作を実行してから、モデルを呼び出してデータベースに保存します。理解が深まります。

(私は専門家ではありません...私の情報を共有できることを嬉しく思います.. :)

于 2013-01-18T03:59:21.130 に答える