Linuxでは、/ etc/shadowsファイルのパスワードハッシュのすぐ隣にソルトがあります。
ソルト値はハッシュされたパスワードがブルートフォースメソッドによってクラックされるのを防ぐといつも聞いています。しかし、何らかの形でシャドウファイルを取得した場合、アルゴリズムにソルトを注入し、それでもブルートフォースメソッドを使用できます。
費やす時間は考慮していません。一般的な考えだけです。 SHA256ハッシュまたはSHA512ハッシュをブルートフォースで強制すると、永遠にかかることを知っています。
パスワードをソルトでハッシュすると、攻撃者が事前に計算されたハッシュのリスト(別名Rainbowテーブル)を使用して、発見されたハッシュを実行することがはるかに困難になります。
それは彼がクラックしたい塩味のパスワードハッシュのハッシュを再度計算することを強制します。
塩は秘密である必要はありません。ただし、パスワードごとに一意である必要があります。これを考慮してください。すべてのパスワードが同じソルトでハッシュされている場合、データベースに「のみ」アクセスできる攻撃者は、可能な各pwd値に対してH(pwd + salt)を計算する必要があり、すべてのパスワードを取得します。しかし、ソルトが一意である場合、同じ操作で彼が試したソルトに関連付けられている1つのパスワードしか取得できません。
Saltはnotを実行し、あなたが正しく指摘したように、単一のパスワードの総当たり攻撃を困難にします。
ソルトがなければ、攻撃者は1つのレインボーテーブルを作成でき、すべてのパスワードを一度に取得できます。ソルトを使用すると、攻撃者はこのソルト用のレインボーテーブルを作成する必要があるため、既存のレインボーテーブルを再利用することはできません。パスワードごとに異なる一意のソルトを使用する場合、攻撃者はパスワードごとにレインボーテーブルを作成する必要があります。これは意味がありません。一致を見つけた後、このレインボーテーブルを終了する利点はありません。ブルートフォースの方が安価です。
パスワードごとに一意のソルトを使用すると、事前に計算されたレインボーテーブルを使用して一度に複数のパスワードを取得することはできません。
これは、なぜ塩が秘密である必要がないのかという質問にも答えます。 SHA- *のようなアルゴリズムはnotであり、パスワードのハッシュが速すぎるため、ブルートフォースを簡単に実行できるため、ハッシュパスワードに適しています。それらをPBKDF2と一緒に使用するか、コスト要素を提供するBcrypt/Scryptを使用します。
あなたが正しい。ソルティングは、重要なパスワードのパスワードハッキングを実際に困難にしますが、一部のユーザーが一般的なパスワードを使用している場合でも、ブルートフォースで数千回パスワードをハッキングできます。
ソルトがあなたの場合のように一緒に公開/保存されている場合は、事前に計算されたパスワードハッシュの参照(つまり、レインボーテーブル)を防ぐために使用されます。
したがって、Webアプリケーションの同様のアルゴリズムの場合、ソルトアルゴリズムによるハッシュの前に、ユーザー固有のパスワードに一定のアプリケーション固有の秘密鍵を付加することをお勧めします。もちろん、アプリの秘密鍵が漏洩した場合、このセキュリティ強化は失われます。したがって、私はその秘密鍵をコードに格納して、パスワードハッシュデータベースから分離します。 (これはLinuxシャドウファイルでは達成できません)
補足:余分な「秘密鍵」(またはペッパー)を追加する主なポイントは、単純なパスワードのハッシュでさえ、数千回の強引でクラックすることはできない(同じくらい難しい)ハッカーがパスワードハッシュしか知らないにもかかわらず、コードで秘密鍵を見ることができない場合、ブルートフォースにとって複雑なパスワードとして)。 (その間、オンラインWebサイトのパスワードのブルートフォース攻撃は防げず、オフラインでハッシュ自体をクラックする試みだけを防いでいます)
塩がスマートな方法で作成されている場合、辞書攻撃がはるかに困難になります。たとえば、bcryptは 128ビットソルト を使用します。
通常、塩はランダムに生成されます。それがパスワードまたはパスワードハッシュからのみ導出された場合、実際にはそれほどセキュリティは追加されません。攻撃者が予測できない方法で生成された場合、検索スペースが大幅に増加するため、ブルートフォース攻撃にはさらにブルートフォースが必要になります。
総当たり攻撃であっても、攻撃者は予測可能なパスワード(「pa $$ w0rd」など)を最初に試します。予測できない128ビットのソルトを想定すると、攻撃者は「pa $$ w0rd」+ saltのハッシュをクラックするために、最大2 ^ 128の可能性を試す必要があります。平均すると、攻撃者が成功する前の2 ^ 128の可能性の半分になりますが、これはさらに2 ^ 127の可能性です。