職場では、塩について 2 つの競合する理論があります。私が取り組んでいる製品では、ユーザー名や電話番号などを使用してハッシュをソルトしています。基本的に、ユーザーごとに異なるものですが、私たちはすぐに利用できます。他の製品は、ユーザーごとにソルトをランダムに生成し、ユーザーがパスワードを変更するたびに変更します。その後、ソルトはデータベースで暗号化されます。
私の質問は、2 番目のアプローチが本当に必要かどうかです。純粋に理論的な観点からは、最初のアプローチよりも安全であることは理解できますが、実用的な観点からはどうでしょうか。現在、ユーザーを認証するには、ソルトを暗号化せずにログイン情報に適用する必要があります。
考えてみると、このアプローチによる実際のセキュリティの向上は見られません。アカウントごとにソルトを変更すると、攻撃者が各アカウントのソルトをすばやく判断する方法を知っていたとしても、誰かがハッシュ アルゴリズムをブルート フォースしようとすることは依然として非常に困難になります。これは、パスワードが十分に強力であることを前提としています。(明らかに、すべて 2 桁のパスワード セットの正しいハッシュを見つけることは、8 桁のパスワードの正しいハッシュを見つけるよりもはるかに簡単です)。私の論理が間違っていますか、それとも何かが欠けていますか?
編集:さて、ソルトを暗号化するのは本当に無意味だと思う理由は次のとおりです。(私が正しい軌道に乗っているかどうかを教えてください)。
以下の説明では、パスワードは常に 8 文字で、salt は 5 文字で、すべてのパスワードは小文字で構成されていると仮定します (計算が簡単になるだけです)。
エントリごとに異なるソルトを持つということは、同じレインボー テーブルを使用できないことを意味します (実際、技術的には、十分なサイズのテーブルがあれば使用できますが、それは今のところ無視しましょう)。これは、私が理解しているソルトへの本当の鍵です。なぜなら、すべてのアカウントを解読するには、いわばそれぞれのアカウントを再発明する必要があるからです。正しいソルトをパスワードに適用してハッシュを生成する方法を知っていれば、ソルトは実際にはハッシュされたフレーズの長さ/複雑さを拡張するだけなので、それを行います。したがって、ソルトが何であるかを知っているため、パスワード + ソルトを 13^26 から 8^26 に「知る」ために生成する必要がある可能な組み合わせの数を削減します。これで簡単になりましたが、それでも本当に難しいです。
それでは、ソルトの暗号化について説明します。ソルトが暗号化されていることがわかっている場合は、最初にそれを復号化しようとはしません (十分なレベルの暗号化があることがわかっている場合)。私はそれを無視します。それを解読する方法を見つけようとする代わりに、前の例に戻って、13^26 のすべてのキーを含むより大きなレインボー テーブルを生成します。ソルトを知らないと間違いなく遅くなりますが、最初にソルト暗号を解読しようとするという記念碑的なタスクが追加されるとは思いません. だからこそ、もったいないと思います。考え?
ブルート フォース攻撃に対してパスワードが保持される期間を説明するリンクは次のとおりです: http://www.lockdown.co.uk/?pg=combi