上記で何が起こっているのか完全にはわからないので、ハッシュについて少し説明させてください。これは以前に行われたことがあり、ソースもありますが、とにかく試してみます! それは私たちにとって初めてのことでした!
関数があり、それを呼び出してf
、それをハッシュ関数にすると、すべての可能な入力が有限数の出力に取り込まれます。これが、元に戻すことができない理由です。これは全射関数と呼ばれますhttp://en .wikipedia.org/wiki/Surjection詳しくはこちらをご覧ください。x が何であるかを実際に知らない場合のように (ただし、x が 2 または -2 のいずれかである可能性があることはたまたま知っています) f(x)=x^2
。f(x)=4
ただし、ハッシュの順序は異なります。これは、有限数の出力に対する入力が無限にあるためです (理論的には、コンピューターはすべての文字列のセットの中で最も長いものを処理できず、大きすぎます!)。
ピン番号だとわかっている場合、ピン番号がP
I 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番号をソルトしてハッシュし、比較します値とデータベース内の結果が同じである場合、ハッシュが同じ場合、入力されたピンは同じです。
ハッシュは衝突する可能性がありますが、これは非常にまれです。「雪崩効果」が研究され、ハッシュアルゴリズムに存在することが確認されました (用語?)。同様の入力が大幅に異なる出力を与えます。
ハッシュは等値テストにのみ適しています。