パスワードのハッシュとクラッキングを調査しましたが、いくつか誤解があります。
強力なパスワードを作成するための最初の経験則は、総当たり攻撃を防ぐために、数字/上/下/記号の10以上の組み合わせを使用することです。次に、問題は、パスワードが事前に作成されたテーブルのメンバーである場合のみです(パスワードが長いか短いか)。
パスワードがQWERTYであるとし、次のように仮定します。
_Hash(QWERTY) = $$$$
_
User1:Hash(QWERTY+134565654) = ####
ユーザー2:Hash(QWERTY+876964786) = &&&
そして、塩がどのように役立つかを考えてみましょう:
ブルートフォースの場合:
無塩の$$$$は力ずくで簡単です
ソルトされたもの####と&&&は長いため、ブルートフォースが困難であり、ブルートフォースで攻撃されたとしても、ハッカーはソルトを使用しないとパスワードを知りません。
レインボーテーブルの場合:
無塩のものは、$$$$のレインボーテーブルで簡単に見ることができます
####のレインボーテーブルを探すときの2つ目は何も見つかりません
ハッカーがデータベースを壊したときにハッカーがソルトを持っている場合:ハッカーは####を持ち、134565654を持っていますハッカーは、既知のすべてのパスワードに新しいレインボーテーブルを追加する必要があります。 ####がQWERTY + 134565654と一致し、パスワードを知っていることがわかるまで、彼らに134565654
すべてのユーザーが独自のソルトを持っているため、134565654固有のレインボーテーブルを作成してUser1パスワードを解読しても、ハッカーはユーザー2に同じパスワードがあることを認識できません。そのため、ハッカーはこのユーザーに対して別の876964786固有のレインボーテーブルを実行する必要があります
1つのパスワードを解読するには時間がかかりますが、最新のGPUを使用して高速のRainbowテーブルを作成することはまだ可能ですか?
Bcryptの場合:
前の例(ソルトが別の列に格納される場合など)とは異なり、bcryptはラウンドを通じてソルトを計算するため(たとえば10)、データベースに格納する前と検証する前に、低速のbcryptハッシュアルゴリズムをパスワードに対して10回実行します。ユーザーログイン。
Bcryptアルゴリズムが知られているので、ハッカーはラウンドごとにbcryptレインボーテーブルを作成しないのはなぜですか?したがって、このようにして、一般的なパスワードと短いパスワードの31個のbcrypt Rainbowテーブルを作成しますか?
私が言っていることが真実なら、これはソルトがソルト値が公開されていないブルートフォースに対してのみ役立つことを意味しますが、ソルト値を持つ強力なGPUに対しては実際には役立ちませんか?
ソルトされたもの####と&&&は長いため、ブルートフォースが困難であり、ブルートフォースで攻撃されたとしても、ハッカーはソルトを使用しないとパスワードを知りません。
総当たり攻撃は一般的にオフライン攻撃です。オンライン攻撃の場合、パスワード検証にかかる時間は一般的に長すぎます。さらに、多数の推測(最大再試行回数、意図的な遅延)を許可しないための対策を講じる必要があります。
オフライン攻撃は通常、ハッシュおよびソルトを介して行われます。なぜなら、それらは一緒にデータベースに格納されるためです。
塩の余分なサイズ(通常は単純な連結とは異なる方法で混合されます)は、ハードルのように見られるべきではありません。
無塩のものは、$$$$のレインボーテーブルで簡単に見ることができます
まあ、パスワードが本当に強力な場合は、Rainbowテーブルにパスワードが含まれていない可能性があるため、失敗する可能性があります。
####のレインボーテーブルを探すときの2つ目は何も見つかりません
実際、特定のハッシュのRainbowテーブルがない場合はそうではありません。
1つのパスワードを解読するには時間がかかりますが、最新のGPUを使用して高速のRainbowテーブルを作成することはまだ可能ですか?
ここで要点を逃しています。レインボーテーブルは、レインボーテーブルに対して複数のパスワードを照合する場合に役立ちます。レインボーテーブルは、1つのパスワードだけをチェックしても意味がありません。ソルトが一意である場合(たとえば、128ビットのランダムソルトを使用する場合)、レインボーテーブルは使用できません。
レインボーテーブルを使用すると、ハッシュ->パスワードテーブルを効率的に格納できます。攻撃者は、各パスワードを個別にハッシュしてハッシュを作成する必要があります。
Bcryptアルゴリズムが知られているので、ハッカーはラウンドごとにbcryptレインボーテーブルを作成しないのはなぜですか?したがって、このようにして、一般的なパスワードと短いパスワードの31個のbcrypt Rainbowテーブルを作成しますか?
Rainbowテーブルでパスワードを見つけるための入力は、ハッシュ出力です。最後のラウンドの前のラウンドの中間ハッシュ出力は保存されません。それで、それらを使用してパスワードをどのように検索しますか?
私が言っていることが真実なら、これはソルトがソルト値が公開されていないブルートフォースに対してのみ役立つことを意味しますが、ソルト値を持つ強力なGPUに対しては実際には役立ちませんか?
いいえ、ソルトはブルートフォースには役立ちませんが、レインボーテーブルには役立ちます。
シークレットを塩の一部として使用する場合、ペッパーと呼ばれます。コショウは対称キーとして機能できます。コショウに十分なエントロピーが含まれている限り、パスワードが特定のハッシュを作成するかどうかを確認する方法はありません。安全な乱数ジェネレータによって生成された128ビット/ 16バイトのペッパーには、十分なエントロピーが含まれている必要があります。
誤解は、レインボーテーブルの動作にあります。レインボーテーブルは、1つのパスワードをより速く解読できる最適化ではありません。これは、多くのパスワードをすばやく解読できる最適化ですが、莫大な初期費用がかかります。より正確には、レインボーテーブルは、この最適化を可能にするストレージ技術です。
ハッシュを知っている1つのパスワードを攻撃する方法:
レインボーテーブルを使用して多くのパスワードを攻撃する方法:
ステップ1のコストは、1つのパスワードに対する直接攻撃の最悪の場合のコストです。すべての計算を実行する必要があります。何を照合するかまだわからないため、試合の早い段階で停止することはできません。したがって、この方法は、多くのパスワードを攻撃している場合にのみ役立ち、ステップ1の1回限りの高コストは、ステップ2のパスワードあたりの低コストによって相殺されます。
ハッシュを計算するということは、パスワードとソルトがある場合はソルトを含め、すべての入力でハッシュ関数を実行することを意味します。直接攻撃の場合、ハッシュで与えられるため、ソルト値は1つだけです。レインボーテーブルベースの攻撃の場合、ステップ1では、すべての候補ソルトと組み合わせたすべての候補パスワードを考慮する必要があります。 64ビットのような比較的小さいソルトでも、ステップ1を実行不可能にするのに十分です。
GPUはパスワードクラッキングのゲームチェンジャーではありません。パスワードハッシュは、攻撃者が使用するハードウェアに関係なく、低速でソルト処理される必要があります。 GPUが重要なのは、最も効果的な速度を設計する方法です。
Rainbowテーブルがどのように機能するかについての高レベルな説明については、 Rainbowテーブルとは何で、どのように使用されているのですか? を参照してください。詳細な技術情報については、 レインボーテーブルを辞書攻撃にどのように使用できるか? を参照してください。
パスワードハッシュの高レベルな説明については、 パスワードを安全にハッシュする方法 を参照してください。 GPUの影響の詳細については、 セキュリティの専門家はパスワードの保存にbcryptを推奨していますか? を参照してください。