web-dev-qa-db-ja.com

ランダムに生成されたパスワードをハッシュするときにソルトが必要ですか?

私のデータベースには、非常に長く、一意で、 [〜#〜] csprng [〜#〜] によって生成されたパスワードが保存されています。

ハッシュする前にソルトを使用する必要がありますか?

私の理解では、通常、ハッシュ関数は次のように使用します。

hash(salt + password)

どこ +は、単に2つの文字列(またはバイト配列)を連結したものです。私のパスワードはすでにランダムに生成されているため、別のランダムな値であるソルトをパスワードの前に付けるのは無意味です。

4
Gudradain

パスワードをハッシュするときにソルトを使用する目的は、同一のパスワードが同じハッシュ値になることを防ぐことです。ご存じのように、パスワードがすべて長く、CSPRNGによって生成された場合、データベース内に異なるユーザーの同一のパスワードはありません。それらはすべて一意であり、ソルトはこれらのパスワードのセキュリティに何も追加しません。

ただし、注意が必要です。つまり、ランダムでないsomeパスワードがある場合です。つまり、生成したランダムなパスワードが初期パスワードである場合、ユーザーは別のパスワードを選択できます。この場合、ランダムに生成されたものを含め、パスワードをより確実にソルトする必要があります。これには2つの理由があります。

  1. 分岐ロジックを追加して一部のパスワードをソルトし、他のパスワードをソルトすることは不必要な複雑さであり、不必要な複雑さは高価で悪です。すべてをソルト処理することで、ランダムパスワードのセキュリティを低下または増加させることはありませんが、アプリケーションロジックを簡略化して、バグ、セキュリティなどの可能性を低下させます。

  2. これは劇的にランダムでないパスワードのセキュリティを低下させる可能性があります。スキームが既知であり、ハッシュとソルトが攻撃者によって抽出された場合、攻撃者はランダムに生成されていないパスワード(ソルトされたパスワード)を即座に判別できるため、攻撃する必要があります。すべてのパスワードがソルト化されている場合、ランダムなパスワードはユーザー定義のパスワードと区別できなくなります。

2
Xander