実際には、はい、ファイルが攻撃者またはその他の悪意のあるエンティティによって作成されていない限り、同一の暗号化ハッシュはファイルが同じであることを意味します。適切に設計された暗号化ハッシュ関数とのランダムな衝突の可能性は非常に小さいため、実際の攻撃者やアクティブな攻撃者がいない場合は無視できます。
ただし、一般的にいや、同じハッシュを持つ2つの任意のファイルが確実に同一であることを示すことはできません。
暗号化ハッシュ関数が機能する方法は、任意の長さの入力を取得し、入力から計算された固定長の値を出力することです。一部のハッシュ関数には複数の出力長がありますが、出力はある程度固定長の値のままです。この値は最大数十バイトの長さになります。現在一般的に使用されている最長の出力値を持つハッシュアルゴリズムは512ビットの出力を持ち、512ビットの出力は64バイトです。
ハッシュ関数への入力がハッシュ関数の出力よりも長い場合、入力を出力に適合させるためにある程度の忠実度を削除する必要があります。したがって、同じ出力を生成する出力の長さよりも長い長さの入力が複数存在する必要があります。
現在の主力製品であるSHA-256を例に取りましょう。256ビットのハッシュ、つまり32バイトを出力します。それぞれ正確に32バイト長であるが異なる2つのファイルがある場合、これらはファイルの内容に関係なく、異なる値にハッシュする必要があります(アルゴリズムに欠陥がないと仮定)。数学的には、ハッシュは、2 256の入力スペースを2 256の出力スペースにマッピングする関数であり、衝突なしで実行できるはずです。あなたは各33バイトの長さである2つのファイルを持っている場合は、そこに存在しなければならないいくつかの私たちは今、2マッピングしているので、両方のファイルに同じ32バイトの出力ハッシュ値を与える入力の組み合わせを264 2に入力空間を256出力スペース。ここでは、すべての出力に対して平均で2 8個の入力が存在するはずであることがすぐにわかります。これをさらに進めてください。64バイトのファイルでは、出力ごとに2 256個の入力が存在するはずです。
暗号化ハッシュ関数は、特定の出力を提供する入力を構成したり、同じ出力を提供する2つの入力を構成することが計算上困難になるように設計されています。これは、プリイメージ攻撃耐性または衝突攻撃耐性として知られています。これらの衝突を見つけることは不可能ではありません。本当に、本当に、本当に、本当に難しいことを意図しているだけです。(衝突攻撃の特殊なケースの少しは誕生日攻撃です。)
一部のアルゴリズムは、攻撃者に対する抵抗力が他のアルゴリズムより優れています。MD5は一般的に最近完全に壊れていると考えられていますが、最後に私が見た、それはまだかなり良い最初のプレイメージ耐性を示していました。SHA-1も同様に事実上壊れています。プリイメージ攻撃は実証されていますが、特定の条件を必要としますが、それが無期限に当てはまると信じる理由はありません。sayingにもあるように、攻撃は常に良くなり、悪化することはありません。SHA-256 / 384/512は、現在でもほとんどの目的で安全であると考えられています。ただし、悪意なく作成された 2つの有効なファイルは同じであり、入力スペースは既に十分に制約されているため、これらのいずれかで十分なはずです。これは、ランダムコリジョンにほとんど関心があるからです。ファイルが悪意を持って作成されたと思われる理由がある場合は、少なくとも安全であると現在考えられている暗号化ハッシュ関数を使用する必要があります。
最初のプレイメージは、特定の出力ハッシュ値を生成する入力を見つけることです。2番目のプリイメージは、指定された別の入力と同じ出力を与える1つの入力を見つけることです。衝突とは、それが何であるか、時には入力が何であるかに関係なく、同じ出力を生成する2つの入力を見つけることです。
とはいえ、ファイルのデータ表現は非常に異なっていても、まったく同じように表示される可能性があることに注意してください。そのため、暗号化ハッシュが一致しない場合でも同じように見えますが、ハッシュが一致する場合、同じように見える可能性が非常に高くなります。
cmp
、Unixまたはfc
Windows(ファイル比較)と簡単に比較できます。