オンライン攻撃の増加に伴い、パスワードのセキュリティの重要性がますます高まっています。開発者として私たちは、アプリケーションが単純なゲームであっても、極秘のビジネス文書のリポジトリであっても、セキュリティの管理、ハッシュの計算、ユーザー パスワードの保存に責任を負います。 PHP には、パスワードの保護を容易にする組み込みツールがいくつかあります。このセクションでは、最新のセキュリティ対策に従ってこれらのツールを使用する方法について説明します。
1. パスワード保護の 3 つの原則
ユーザーのパスワードを決して知ってはなりません
ユーザーのパスワードを決して知ってはなりませんアプリケーションのデータベースがハッキングされた場合、データベースにプレーン テキストまたは復号可能なパスワードを含める必要はありません。いつでも、知識が少ないほど安全です。
ユーザーのパスワードを決して制限しないでください
パスワードが特定のパターンに従う必要がある場合、実際には、悪意のある人々がアプリケーションを攻撃する手段が提供されてしまいます。パスワードを制限する必要がある場合は、パスワードを最小限の長さに制限することをお勧めします。一般的に使用されるパスワードや辞書に基づいて作成されたパスワードをブラックリストに登録することもお勧めします。
ユーザーのパスワードを電子メールで送信しないでください
ユーザーにパスワードを電子メールで送信すると、ユーザーは次の 3 つのことを知ることになります。パスワードを知っていること、パスワードを保存していることです。パスワードをプレーン テキストまたは復号化できる方法で送信する場合、インターネット上でプレーン テキストのパスワードを送信することを心配する必要はありません。
パスワードを設定または変更するための URL をメールで送信する必要があります。Web アプリケーションは通常、一意のトークンを生成します。このトークンは、パスワードを設定または変更するとき (パスワードの変更など) に 1 回だけ使用されます。) , 通常、このトークンはパスワードを設定または変更するための URL のパラメータとして使用されます。ユーザーがこの URL にアクセスすると、アプリケーションはトークンが有効かどうかを確認します。有効な場合は、操作を続行します。操作が完了したら、トークンは無効になり、再利用できなくなります。
2. パスワード保存アルゴリズム
パスワード保存に関するベスト プラクティスは、ユーザーのパスワードを暗号化するのではなく、パスワードのハッシュ値を計算することです。暗号化とハッシュは同じものではありません。暗号化は双方向のアルゴリズムです。暗号化されたデータは復号化できますが、ハッシュは一方向のアルゴリズムです。ハッシュされたデータは元の値に復元できず、ハッシュ値は元の値に戻すことができません。同じデータは常に同じです。
ユーザーのパスワードをデータベースに保存するには、最初にパスワードのハッシュ値を計算し、次にパスワードのハッシュ値をデータベースに保存する必要があります。ハッカーがデータベースに侵入した場合、ハッカーはデータベースに侵入するだけです。意味のないパスワード ハッシュを参照してください。この値を解読するには、多くの時間と NSA リソースが必要になります。
ハッシュ アルゴリズムにはさまざまな種類があります (md5、SHA1、bcrypt、scrypt など)。非常に高速でデータの整合性を検証するために使用されるアルゴリズムもあれば、非常に低速でセキュリティを向上させるために設計されたアルゴリズムもあります。パスワードを生成および保存するときは、低速で安全性の高いアルゴリズムを使用してください。
現在、最も安全なアルゴリズムは bcrypt です。md5 や SHA1 とは異なり、bcrypt は非常に遅くなるように意図的に設計されています。bcrypt は潜在的なレインボー テーブル攻撃を防ぐためにソルトを自動的に追加します。bcrypt アルゴリズムには多額の費用がかかりますデータは時間をかけて繰り返し処理され、特に安全なハッシュが生成されます。この際、データを処理する回数を作業係数と呼び、作業係数の値が高いほどパスワードの解析に時間がかかり、セキュリティが高くなります。 bcrypt アルゴリズムは時代を超えており、コンピューターが高速化した場合、作業係数の値を増やすだけで済みます。
3. パスワード ハッシュ API
これまでの紹介で、ユーザー パスワードを処理する際に考慮すべきことがたくさんあることがわかりました。幸いなことに、PHP 5.5.0 ネイティブハッシュ API (http://php.net/manual/zh/book.password.php) は、パスワード ハッシュの計算とパスワードの検証の操作を大幅に簡素化する、使いやすい機能を多数提供します。はデフォルトで bcrpt アルゴリズムを使用します。
Web アプリケーションを開発する場合、パスワード ハッシュ API は登録ユーザーとユーザー ログインの 2 か所で使用されます。Laravel が提供するユーザー登録とログインを例にして、PHP を見てみましょう。パスワード ハッシュ API。これら 2 つの操作を簡略化する方法。
注: Laraval フレームワークの組み込みユーザー登録およびログイン関数は、PHP ハッシュ API を使用してパスワードを保存および検証します。
登録ユーザー
ユーザー登録は AuthController で完了し、新しいユーザーの作成はコントローラーの create メソッドで実装されます。
Laravel が提供する補助関数 bcrypt を使用して、ユーザーが送信したパスワードをハッシュし、データベースに保存していることがわかります。 bcrypt 関数は次のように定義されます。
ここでは、hash としてエイリアスされたサービス プロバイダー インスタンスの make メソッドが実際に呼び出され、ハッシュ化されたパスワードを実装し、 HashServiceProvider. register メソッドでは、ハッシュに対応するクラスが BcryptHasher であることがわかり、このクラスには make メソッドが見つかります:
ここでの核心は、PHP が提供するpassword_hash 関数を呼び出すことです。この関数は 3 つのパラメータを受け取ります。最初のパラメータはユーザーが入力したパスワード値で、2 番目のパラメータは使用されるハッシュ アルゴリズムです (その他のアルゴリズムを参照: http:// /php.net/manual/zh/password.constants.php)、3 番目のパラメーターはオプションで、ソルトとコストのオプションを含みます。これらはそれぞれ干渉文字列 (ソルト) と前述の作業係数を表し、作業係数を増やすことができます。ハードウェアのパフォーマンスが向上するため、そうでない場合は、ランダム ソルトとデフォルトの作業係数を使用します (ハッシュ値の計算には通常 0.1 ~ 0.5 秒かかります)。計算が失敗すると、例外がスローされます。
ユーザーログイン
Larval では、auth.php でセッションをガードとして使用し、雄弁をプロバイダーとして使用してユーザー ログイン認証を実装する例を取り上げます (実際のデフォルト設定は次のとおりです)。このように)、ログイン検証は最終的に EloquentUserProvider の validateCredentials メソッドに進みます:
$this->対応する hasher の実装も BcryptHasher クラスです。その内容を確認してみましょう。 check メソッド:
渡される最初のパラメータはユーザーが入力したパスワード、2 番目のパラメータはユーザーの登録時に保存されたパスワードのハッシュ値です。空の場合、直接 false を返します。それ以外の場合は、PHP が提供するpassword_verify 関数が呼び出されます。この関数は、パスワード (プレーン テキスト) とハッシュ値が一致するかどうかを検証するために使用されます。一致した場合は true を返し、そうでない場合は false を返します。
ハッシュ値を再計算する
上記の手順により、ユーザーはすでにログイン認証を行うことができますが、ログインする前に、既存のパスワードのハッシュ値が正しいかどうかを確認する必要もあります。値が期限切れになっています。期限切れの場合は、パスワード ハッシュを再計算する必要があります。
なぜ再計算する必要があるのでしょうか?私たちに加わったアプリケーションは 2 年前に作成され、作業係数 10 を使用していました。現在は 20 を使用しています。これは、コンピューターが高速になり、ハッカーがより賢くなったためです。一部のユーザーのパスワード ハッシュ値は、作業係数が 10 の場合でも生成される場合があります。この場合、ログイン認証に合格した後、password_needs_refresh 関数を使用して、ユーザー レコード内の既存のハッシュ値を更新する必要があるかどうかを確認する必要があります。この関数は、指定されたパスワード ハッシュが最新のハッシュ アルゴリズムを使用して作成されていることを確認できます。生成されたパスワードのハッシュ値を本当に再計算する必要がある場合は、make メソッドを使用して新しいハッシュ値を生成し、データベース内の元のパスワードを更新します。
この機能は現在 Laraval では使用されていませんが、対応する関数が BcryptHasher クラスで提供されています:
元のアドレス: https : //xueyuanjun.com/post/4764
以上がPHP開発者はパスワード保護とLaravelの基盤となるパスワードの保存と検証の実装をどのように行っているのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。