[Php] ユーザー情報とユーザーのログインとパスワードを最適に保存する方法


Answers

パスワードは暗号化ハッシュとして保存する必要があります。これはプレーンテキストの読み取りを妨げる非可逆操作です。 ユーザーを認証するとき、パスワード入力は同じハッシュ処理を受け、ハッシュが比較されます。

MD5やSHA1などの高速で安価なハッシュの使用を避けてください。 目的は、攻撃者が(ハッシュの衝突に基づいて)レインボーテーブルを計算するのに高価なものにすることです。 速いハッシュはこれに対抗します。 高価なハッシュの使用は、ハッシュの1回の実行に影響を与えないため、認証シナリオでは問題になりません。

ハッシュに加えて、ランダムに生成された値でハッシュをソルトします。 ノンスはデータベースに格納され、ハッシングの前にデータと連結されます。 これは、衝突を計算する際に生成されなければならない可能な組み合わせの数を増加させ、したがって、虹のテーブルを生成する全体的な時間の複雑さを増加させる。

パスワードのハッシュカラムは固定長にすることができます。 あなたの暗号化ハッシュは、すべてのハッシュで同じになる固定長にエンコードできる値を出力する必要があります。

可能であれば、独自のパスワード認証メカニズムを使用しないでください。 bcryptなどの既存のソリューションを使用します。

パスワードを扱う方法の優れた説明と、あなたが心配する必要があるものについては、 http://www.matasano.com/log/958/enough-with-the-rainbow-tables-what-you-必要なことを知るための安全なパスワードスキーム

最後の注意として、攻撃者がデータベースへのアクセス権を取得した場合、アクセスした可能性のある機密情報や個人識別情報、およびそれらが行った可能性のある損害に直接気付くはずです。

Question

私はMysqlを使用しています。ユーザーの個人情報とログインとパスワードを別々のテーブルに分けて、2つのテーブルの間で参照するほうがよいと仮定していました。

:投稿を明確にするために、私はパスワード(ハッシュ、塩など)を確保する技術を理解しています。 私が知っているのは、テーブル間で情報を分割した最悪のシナリオ(テーブルや火災を含む)で、自分の人生を保護する可能性があるという私の人生の他の部分(投資、データバックアップ、追加データ。




それらを同じテーブルに格納し、一方向の暗号化を使用する必要があります。 MD5は機能しますが弱いので、SHA1などの方法を検討してください。 別々のテーブルに2つのアイテムを格納することには利点はありません。




私の個人的な経験では、この場合、個人情報とログイン情報を個々のデータベースに保存することがベストプラクティスです。 SQLインジェクションが行われる理由は、データの集合全体にアクセスするのではなく、データが関係するテーブルに限られています(侵入者がデータベースの内部レイアウトを知らない場合を除く)。

ただし、これは、より多くのクエリを実行する必要があるため、パフォーマンスが低下する可能性があります。




私は元の質問に答えようとします。 1つのテーブルにすべてを入れることは、収集する個人情報をたくさん持たない限りうまくいきます。 その場合、それを分割することが理にかなっているかもしれません。 その決定は、あなたが扱っている個人情報の量とそれにアクセスする必要がある頻度に基づいて行われるべきです。

私はほとんどの時間を私はこのような何かを単一のテーブルでやると言うだろう:

UserID, FirstName, LastName, Email, Password, TempPassword

しかし...もしあなたがそれ以上のことを集めているなら。 電話、ファックス、生年月日、伝記などを収集しているとします。その情報のほとんどがほとんどアクセスされていない場合は、おそらくそれを自分のテーブルに入れて、1対1の関係で接続します。 結局、テーブルのカラム数が少ないほど、そのテーブルに対するクエリはより速くなります。 そして、時には、最もアクセスされているテーブルを単純化することが理にかなっています。 あなたがその個人情報にアクセスする必要があるときはいつでも、JOINでパフォーマンスが低下しますので、考慮する必要があります。

編集 - あなたは何を知っていたのか分かりました。 ユーザー名または電子メールフィールドに索引を作成すると、ユーザー表に多数の列を作成した場合のパフォーマンスの問題をほとんど完全に排除できます。 なぜなら、WHERE句にログインするたびに、インデックスがある場合はユーザー名を見つけるのが非常に早く、そのテーブルに100列があるかどうかは関係ありません。 だから私は自分の意見を変えました。 私はそれをすべて一つのテーブルに入れた。 ;)

どちらの場合でも、セキュリティは一般的なトピックであるように見えるので、パスワードはハッシュ値でなければなりません。 私はあなたが本当にそれについて心配している場合SHA1(またはSHA256)をお勧めします。 TempPasswordはハッシュも使用する必要があり、パスワード忘れ機能のためにのみ存在します。 明らかにハッシュを使用すると、元のパスワードを解読してユーザーに送信することはできません。 代わりに、一時的なパスワードを生成してログインすることができます。その後、ログイン後に再びパスワードを変更するように強制します。