3

パスワードの暗号化に関する多くの質問とチュートリアルを読みましたが、多くのことを学びましたが、これに対する答えはどこにも見つかりませんでした.

データベースに保存するパスワードをハッシュするために crypt() を使用したいと考えています。また、適切に機能するようにソルトを使用する必要があることも知っています。ランダムなソルトを生成する最良の方法は、これまたは類似のものを使用することであると読みました。

私が正しく理解した場合、プロセスは次のとおりです。

  1. ユーザーがパスワードを入力
  2. 塩をランダムに作成する
  3. ハッシュ パスワードとソルト
  4. 結果をデータベースに保存

しかし、ユーザーがログインしようとしたときにソルトを回復するにはどうすればよいですか?

  1. ユーザーは自分のパスワードを入力します
  2. 私はどういうわけか彼自身のユニークなランダムに生成された塩を追加します
  3. 両方を一緒にハッシュする
  4. データベースに保存されているハッシュ化されたソルト付きパスワードと比較します。

私が見つけたいくつかの質問では、答えの 1 つは、ランダムに生成されたソルトをデータベースに保存することでした。しかし、ソルティングの全体的な目的は、より安全にすることだと思いました。攻撃者が私の DB にアクセスすると、「ソルト」フィールドが表示され、パスワードが暗号化されていても、アカウントに簡単にアクセスできるようになります。

他の回答では、crypt() を使用するときに「ソルト」がパスワードの先頭に追加されるため、別のフィールドに保存する必要はないとのことです。私の質問は、どうすればアクセスできますか? これを行う機能があり、私は完全に欠けていますか?

4

3 に答える 3

4

ソルトをハッシュ化されたパスワードとともにデータベースに保存しますhash(salt+password)

データベースが危険にさらされ、誰かがすべてのハッシュとソルトを取得した場合、ハッシュに対してレインボー テーブル攻撃を実行することはできません。各ハッシュをブルート フォースする必要があります。優れたハッシュ アルゴリズムでは、ブルート フォース攻撃は実行不可能です。

レインボーテーブルアタックとは?

一般的なハッシュ アルゴリズムhash(f).

私は攻撃者として、一般的なパスワード ( f) とそのハッシュ ( ) を事前に計算しますhash(f)。さて、ハッシュのソルトされていないデータベースを取得したら、データベースを調べて、事前に計算されたテーブル (レインボー テーブル) と一致するハッシュを探すだけです。

たとえば、私のレインボー テーブルに が格納されている場合、f = qwertyデータベースをhash(f) = someRandomHash調べsomeRandomHash、それが見つかるとすぐに、ユーザーのパスワードが であることがわかりますqwerty

ただし、パスワードをソルトした場合、ユーザーがパスワードを として設定するとqwerty、ハッシュは として計算されhash('saltqwertyます。つまり、ハッシュはsomeRandomHashではなく として計算されsomeRandomSaltedHashます。これにより、レインボー テーブルがまったく役に立たなくなります。

私はあなたのテーブルを強引に攻撃する以外に選択肢がありません。ソルトは知っていますが、パスワードはわかりません。そのためhash(salt+password)、考えられるすべての順列とパスワードの組み合わせを計算する必要があります。十分に遅いハッシュ アルゴリズムでは、これには何世紀もかかることがあります (最悪の場合)。

ユーザーのログイン方法を教えてください。

ユーザーは自分の user_id とパスワードを送信します。そのユーザーのソルトをデータベースに照会します。hash(salt+password)次に、データベースに保存されているハッシュを計算して比較します。

于 2014-01-23T20:27:33.657 に答える
3

ハッシュ化されたパスワードとソルトを同じデータベースに安全に保存できます。ソルトは毎回異なるため、まったく同じパスワードであっても、データベースには異なる方法で保存されます。md5エンコードされたパスワードのようなもの。

明らかな大混乱から、PHP v5.5.0またはそれ以上を使用できる場合は、 と を使用してパスワードの保存が非常に簡単になりましpassword_hashpassword_verify

password追加の利点として、これらの関数では、データベースに別個のフィールドとフィールドを用意する必要はありません。返された値をsalt単純に保存し、平文のパスワードを使用して検証することができます。password_hashpassword_verify

于 2014-01-23T20:29:15.040 に答える
0

高度なセキュリティDBについてはよく知らないのですが、これはどうですか?:

hashedPassword = hash(UsurID+GivenPassword)

したがって、ログオン時に、最初にユーザーログインと彼の ID を取得し、次に指定されたパスワードを取得して、DB に既に存在する hashedPassword と比較します。私が言ったように、これがセキュリティを向上させるかどうかはわかりませんが、少なくともすべてのパスワードが異なるものになりますよね?

とにかく、私もまだまだ勉強中です。

于 2014-01-23T20:36:46.853 に答える