2

crackstation.net では、次のように述べられています。

パスワードを検証するには

  • データベースからユーザーのソルトとハッシュを取得します。
  • 指定されたパスワードの前にソルトを追加し、同じハッシュ関数を使用してハッシュします。
  • 指定されたパスワードのハッシュをデータベースのハッシュと比較します。一致する場合、パスワードは正しいです。そうでない場合、
    パスワードが正しくありません。

ただし、ページの下部にリストされているソースコードvalidate_passwordでは、関数がソルトをどのように考慮しているかわかりません。つまり、指定されたパスワードの前にソルトが追加されているのはどこですか?

問題の関数は次のとおりです。

function validate_password($password, $correct_hash)
{
    $params = explode(":", $correct_hash);
    if(count($params) < HASH_SECTIONS)
       return false;
    $pbkdf2 = base64_decode($params[HASH_PBKDF2_INDEX]);
    return slow_equals(
        $pbkdf2,
        pbkdf2(
            $params[HASH_ALGORITHM_INDEX],
            $password,
            $params[HASH_SALT_INDEX],
            (int)$params[HASH_ITERATION_INDEX],
            strlen($pbkdf2),
            true
        )
    );
}
4

3 に答える 3

3

ソルト、ハッシュ、および反復番号は同じ文字列に格納され、関数の先頭で (配列内の) 3 つの文字列に分割されているように見えます。

$params = explode(":", $correct_hash);

値の順序は、定数 HASH_ALGORITHM_INDEX、HASH_SALT_INDEX、および HASH_ITERATION_INDEX の定義方法によって異なります。

于 2013-08-26T21:28:38.300 に答える
-4

上記で何が起こっているのか完全にはわからないので、ハッシュについて少し説明させてください。これは以前に行われたことがあり、ソースもありますが、とにかく試してみます! それは私たちにとって初めてのことでした!

関数があり、それを呼び出してf、それをハッシュ関数にすると、すべての可能な入力が有限数の出力に取り込まれます。これが、元に戻すことができない理由です。これは全射関数と呼ばれますhttp://en .wikipedia.org/wiki/Surjection詳しくはこちらをご覧ください。x が何であるかを実際に知らない場合のように (ただし、x が 2 または -2 のいずれかである可能性があることはたまたま知っています) f(x)=x^2f(x)=4

ただし、ハッシュの順序は異なります。これは、有限数の出力に対する入力が無限にあるためです (理論的には、コンピューターはすべての文字列のセットの中で最も長いものを処理できず、大きすぎます!)。

ピン番号だとわかっている場合、ピン番号がPI knowf(P)=hで、P が 0000 から 9999 までの 10,000 個の値の 1 であるとします。したがって、10,000 ハッシュ (最悪の場合) を実行してピンを取得できます。

ソルトは決定論的に入力に適用されるランダムながらくたなので、s(x)ソルト x を想定すると、入力の各文字の間に文字「k」を入れることで可能です (ただし、これはがらくたソルトになります) s。に依存しx、同じ入力が与えられれば同じ出力が得られます。

次にf(s(x))、ハッシュを取得する必要があります。この方法で、私がハッシュを知っているが、ソルトを知らない場合、最初にどのようにソルトを適用したかを解決する必要があります。あなたはそれを適用しました、など。

上記の単純なソルトをパスワードに適用したと仮定すると、共通の「パスワード」は「pkakskskwkokrkd」になり、「レインボー テーブル」(入力とそのハッシュ値のリスト) ができましたが、おそらく (ソルトされた形式) はありません。そのテーブルでは、しかし、ハッシュを知っていて、文字の間に ks を入れたと仮定すると、単語を使用して虹のテーブルを再作成する必要がありますが、それらには ks が含まれており、多くのメモリが必要です。時間.....しかし、その後、すべてのパスワードを破ることができます(ソルトはすべて同じだったため)

これは、あなたのシステムが「ユーザーソルト」によって意味するものです。そのように、システムを ks で壊した場合、1 人の人だけがクラックされた場合、全員に対してそれを行う必要があります。

それでは、いくつかの PHP コードを見てみましょう。

sha512 ソルトを使用することをお勧めします。これにより、任意の入力に対して固定の 128 文字の長さ (PHP であり、データベースになります) の出力が得られます。

$hash = hash("sha512",$data);

それをソルトするには、それを数回ハッシュすることができます。与えられた入力に対して同じ「決定論的」である限り、間に ak を入れることができます。

最後に、それがどのように機能するか:

銀行が私のPIN番号のソルトハッシュを持っている場合、彼らはそれを「壊す」ことはしません。入力した番号と比較するために私のPIN番号を取得するために、彼らは私が入力したPIN番号をソルトしてハッシュし、比較します値とデータベース内の結果が同じである場合、ハッシュが同じ場合、入力されたピンは同じです。

ハッシュは衝突する可能性がありますが、これは非常にまれです。「雪崩効果」が研究され、ハッシュアルゴリズムに存在することが確認されました (用語?)。同様の入力が大幅に異なる出力を与えます。

ハッシュは等値テストにのみ適しています。

于 2013-08-26T21:37:29.807 に答える