最良の考えは、車輪を再発明しないことです。しかし、PHPの世界では、それを既に実現している高品質のコンポーネントを見つけることは難しいかもしれません(フレームワークがそのようなことを実装し、その実装が既にテストされ、しっかりしており、コードレビューなどが行われていると確信しています) )
可能であれば、PBKDF2またはBcryptを使用します。これで完了です。
理由:両方のアルゴリズムは、ハッシュプロセスをarbitrarily意的に遅くすることができます。これは、パスワードをハッシュするときにまさに必要なものです(より簡単な代替手段は、ブルートフォースを容易にすることを意味します)。理想的には、同じハードウェア上で時間の経過とともにプロセスが徐々に遅くなるようにパラメーターを調整し、新しい高速のハードウェアがリリースされるようにする必要があります。
できない場合は、少なくともMD5 / SHA1を使用しないでください。決して。忘れてください。たとえば、代わりにSHA512を使用します。塩も使用します。
理由:MD5とSHA1は速すぎます。攻撃者がハッシュを含むデータベースにアクセスし、強力なマシン(特にではない場合)を持っている場合、パスワードのブルートフォースは高速かつ簡単です。ソルトがない場合、攻撃者が実際のパスワードを見つける可能性が高くなります(パスワードが他の場所で再利用された場合、さらに害を及ぼす可能性があります)。
PHP 5.5.0以降では、とを使用password_hash
しpassword_verify
ます。
理由:フレームワークが提供する関数を呼び出すのは簡単なので、間違いを犯すリスクが減ります。これらの2つの関数を使用すると、ハッシュなどの異なるパラメーターについて考える必要がなくなります。最初の関数は、データベースに格納できる単一の文字列を返します。2番目の関数は、このストリングをパスワード検証に使用します。
総当たり攻撃から身を守ります。ユーザーが0.01秒前に別の間違ったパスワードを既に送信したときに、間違ったパスワードを送信した場合、それをブロックするのは正当な理由です。人間が速く入力することができますが、彼らはおそらくすることができないという速いです。
別の保護は、1時間あたりの障害制限を設定することです。ユーザーが1時間に3600の間違ったパスワードを1秒あたり1パスワードで送信した場合、これが正当なユーザーであると信じることは困難です。
根拠:パスワードが安全でない方法でハッシュ化される場合、ブルートフォースは非常に効果的です。パスワードが安全に保存されている場合、ブルートフォースは依然としてサーバーのリソースとネットワーク帯域幅を浪費し、正当なユーザーのパフォーマンスを低下させます。ブルートフォースの検出は、開発も正しくも簡単ではありませんが、ごく小さなシステムにとっては、まったく価値があります。
4週間ごとにパスワードを変更するようユーザーに依頼しないでください。これは、ポストイットベースのセキュリティを促進するため、非常に迷惑であり、セキュリティが低下します。
理由:n週間ごとにパスワードを強制的に変更することで、システムをブルートフォースから保護するという考え方は間違っています。ブルートフォース攻撃は通常、数秒、数分、数時間または数日以内に成功するため、毎月のパスワード変更は無関係です。一方、ユーザーはパスワードを覚えるのが苦手です。さらに、それらを変更する必要がある場合、非常に単純なパスワードを使用しようとするか、ポストイットでパスワードを書き留めます。
毎回すべてを監査します。ログオンを保存しますが、監査ログにはパスワードを保存しません。監査ログを変更できないことを確認してください(つまり、最後にデータを追加できますが、既存のデータは変更できません)。監査ログが定期的なバックアップの対象であることを確認してください。理想的には、ログはアクセスが非常に制限された専用サーバーに保存する必要があります。別のサーバーがハッキングされた場合、攻撃者はログを一掃して自分の存在(および攻撃中にたどったパス)を隠すことができません。
ユーザーが要求しない限り、Cookie内のユーザー資格情報を記憶しないでください(人的エラーを避けるために、既定で[記憶する]チェックボックスをオフにする必要があります)。