このサイトやその他のサイトで、セキュリティやハッシュ関数に関する質問をたくさん読んでいます。私は専門家ではありません。好奇心旺盛で、パスワードをハッシュするために使用される反復が多いほど、1つの出力が1つの入力と等しくなるはずです(壊れた関数とのモジュロ衝突)。この点で、反復数が異なる場合、出力は同じにはなりません。
しかし、私が得られないのは、プレーンを見つけようとするハッカーが、使用された反復の数をどのように知っているかです。彼はそれを知っている必要があるか、何かを逃したのですか?
多くの場合、ラウンド数はパスワードとハッシュとともに保存されます。たとえば、bcryptを使用します。
$2a$10$oEuthjiY8HJp/NaBCJg.bu76Nt4eY4jG/S3sChJhZjqsCvhRXGztm
10はワークファクターを示し、ハッシュ時間の観点から10ビットのエントロピーをブルートフォースに効果的に追加します。 2^10 = 1024 rounds
。
ムーアの法則 のために作業係数を上げる必要がある場合は、ハッシュとともに保存されます。
システムにすべてのアカウントで同じ秘密の作業要素がある場合、これはペッパーのように追加のセキュリティ対策として使用できます。実際、攻撃者が独自のパスワードを設定してハッシュを表示できる場合、ペッパーと組み合わせる必要があります。そうでない場合、結果のハッシュを表示して、プレイ中の反復数を判別できます。ただし、各パスワードにどの反復構成バージョンが使用されたかを示すインジケーターを代わりに保存する必要があるため、個別のパスワードを使用して保存する場合よりも、将来これを行うのはより複雑です。ただし、ハッシュとともに格納された値に追加される秘密の作業要素を持つことができます。
Veracryptは最近、PIM(Personal Iteration Multiplier)機能 を追加しました。これは、暗号化されたデータを保護するための追加の秘密として使用できます。
ハッカーはパスワードがハッシュされた回数をどのように知るのですか? あなたがするのと同じ方法です。
パスワードをハッシュ化する目的は、パスワードを特定することを不可能にすることです(実際には非常に困難です)すべてのデータへのフルアクセスがあっても。
ハッシュのもう1つの要件は、サーバーが、入力されたパスワードが正しいかどうかを判別できる必要があることです。つまり、ログインプロセス中のある時点で、サーバーはパスワードをハッシュするための完全な式にアクセスできる必要があります。
ハッシュの数を変化させる目的は、主にブルートフォース攻撃を遅くし、レインボーテーブルの検索スペースを増やすことです。これは機密性なしで機能します。これが、SilverlightFoxの回答のように、通常、ラウンド数がハッシュとともにデータベースに直接格納される理由です。
ラウンド数を個別に保存し、それを秘密にしようとするソリューションがあり、それにより保護の層が追加される場合があります。しかし、ハッシュシステムを評価するとき、私たちは攻撃者は私たちが知っているすべてを知っているであると仮定する必要があります。
結局のところ、危険にさらされないことが保証されたラウンド数を格納する場所があった場合、パスワードをそこに格納するだけで、ハッシュをまったく気にする必要はありません。
反復回数とソルトは、同じデータベース、通常はパスワードハッシュ自体と同じフィールドに格納されます。なぜなら、サイトは潜在的な攻撃者と同じくらいこれらのことを知る必要があり、そのためそれらは簡単に利用できる必要があるからです。たとえば、 bcrypt ハッシュされたパスワードには、残りのハッシュから$記号で区切られた反復数(のログベース2)が含まれます。
現在受け入れられている答えは正しく、反復数は通常、ハッシュ自体がそうでない場合でも、ハッシュ自体の場所に格納されます。
Kerckhoffの原則 により、攻撃者が発見できると想定する必要があります。実際には、たとえば、既知のパスワードを使用して独自のログインを作成したり、ログイン試行のタイミングを設定したりすることで、それらを見つけることができます。
反復回数が不明な場合でも、少なくとも PBKDF2 などの一般的なパスワードハッシュ関数を使用すると、攻撃者がすべてを確認するのに必要な時間に一定の要素が追加されるだけです。 1回の反復で、999反復ハッシュから1000反復ハッシュを導出します。攻撃者は中間値をパスワードハッシュと比較するだけで済みます。