私のデータベースには、非常に長く、一意で、 [〜#〜] csprng [〜#〜] によって生成されたパスワードが保存されています。
ハッシュする前にソルトを使用する必要がありますか?
私の理解では、通常、ハッシュ関数は次のように使用します。
hash(salt + password)
どこ +
は、単に2つの文字列(またはバイト配列)を連結したものです。私のパスワードはすでにランダムに生成されているため、別のランダムな値であるソルトをパスワードの前に付けるのは無意味です。
パスワードをハッシュするときにソルトを使用する目的は、同一のパスワードが同じハッシュ値になることを防ぐことです。ご存じのように、パスワードがすべて長く、CSPRNGによって生成された場合、データベース内に異なるユーザーの同一のパスワードはありません。それらはすべて一意であり、ソルトはこれらのパスワードのセキュリティに何も追加しません。
ただし、注意が必要です。つまり、ランダムでないsomeパスワードがある場合です。つまり、生成したランダムなパスワードが初期パスワードである場合、ユーザーは別のパスワードを選択できます。この場合、ランダムに生成されたものを含め、パスワードをより確実にソルトする必要があります。これには2つの理由があります。
分岐ロジックを追加して一部のパスワードをソルトし、他のパスワードをソルトすることは不必要な複雑さであり、不必要な複雑さは高価で悪です。すべてをソルト処理することで、ランダムパスワードのセキュリティを低下または増加させることはありませんが、アプリケーションロジックを簡略化して、バグ、セキュリティなどの可能性を低下させます。
これは劇的にランダムでないパスワードのセキュリティを低下させる可能性があります。スキームが既知であり、ハッシュとソルトが攻撃者によって抽出された場合、攻撃者はランダムに生成されていないパスワード(ソルトされたパスワード)を即座に判別できるため、攻撃する必要があります。すべてのパスワードがソルト化されている場合、ランダムなパスワードはユーザー定義のパスワードと区別できなくなります。