ホームページ  >  記事  >  バックエンド開発  >  [ベストプラクティスシリーズ] PHP開発者がパスワードを保護する方法とLaravelの基盤となるパスワードストレージと検証の実装

[ベストプラクティスシリーズ] PHP開発者がパスワードを保護する方法とLaravelの基盤となるパスワードストレージと検証の実装

WBOY
WBOYオリジナル
2016-06-23 13:02:08841ブラウズ

オンライン攻撃が増加するにつれて、パスワードのセキュリティがますます重要になっています。開発者として私たちは、アプリケーションが単純なゲームであっても、極秘のビジネス文書のリポジトリであっても、セキュリティの管理、ハッシュの計算、ユーザー パスワードの保存に責任を負います。 PHP には、パスワードの保護を容易にする組み込みツールがいくつかあります。このセクションでは、最新のセキュリティ対策に従ってこれらのツールを使用する方法について説明します。

1. パスワード保護の 3 つの原則

ユーザーのパスワードを知ってはなりません

アプリケーションのデータベースがハッキングされた場合、ユーザーのパスワードを取得する方法はありません。 、絶対にそれは望ましくありません データベースにはプレーンテキストまたは復号可能なパスワードが存在します。いつでも、知識が少ないほど安全です。

ユーザーのパスワードを決して制限しないでください

パスワードを特定のパターンに準拠させる必要がある場合、実際には悪意のある人々がアプリケーションを攻撃する手段を提供することになります。パスワードを制限する必要がある場合は、パスワードのみを制限することをお勧めします。パスワードや辞書に基づいて作成されたパスワードをブラックリストに登録することもお勧めします。

ユーザーのパスワードを電子メールで送信しないでください

ユーザーにパスワードを電子メールで送信すると、ユーザーは次の 3 つのことを知ることになります: あなたは彼のパスワードを知っていること、そしてあなたは彼のパスワードを平文または復号化できる方法で保存していることインターネット上でプレーンテキストのパスワードを送信することを心配する必要はありません。

パスワードを設定または変更するための URL を電子メールで送信する必要があります。通常、このトークンはパスワードの設定または変更時に 1 回だけ使用されます。ユーザーがこの URL にアクセスすると、アプリケーションはトークンが有効であるかどうかを確認し、操作が完了すると操作を続行します。そして再利用することはできません。

2. パスワード保存アルゴリズム

パスワード保存に関するベスト プラクティスは、ユーザーのパスワードを暗号化するのではなく、パスワードのハッシュ値を計算することです。暗号化とハッシュは同じものではありません。暗号化されたデータは復号化できますが、ハッシュは一方向のアルゴリズムであり、ハッシュされたデータは元の値に戻すことができません。同じデータは常に同じです。

ユーザーのパスワードをデータベースに保存するには、まずパスワードのハッシュ値を計算し、次にパスワードのハッシュ値をデータベースに保存する必要があります。ハッカーがデータベースに侵入した場合、意味のないパスワードのみが表示されます。ハッシュ値を解読するには多大な時間と NSA リソースが必要になります。

多くのハッシュ アルゴリズム (md5、SHA1、bcrypt、scrypt など) が存在します。一部のアルゴリズムは高速で、データの整合性を検証するために使用されますが、一部のアルゴリズムは非常に遅く、セキュリティを向上させるために設計されています。パスワードを生成および保存するときは、低速で安全性の高いアルゴリズムを使用してください。

現在、最も安全なアルゴリズムは bcrypt です。md5 や SHA1 とは異なり、bcrypt アルゴリズムは潜在的なレインボー テーブル攻撃を防ぐために、意図的に低速になるように設計されています。特に安全なハッシュを生成します。このプロセスでデータが処理される回数を作業係数と呼びます。作業係数の値が高いほど、パスワードの解読にかかる時間が長くなり、セキュリティが向上します。 bcrypt アルゴリズムが時代遅れになることはありません。コンピュータの動作速度が速くなった場合、必要なのは作業係数の値を増やすだけです。

3. パスワード ハッシュ API

幸いなことに、PHP 5.5.0 のネイティブ ハッシュ API (http://php.net/manual/) では、ユーザー パスワードを処理する際に考慮すべきことがたくさんあることがわかりました。 zh/book.password.php ) は、パスワード ハッシュの計算とパスワードの検証の操作を大幅に簡素化する多くの使いやすい関数を提供します。さらに、このパスワード ハッシュ API はデフォルトで bcrpt アルゴリズムを使用します。

Web アプリケーションを開発する場合、パスワード ハッシュ API は登録ユーザーとユーザー ログインの 2 つの場所で使用されます。Laravel が提供するユーザー登録とログインを例として、PHP を使用するときにこれら 2 つの側面を簡素化する方法を見てみましょう。パスワードハッシュ API の操作。

注: Laraval フレームワークの組み込みユーザー登録およびログイン関数は、PHP ハッシュ API を使用してパスワードを保存および検証します。

Registered User

ユーザー登録は 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 でセッションをガードとして使用し、雄弁をプロバイダーとして使用してユーザーログイン認証を実装する例を取り上げます (実際のデフォルト設定はこのようです)。ログイン認証は最終的に validateCredentials に進みます。 EloquentUserProvider のメソッド:

$this->hasher の対応する実装も BcryptHasher クラスです。その check メソッドを確認してみましょう:

渡される最初のパラメータはユーザーが入力したパスワードです。パラメータはユーザーの登録時に保存されたパスワードのハッシュ値です。ハッシュ値が空の場合は、直接 false が返されます。それ以外の場合、この関数は、パスワード (プレーンテキスト) であるかどうかを確認するために使用されます。ハッシュ値が一致する場合は true を返し、一致しない場合は false を返します。

ハッシュ値を再計算します

上記の手順により、ユーザーはすでにログイン認証を行うことができますが、ログインする前に、既存のパスワード ハッシュ値の有効期限が切れているかどうかも確認する必要があります。有効期限が切れている場合は、パスワード ハッシュの有効期限が切れています。値を再計算する必要があります。

なぜ再計算する必要があるのですか?私たちに加わったアプリケーションは 2 年前に作成され、作業係数 10 を使用していました。現在は 20 を使用しています。これは、コンピューターが高速になり、ハッカーがより賢くなったためです。一部のユーザーのパスワード ハッシュ値は、作業係数が 10 の場合でも生成される場合があります。この場合、ログイン認証に合格した後、password_needs_refresh 関数を使用して、ユーザー レコード内の既存のハッシュ値を更新する必要があるかどうかを確認する必要があります。この関数は、指定されたパスワード ハッシュが最新のハッシュ アルゴリズムを使用して作成されていることを確認します。生成されたパスワードのハッシュ値を本当に再計算する必要がある場合は、make メソッドを使用して新しいハッシュ値を生成し、データベース内の元のパスワードを更新します。

この機能は現在 Laraval では使用されていませんが、対応する関数が BcryptHasher クラスで提供されています:

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。