セキュリティ上の問題から、データベースでパスワードフィールドを暗号化しておくことをお勧めします。
私のウェブサイトの場合、私だけがデータベースにアクセスできます。また、Webサイトのポリシーに従って、他のユーザーのパスワードを表示しても問題ありません。
これは私のウェブサイトにも当てはまりますか、それともこれを伝えることの背後にある他のセキュリティ上の理由がありますか。
セキュリティ上の問題から、データベースでパスワードフィールドを暗号化しておくことをお勧めします。
私のウェブサイトの場合、私だけがデータベースにアクセスできます。また、Webサイトのポリシーに従って、他のユーザーのパスワードを表示しても問題ありません。
これは私のウェブサイトにも当てはまりますか、それともこれを伝えることの背後にある他のセキュリティ上の理由がありますか。
ガイダンスでは、パスワードは誰も(ユーザー自身も)見ることができないようにする必要があり、パスワードを取得できるようにデータベースに保存しないようにする必要があります。これは、このデータが失われる可能性のある多くの方法があるためです。管理者はレポートを印刷して自分の机に置いておくことができます。攻撃者はSQLインジェクションを使用してデータベースクエリを実行できる可能性があります。誰かがあなたの建物に侵入してバックアップテープを盗むことができるかもしれません。
多くの顧客は複数のサイトで同じパスワードを使用しています。そのため、自分のサイトが最も弱いリンクである場合、パスワードを再利用した場合、他のサイトでリスクにさらされる可能性があります。
「ハッシュ」と呼ばれる暗号化技術を使用することをお勧めします。これは、プレーンテキストのパスワードを取得して意味のない文字列に変換します。ハッシュを元に戻す方法はありません。つまり、ハッシュされたパスワードを盗んだとしても、元のプレーンテキストが何であるかを理解できませんでした。
同じ文字列を2回ハッシュすると、同じハッシュが得られます。つまり、誰かがログインしたときに、プレーンテキストのパスワードをハッシュして、データベース内のハッシュと比較します。
OWASPリンクは、ハッシュの「ソルト」など、このトピックに関する詳細情報を提供します。
暗号化されているかどうかにかかわらず、データベースにパスワードを保存しないでください。
代わりに、ハッシュを保存してください。ユーザーがログインしようとすると、ユーザーが入力したパスワードのハッシュを計算し、データベースに保存されているハッシュと比較します。
残念ながら、プレーンハッシュはいわゆる「レインボー」攻撃の影響を受けやすくなっています。攻撃者があなたのテーブルを手にした場合、英語1辞書全体、または特定の長さまでの文字のすべての組み合わせのハッシュを事前に計算して、いわゆる「レインボーテーブル」を生成し、それをすばやく比較することができます。一致するハッシュのデータベーステーブルに。一部のユーザーは、この種の攻撃で失敗する可能性のある弱いパスワードを使用することになります。
レインボー攻撃を防ぐために、パスワード自体をハッシュしないでください。代わりに、パスワード+ソルトをハッシュします。ソルトはランダムなユーザー固有の文字列であり、ハッシュ自体よりも秘密にする必要はありません2。これによりハッシュのバリエーションが導入されるため、攻撃者はすべてのユーザーに同じレインボーテーブルを使用できなくなります。攻撃者は事実上、ユーザーごとに(および彼/彼女のソルト)新しいレインボーテーブルを生成する必要があり、それが法外に高価になることを願っています。
塩漬けの不足は、今年のLinkeInの大規模なセキュリティ違反の一因となりました。このニューヨークタイムズの記事からの引用:
「セキュリティの専門家によると、パスワードのソルトはセキュリティ101であり、LinkedIn、eHarmony、Lastfm.comがすべて失敗した基本的なステップです。」
もちろん、これは多層防御の最後の層である必要があります。この層は、攻撃者がデータベースを既に読み取った後、攻撃者の生活を困難にするように設計されています。SQLインジェクションの防止、階層の厳密な分離、適切なデータベースセキュリティ、ファイアウォール、定期的なパッチ適用など、最初からこれが発生しないように、あらゆる努力を払う必要があります。
1またはその他の関心のある人間の言語。
2ただし、理想的には、たとえば明確に定義されたWebサービスAPIの背後に個別に保存する必要があります。
常にパスワードをハッシュする必要があります。ユーザーはあなたを信頼する理由がなく、データベースが危険にさらされているかどうかを知る方法もありません。このような質問で、私はあなたがウェブサイトのセキュリティについての基本的な理解を持っていると仮定することができるだけです。私たちは、ソニー、米国政府、銀行などの企業が毎週データベースをハッキングしている時代に生きています。あなたがこれを免除されていると思うなら、あなたはあなたが彼らのプライバシーを気にしないことをあなたのユーザーに知らせるために登録時にそれを投稿するべきです。
ユーザーのパスワードの1つを読み取れるようにする必要がある理由は何もありません。
パスワードハッシュを実装するには、登録時にパスワードを取得し、データベースに保存する前にハッシュする必要があります。次に、ユーザーがログインしたら、パスワードをハッシュしてから、そのハッシュをデータベース内のハッシュと比較する必要があります。それらを比較すると、同じパスワードです。
また、パスワードをソルトすることを忘れないでください。つまり、「test」のパスワードを持っていてそれをハッシュし、別のサイトのユーザーが「test」のパスワードを持っている場合、2つのハッシュは同じであり、以前のハッシュに基づいてパスワードを把握できます。ソルトは、ハッシュの前にパスワードにデータを追加するようなものです。したがって、データベースの「test」は実際には「test123」であり、誰かがパスワードを入力するたびに、PHPは自動的に「123」を追加します。このように、自分のサイトのハッシュを別のサイトと比較する場合、同じパスワードのハッシュは同じではありません。
あなたはあなたがそれにアクセスできる唯一の人だと思うことを意味します。セキュリティはレイヤーで実装する必要があるため、1つが失敗した場合、その背後には常に別のセキュリティがあります。
パスワードは常にハッシュ化してソルト化する必要があります。
すでに提供されている良い答えに1点付け加えたいと思います。ハッシュアルゴリズムは低速である必要があります。そうしないと、一致するものが見つかるまでブルートフォース攻撃が発生しやすいためです。既製のGPUは約8ギガの組み合わせを計算できるため、1ミリ秒未満で英語の辞書全体を試すことができます。
そのため、Bcryptを使用してパスワードをハッシュする必要があります。これは、パスワードをハッシュするために特別に設計されたものです。将来の(したがってより高速な)ハードウェアに適応できるコスト要因があります。