2つのファイルの暗号化ハッシュまたはチェックサムが同一であることは、それらが同一であることを意味しますか?


57

2つのExcelドキュメントがあり、ファイル名を除いて、それらがまったく同じかどうかを確認したい。

例えば、ファイルが呼び出されfileone.xlsfiletwo.xls。ファイル名を除いて、それらの内容は同一であると推定されますが、これは私が確認したいものです。

私はこれをレビューする方法を探していましたが、たくさんのプラグインをインストールすることはありませんでした。簡単な方法はありません。

両方のファイルに対してMD5ハッシュを生成しようとしました。ハッシュが同一の場合、これはファイルの内容が1:1であることを意味しますか?


8
暗号ハッシュと通常のハッシュは、異なるシステム上のファイルを比較したり、多数のファイルを検索したりするのに役立ちますが、2つのファイルが同じシステム上にある場合cmp、UnixまたはfcWindows(ファイル比較)と簡単に比較できます。
dave_thompson_085

10
shattered.io - SHA1はMD5、まだより「強い」ハッシュアルゴリズムでshattered.io/static/shattered-1.pdfshattered.io/static/shattered-2.pdfは完全に異なっている間、同じハッシュ値を持っているが。
発泡スチロールフライ

30
補足:最初にサイズを確認してください。サイズが異なる場合は、ファイルを開かないでください。サイズは異なります。
エミリオM Bumachar

42
単純化されたバージョン:MD5ハッシュは、事故を防ぐのに十分ですが、悪意を防ぐには十分ではありません。それがあなたにとって十分であるかどうか、あなたはあなたの状況に基づいて決定しなければなりません。
ユーロミチェリ

9
diff -s file1 file2それらが同一であると言う場合、それらは同一です(実際には、バイトごとにファイルを比較するので、ハッシュ衝突も除外されます)。チェックサムは、ハッシュが1つだけで、そのハッシュの発信元と同一であると考えられるアイテムがある場合に使用されます。
バクリウ

回答:


92

ハッシュが同一の場合、これはファイルの内容が1:1であることを意味しますか?

すべてのファイルはバイトのコレクションです(値0〜255)。2つのファイルMD5ハッシュが一致する場合、これらのバイトのコレクションは両方ともまったく同じ(同じ順序、同じ値)である可能性が非常に高くなります。

2つのファイルが同じMD5(128ビットハッシュ)を生成できる可能性は非常にわずかです。確率は次のとおりです。

誤って衝突しただけで2つのハッシュの確率は1/2である128 1 sextillion decillion 366 nonillion 920 octillion 938し463 undecillion 282 340で211000 456 463京374兆6070000000000004310億7.68億(上の答えからですStackOverflowの。)

ハッシュは「一方向のみ」で動作することを意味します。つまり、バイトのコレクションを取得してハッシュを取得しますが、ハッシュを取得してバイトのコレクションを取得することはできません。

暗号化はこれに依存します(これは、2つのものが何であるかを知らなくても比較できる1つの方法です)。

2005年頃、MD5ハッシュを取得し、そのハッシュに一致するデータを作成するメソッドが発見され、同じMD5ハッシュを持つ2つのドキュメントが作成されました(衝突攻撃)。 以下の@ user2357112のコメントを参照してください。これは、攻撃者が、たとえば同じMD5を持つ2つの実行可能ファイルを作成できることを意味します。MD5に依存してどちらを信頼するかを決定すると、だまされます。

したがって、MD5は暗号化やセキュリティに使用しないでください。たとえば、ダウンロードの整合性を確保するために、ダウンロードサイトでMD5を公開するのは悪いことです。MD5ハッシュによっては、ファイルまたはデータの内容を回避するために自分で生成したものではないことを確認しました。

独自に生成する場合、自分自身に悪意がないことを(できれば)知っています。したがって、使用するのは問題ありませんが、他の人にそれを再現してもらい、MD5ハッシュを公開する場合は、より良いハッシュを使用する必要があります。


2つのExcelファイルが同じ行と列に同じ値を含むことは可能ですが、フォーマット、スタイル、設定などが異なるためにファイルのバイトストリームが完全に異なる場合があることに注意してください。

ファイル内のデータを比較する場合は、最初に同じ行と列を使用してCSVにエクスポートし、すべてのフォーマットを削除してから、CSVをハッシュまたは比較します。


107
Excelファイルやその他のOfficeドキュメントも、最後に保存された日時の新しい値がファイル内のメタデータに保存されているため、何も変更せずに開かれて再保存されるため、異なるハッシュを持つことができます。
BeowulfNode42

29
ボーナス:CSVにエクスポートした場合diffは、単に同じハッシュを持つのではなく、由緒あるユーティリティまたは同様のユーティリティを使用して、ファイルがバイト単位で同一であることを実際に確認できます。
モンティハーダー

18
ハッシュを取得し、ハッシュに一致するデータを作成することは、プリイメージ攻撃です。MD5は現在、衝突攻撃に対して脆弱であると考えていますが、現在、プレイメージ攻撃またはセカンドプレイメージ攻撃は実行可能ではないと思います。
user2357112

2
@ティム何言ってる?彼は言った:それらをCSVにエクスポートしdiff -s、CSVが同一であるかどうかを確認するために使用する。実際diff -s、Excelファイルを使用することもできます。diffそれらが同一であると言えば、CSV比較に進む必要はありません。
バクリウ

2
@Bakuriu明らかに、私のコメントの文言は非常に不十分でした。CSVへのエクスポートでは、多くの情報が失われることを意味しました。特に式、チャート、条件付きおよび標準の書式設定です。
ティム

37

実際には、はい、ファイルが攻撃者またはその他の悪意のあるエンティティによって作成されていない限り、同一の暗号化ハッシュはファイルが同じであることを意味します。適切に設計された暗号化ハッシュ関数とのランダムな衝突の可能性は非常に小さいため、実際の攻撃者やアクティブな攻撃者がいない場合は無視できます。

ただし、一般的にいや、同じハッシュを持つ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つの入力を見つけることです。

とはいえ、ファイルのデータ表現は非常に異なっていても、まったく同じように表示される可能性があることに注意してください。そのため、暗号化ハッシュが一致しない場合でも同じように見えますが、ハッシュが一致する場合、同じように見える可能性非常に高くなります。


2
ハッシュが一致する場合、ファイルは意図的な衝突の結果であるか、そうでない場合は同じであることが保証されます。偶然の衝突の確率は純粋に理論的なものです。「ハッシュが一致する場合、それらは同じように見える可能性が非常に高い」と言うのは誤解を招きます。悪意があり、衝突状態にある場合、それらは同じではない可能性が高く、そうでなければ確率は事実上ゼロです防御が必要な低確率イベントはありません。
ジル「SO-悪であるのをやめる」

9
@Gilles:それどころか。マイケルの言葉遣いは正確であり、「保証」は誤解を招く(あるいは、事実、間違っている)。(悪意のある変更にもかかわらず)同一のハッシュを持つ2つのファイルが一致しない可能性は非常に低く、実際には無視できます。ただし、ゼロではありません。一般的に、何らかの理由で異なる入力同じハッシュ生成する可能性があり、おそらく2 ^ -128よりもはるかに高い可能性があります(暗号化アルゴリズムは黒人の芸術であり、アルゴリズムには微妙な未知の方法で欠陥があり、 100%確信できる方法はありません)。
デイモン

5
@Gilles " 実質的にゼロ "はまだゼロではありません。これは、2つの異なるデータセットが同じハッシュになる可能性が(確かに小さい)まだあることを意味します。それに反論することはできません。
Attie

5
@Attie:2つの無関係なファイルが同じ値にハッシュする確率は、他の多くの問題(ディスク上のファイルを破損するランダムビットエラーなど)の確率をはるかに下回っており、偶然の一致から保護する価値はありません。意図的に設計された試合から守ることは価値があるかもしれませんが、偶然の試合は非常にありえないので、それらを守るために費やされた努力はおそらく他の場所で費やすことができます。
supercat

3
@Gillesが間違っています。あなたが一言で言え、たとえどんなに小さく評価しても、偶然の衝突が起こり、その次の被授与者では衝突が起こらない可能性があることを教えてくれません。これは、完全に偽であることが既に知られているハッシュアルゴリズムのプロパティを暗示しているため、非常に誤解を招く恐れがあります。
iheanyi

10

それは確率ゲームです...ハッシュは有限数の値を表すことができます。

仮想の(そして非常に弱い)8ビットハッシュアルゴリズムを考えると、これは256の異なる値を表すことができます。アルゴリズムを介してファイルの実行を開始すると、ハッシュの取得が開始されますが、やがて「ハッシュ衝突」が表示され始めます。これは、2つの異なるファイルがアルゴリズムにフィードされ、出力と同じハッシュ値を生成しことを意味します。ここで明らかに、ハッシュは十分に強力ではなく、「一致するハッシュを持つファイルは同じコンテンツを持っている」と断言することはできません。

ハッシュのサイズを拡張し、より強力な暗号化ハッシュアルゴリズムを使用すると、衝突を大幅に減らすことができ、同じハッシュを持つ2つのファイルのコンテンツが同じであるという確信が高まります。

これは、100%の確実性に到達することは決してできないということです。同じハッシュを持つ2つのファイルが本当に同じコンテンツを持っていると確信することはできません。

ほとんど/多くの状況でこれは問題なく、ハッシュの比較は「十分」ですが、これは脅威モデルによって異なります。

最終的に、確実性レベルを上げる必要がある場合は、次のことをお勧めします。

  1. 強力なハッシュアルゴリズムを使用する(潜在的に悪意のあるユーザーから保護する必要がある場合、MD5はもはや適切とは見なされません)
  2. 複数のハッシュアルゴリズムを使用する
  3. ファイルのサイズを比較します-余分なデータポイントは潜在的な衝突を識別するのに役立ちますが、実証されたMD5衝突はデータの長さを変更する必要がないことに注意してください。

100%確信する必要がある場合は、必ずハッシュで開始しますが、ハッシュが一致する場合は、2つのファイルのバイトごとの比較でフォローアップします。


さらに、他の人が指摘したように、WordやExcelなどのアプリケーションで作成されるドキュメントの複雑さは、テキスト、数字、表示レイアウトは同じでも、ファイルに保存されるデータは異なる可能性があることを意味します。

Excelはこれが特に悪いです-スプレッドシートを開いて保存するだけで(何もしていません)、異なるコンテンツの新しいファイルを作成できます。


6
もはや適切で考えられているMD5は暗号的に非常に真であるが、(悪意、例えばあなたが入力をコントロールしている場合の不存在下で)一意性チェックのために、それは素晴らしく、高速です(128ビットが十分でなければなりません)
クリス・H

4
2つのファイルのバイトごとの比較を行います。」ファイル比較を行う場合は、最初にそれを行うこともできます。各ファイルをすべて読み取って計算することはできません。両方のファイルを再読み取りして比較するためだけにハッシュします!
トライプハウンド

3
@TripeHoundファイルが両方ともローカルであるかどうかによって異なります...すでに1つのハッシュがあり、新しいファイルをシステムに導入している場合、新しいファイルがデータベースに保存されたハッシュを必要とする場合など...状況に合った電話をかけてください。
Attie

5
いいえ、確率ゲームではありません。あなたは偶然の衝突がどれほどありそうもないかを推測しています。それは起こりません。比較中に少し反転する可能性が高くなります。一方、いくつかのシナリオでは、意図的な衝突が発生する可能性があり、それは確率ゲームではありません。
ジルは「悪であることを停止SO-」

3
@mbrig:32ビットハッシュには、偶発的な不一致の重大なリスクがあります。ただし、128ビットまたは256ビットにすると、大きな違いが生じます。128ビットの場合、それぞれが10億の適切なサイズの真にランダムなドキュメントを入力する10億匹の猿は、同じハッシュで2つのドキュメントを作成する可能性が約0.3%になります。256ビットを使用すると、数十億の猿が10億年間、毎秒10億の適切なサイズのランダムなドキュメントを入力できたとしても、これらの数十億のドキュメントのいずれかが一致するハッシュ値を持つ可能性は、非常に小さくなります。
supercat

6

2つのファイルが同じMD5ハッシュを持ち、両方が特別に細工されていない場合、それらは同一です。同じMD5ハッシュを使用してファイルを作成するのがどれだけ難しいかは、ファイル形式によって異なります。Excelファイルを使用するのがどれほど簡単かはわかりません。

したがって、自分のファイルが横になっていて重複を見つけたい場合、MD5は安全です。ファイルの1つを作成し、他のファイルが疑わしい起源である場合、MD5は依然として安全です(同じMD5チェックサムで異なるファイルを取得する唯一の方法は、両方のファイルを作成することです)。信頼できない人から予算の提案が送られ、後で同じファイルであると主張する別のファイルを送信した場合、MD5では不十分な場合があります。

リスクを回避するには、MD5の代わりにSHA-256またはSHA-512を使用します。2つのファイルが同じSHA-256ハッシュを持っている場合、それらは同一です。同じことがSHA-512にも当てはまります。(それらは異なる可能性があるという理論上の可能性がありますが、これが偶然に起こる可能性は、検証中にコンピューターが少しひっくり返る可能性よりもはるかに低いです。同じハッシュ、SHA-256またはSHA-512でこれを行う方法を誰も知りません。)

2つのExcelファイルのハッシュが異なる場合、それらは異なりますが、どれだけ異なるかを知る方法はありません。同一のデータでフォーマットが異なる場合や、プロパティが異なる場合や、異なるバージョンで保存されている場合があります。実際、ExcelがWordのようなものである場合、ファイルを保存するだけでメタデータが更新されます。数値データとテキストデータのみを比較し、書式設定とプロパティを無視する場合は、スプレッドシートをCSVにエクスポートして比較できます。

Unix / Linuxツールを使用できる場合cmpは、2つのファイルを比較するために使用できます。同じマシン上の2つのファイルを比較するために、チェックサムは物事をより複雑にするだけです。


2つのファイルが同じMD5ハッシュを持ち、両方が特別に細工されていない場合、それらは同一です。それは間違っています。考えられるメッセージは無限にありますが、考えられる64ビットハッシュは2 ^ 64だけです。これは「ピジョンホール原則」と呼ばれています。「ピジョンホール原則では、nアイテムをmコンテナに入れる場合n > m、少なくとも1つのコンテナに複数のアイテムが含まれている必要があります。」2 ^ 64を超えるメッセージを作成すると、「特別な作成」なしで衝突が発生します。そして、あなたたった2でいいかもしれません
アンドリューヘンレ

@ AndrewHenle、MD5は64ビットではなく、128です。偶発的な衝突を生成することで、熱死の宇宙のタイムスケールに到達した場合、それは非常に学術的な(したがって役に立たない)定義に対してのみ「可能」です。
チャールズダフィー

@CharlesDuffyあなたはハッシュがランダムに分布していると仮定しています。そうではありません。
アンドリューヘンレ

ランダムな配布と事実上同等であることは、優れた暗号化ハッシュを構成するものの定義の一部です-理由のために多くのラウンドがあります。確かに、弱いハッシュアルゴリズムはありますが、それらの弱点に焦点を当てることで、意図的な攻撃に関する前述の注意事項を理解できます。( -リンクしてください??それとも、それはもっともらしいですので、私は、私が追いついていないことを認めるよMD5だけ効果的にランダムである64ビットを有することが示されていることを言っている)
チャールズ・ダフィー

@AndrewHenle私は衝突が数学的に不可能であるとは述べていません。これは間違っていますが、ここでは関係ありません。私はそれが起こっていないと述べていますが、それは本当です。あなたのコメントは、取引を完全に変えるような形で間違っています。2 ^ 64ではなく、2 ^ 128の可能なMD5ハッシュがあります。これは、衝突を確実に生成するために2 ^ 128個のハッシュを生成する必要があることを意味します。実際、誕生日の逆説により、2 ^ 64は、生成されたハッシュが(以前に生成されたハッシュではなく)衝突するという巨視的なチャンスを与えます。しかし、衝突を作成する方法を知っているので、これは意味がありません。
ジル 'SO-悪であるのをやめる'

6

短い答え:暗号化ハッシュは、あなたが一致するハッシュを持つファイルが同じであることを合理的に確信する助けになっています。意図的に作成されていない限り、わずかに異なる2つのファイルが同様のハッシュ値を持つ可能性は途方もなく小さいです。しかし、故意に改ざんされる可能性のあるファイルの比較と検証に関しては、MD5は適切ではありません。(SHA3やBLAKE2などの別のハッシュ関数を使用します。)

長い答え:理想的なハッシュ関数は、すべての一意のデータに対してほぼ一意の暗号化ハッシュを作成する関数です。言い換えれば、このユニバースにはハッシュ値が衝突する2つのファイルがあり、これら2つのファイルが自然に結合する可能性は途方もなく小さいことを明確に知っています。

10年前、私はMD5からできるだけ遠くにいなければならないと決めました。(もちろん、昨日まで、そうすることの間違った理由を思い出しました; 10年は長い時間です、あなたはわかります。私は過去のメモを再訪して理由を思い出し、この答えを編集しました。)1996年に、MD5は衝突攻撃を受けやすい。9年後、研究者は同じハッシュでPostScriptドキュメントと(痛い!)X.509証明書のペアを作成することができました!MD5は明らかに壊れていました。(Megaupload.comもMD5を使用していましたが、ハッシュの衝突に多くのハンキーパンキーがあり、当時私にトラブルをもたらしました。)

したがって、MD5は良性のファイルを比較するのに信頼できる(そしてまだ信頼できる)のですが、MD5の使用を完全にやめる必要があると結論付けました。私はそれへの依存はinと偽りの自信に変わるリスクがあると推論しました:MD5ハッシュを使用してファイルを比較し始めると、ある日、セキュリティの細字を忘れて、同じハッシュを持つように意図的に作成された2つのファイルを比較します。さらに、CPUと暗号プロセッサがサポートを追加することはほとんどありませんでした。

ただし、元のポスターにはMD5を使用する理由がさらに少なくなっています。

  1. 2つのファイルのみを比較している限り、バイトごとの比較は、実際に自分のMD5ハッシュを生成するよりも高速です。3つ以上のファイルを比較するために...まあ、今、あなたは正当な原因を持っています。
  2. OPは、「プラグインをインストールせずにこれを確認する方法」を指定しました。Windows PowerShellのGet-FileHashコマンドは、SHA1、SHA256、SHA384、SHA512、およびMD5ハッシュを生成できます。SHAハッシュ関数のハードウェアサポートを備えた最新のコンピューターでは、SHAハッシュ関数の生成は高速です。

6
選択した任意の長さの独自の暗号化ハッシュ関数を作成できます。ただし、固定長であり、とにかく鳩の巣の原則が適用されます。一般的な答えは、「ハッシュのみを比較することで、2つのファイルが同一であることを確認することはできません」です。
カミルマシオロウスキ

2
@KamilMaciorowski理論的には、はい、できます。私のカスタムハッシュ関数は、最大のファイルのコピーを簡単に生成できます。しかし、これについてさらに議論することに興味はありません。真実は、あなたがより賢く、それがあなたに裏目に出たことを証明するためだけに盗み見することに等しい理由でダウン投票したということです。今、あなたは投票を取り戻すことはできません。

私は@KamilMaciorowskiに同意します...それは確率ゲームです...単一のハッシュを使用すると、一致するハッシュを持つファイルが同じであると「合理的に確信」できますが、100%の保証はありません。優れたアルゴリズムを使用するか、複数のアルゴリズムを使用すると、信頼性が向上します。ファイルサイズを比較することも役立ちますが、バイトごとにチェックしないと100%の自信が持てません。
Attie

1
@アティ・フー!それは私が元々意味していたことです。ありがとう。🙏「あなたはかなり自信がある」などのシックなフレーズに慣れていないのは私だけです。ごめんなさい。😜それでも、編集ボタンがあるのはそのためです。個人的には、その中の1つの単語が間違っているからといって、良い答えを捨てることはありません。編集します。

1
「良い答えを捨てる」ことについて:最初にそれがタイプミスではないことを確認したことに注意してください。その後、ダウン投票し、同時にフィードバックを行い、あなたの答えが良くなることを願って私の理由を明らかにしました。そうでしたので、私の下票はもうありません。基本的に私はあなたの答えが間違っていると思うことを話しました、Attieは明確にするのに役立ちました、あなたは答えを改善しました。私の観点からは、私たちは皆この状況を適切に処理し、ストーリー全体が非常にうまくいきました。ありがとうございました。
カミルマシオロウスキ

5

2つのExcelドキュメントがあり、ファイル名を除いて、それらがまったく同じかどうかを確認したい。

実際的な観点からは、ファイルを直接比較してファイルが異なるかどうかを確認する方が、各ファイルのハッシュを計算してからそのハッシュを比較するよりも高速です。

ハッシュを計算するには、両方のファイルの内容全体を読む必要があります。

直接比較してそれらが同一であるかどうかを判断するには、一致しないまで両方のファイルの内容を読むだけです。違いを見つけると、ファイルが同一ではないことがわかり、どちらのファイルからもデータを読み取る必要はありません。

そして、どちらかを行う前に、2つのファイルのサイズを単純に比較できます。サイズが異なる場合、内容を同じにすることはできません。


1つの物理ドライブで2つのファイルを使用する場合、各ファイルのI / O速度に個別に対応できるハッシュ関数を使用すると、2つのファイルの読み取りを切り替える必要がないため、ファイルを比較するよりもわずかに高速になる場合があります。しかし、場所のハッシュが本当に輝いているのは、大きすぎてメモリに収まらない多くのファイルを含む比較を試みるときです。ファイル1とファイル2、次にファイル1とファイル3、ファイル1とファイル4などを比較するだけで、すべてのハッシュを計算する場合の2倍の時間がかかることがあります。
-supercat

@supercatファイルが1 MB程度以上のチャンクで読み取られる場合、ファイル間の切り替えは目立たないでしょう。そして、ワークフローが多数のファイルを比較して重複を見つけることを伴う場合、ハッシュは各ファイルが書き込まれるのと同様に計算されるかもしれません-それを行うことはほとんど無料でできるからです。
アンドリューヘンレ

ファイルの大きなチャンクをバッファリングするのに十分なスペースがあれば、切り替え時間は問題になる必要はありませんが、そうでなければ問題になる可能性があります。ファイルが書き込まれたときのハッシュの計算に関しては、保存されたハッシュを変更したり、少なくとも無効にしないとファイルを変更できないことを保証できれば問題ありません。ファイルの冗長なバックアップを避けようとする場合、保存されたハッシュ値のみを見ると、誤って破損したファイルをバックアップできますが、破損ファイル一致するはずであるが一致しない破損ファイルをバックアップすることはありません
-supercat

「違いを見つけると、ファイルが同一ではないことがわかります」-必ずしもではありません。XLSXファイルはZIPファイルであり、潜在的に同じ順序で異なるコンテンツを保存できる可能性があります。ただし、それらを解凍して個々のファイルを比較した場合でも、XLSXファイルにはXML文書が含まれており、コンテンツに影響を与えることなく異なる行末などが含まれている場合があります。
トーマスウェラー

5

MD5やSHAなどのハッシュの長さは固定されており、300文字の英数字(実際にはより短く、英数字のセット全体を使用しない)であるとしましょう。

ファイルは最大2GBの英数字で構成されているとしましょう。

可能なハッシュ値よりもはるかに多くのファイル(最大2GBのサイズ)があることが簡単にわかります。鳩の巣の原則では、いくつかの(異なる)ファイルは同じハッシュ値を持たなければならないという。

また、shattered.io 1で示されているように、shattered.io / static / shattered-1.pdfとshattered.io/static/shattered-2.pdfの2つの異なるファイルを作成できます。全然違う。

1 SHA1は、md5よりも「強力な」ハッシュアルゴリズムです。


偶然の衝突の可能性は、考慮に入れるには低すぎます。意図的な衝突のリスクはMD5にも存在し、ここではあまり関係のないSHA-1よりも悪いです。
ジル「SO-悪であるのをやめる」

4

番号。異なる値は、ファイルが異なることを保証します。同じ値は、ファイルが同じであることを保証するものではありません。CRC16を使用して例を見つけるのは比較的簡単です。

確率と現代のハッシュスキームのバランスについては、同じです。


1
問題は、偶発的な衝突のリスクがないMD5についてです。意図的な衝突のリスクはありますが、それは確率の問題ではありません。
ジル 'SO-悪であるのをやめる'

1
また、異なる名前のExcelスプレッドシートについても説明します。バイト比較のバイトがオプションにならないほどの大きさはありますか。2つのハッシュスキームを組み合わせると確実になります。
mckenzm

2
@Gilles すべてのハッシュコードには、定義上、偶然の衝突のリスクがあります。その唯一の方法は、ファイル全体をハッシュコードとして使用することです。あなたのコメントは意味がありません。
user207421

3

あなたの質問は逆方向です-ハッシュは同じデータを持っていることを意味すると仮定しましょう(これは100%保証されていませんが、衝突を起こさないために毎秒ファイルを比較する寿命に十分です)。同じデータを持っていることは、同じハッシュを持っていることを意味するとは限りません。だから、何も-あなたはそこにあるため、ファイルをハッシュすることによって、ファイルをエクセル、別のデータをExcelファイル内のデータを比較することはできません多くの 2つのファイルが基になるデータが異なることなく、異なることができる方法のが。1つの明らかな方法-データはXMLとして保存され、各セルには独自のXMLノードがあります。これらのノードが異なる順序で保存されている場合、データは同じですが、ファイルは異なります。



2

このOPの答えは与えられましたが、要約から利益を得るかもしれません。

2つのファイルが同じであるかどうかを確認する場合、ファイルとハッシュが制御下にあるかどうかに大きく依存します。

ファイルからハッシュを自分で生成し、他の誰も意図的に間違った結論に到達しようとする機会/スキル/動機を持っていないと確信している場合、ほとんどすべてのハッシュ-MD5やSHA1のような「壊れた」ハッシュもほぼ確実に十分です。しかし、それは、私はあなたが何百万年もの間、高速でファイルを生成することができ、あなたがしたいわけまだ実際には異なるが、同じハッシュを持つ任意の二つのファイルで終わる可能性が低いこと。それはほぼ確実に安全です。

これは、PCまたはファイルサーバー上の2つのディレクトリが同じコンテンツを持っているかどうか、ディレクトリ内のファイルが完全に重複しているかどうかなどをすばやく確認したい場合に、あなたが持っているシナリオです。設計/不正に変更されており、ハッシュアプ​​リ/ユーティリティが正しい結果を出すことを信頼しています。

ファイルの1つ、または事前に計算されたハッシュが不正な結論にユーザーをだますために操作または設計されたシナリオにある場合、より強力な(壊れていない)ハッシュ、および/またはその他のセキュリティが必要です。たとえば、ファイルをダウンロードし、ハッシュを調べて有効かどうかを確認すると、攻撃者は正しいハッシュを使用して不正なファイルを設計したり、「正しい「(期待される)値。これは、より広範なセキュリティ問題に帰着します。


2

Windowsコマンドラインで、compユーティリティを使用して、2つのファイルがまったく同じかどうかを判断できます。例えば:

comp fileone.xls filetwo.xls

1

ハッシュが同一の場合、これはファイルの内容が1:1であることを意味しますか?

ハッシュがある場合は第異なる、それはない内容が異なっていることを意味します。等しいハッシュコードは、等しいコンテンツを意味しません。ハッシュコードは、定義により、大きなドメインをより小さな範囲に縮小することです。意味は、不均等なコンテンツに対するhascodesは等しくなる可能性があるということです。そうでなければ、それらを計算しても意味がありません。


そうでなければ、それらを計算しても意味がありません。 数学の法則を破り、ランダムなデータを圧縮できる無損失圧縮機能を考案し、鳩の巣の原則に違反した場合、それを使用することは非常に価値があります!128ビットのハッシュファイルのコンテンツ全体を一意に表す場合、非常に便利です。ハッシュをファイルに戻す解凍機能がなくても、数学的に不可能な衝突のないハッシュは、VMイメージなどの信頼できないデータの重複検出を高速化するのに便利です。
ピーター

「ハッシュが異なる場合、コンテンツが異なることを意味します。」必ずしも。XLSXファイルはZIPファイルであり、同じコンテンツを異なるファイル順序で保存することが可能です。
トーマスウェラー

1

この回答は、発生する可能性があるシナリオまたは発生しないシナリオ、および適用できる推論の便利なマップになることを意図しています。ハッシュ関数がこのように機能する理由については、他の回答を参照してください。


ハッシュ関数を選択してそれに固執した後、これらはすべて考慮すべき組み合わせです。

          |    identical   |   different    |
          |   hash values  |  hash values   |
----------+----------------+----------------+
identical |   can happen,  | cannot happen, |
  files   |     common     |   impossible   |
----------+----------------+----------------+
different |   can happen,  |   can happen,  |
  files   |      rare*     |     common     |
----------+----------------+----------------+

* rare, unless whoever generates (at least one of) the files
  purposely aims at this scenario

まったく同じファイルが異なるハッシュ値を生成するシナリオは、厳密に不可能な唯一のシナリオです。


常に適用される2つの推論:

  • ファイルが同一の場合、ハッシュ値は確実に同一です
  • ハッシュ値が異なる場合、ファイルは確かに異なります。

厳密ではない 2つの理由:

  • ファイルが異なる場合、ハッシュ値はおそらく異なるでしょう
  • ハッシュ値が同一の場合、ファイルはおそらく同一です。

0

はい、同じハッシュは同じファイルを意味します。

他の答えから明らかなように、同じハッシュを生成する2つの異なるファイルを作成することができ、この点でMD5は特に堅牢ではありません。

そのため、多数のExcelドキュメントを比較する予定がある場合、または誰かが比較を操作したいと思う場合は、より強力なハッシュアルゴリズムを使用します。SHA1はMD5よりも優れています。SHA256は再び優れており、特定の使用法について完全な信頼を得ることができます。


-1

ハッシュが同一であれば、ファイルはおそらく同一です。同じ方法で両方のファイルを変更し(たとえば、同じ未使用のセルに同じ値を入力する)、変更されたファイルのハッシュを比較することにより、信頼性を高めることができます。事前に知られていない方法で変更されたファイルに対して意図的な衝突を作成することは困難です。


これは、オフィスファイルに保存されている追加データのため機能しません。たとえば、保存する前に同じセルにカーソルを置いたり、正確な時間に保存したりする必要があります。しかし、それでも、XLSXファイルは内部的にzipファイルです。ファイルは同一ですが、ハッシュは同一ではありません
Thomas Weller

-2

これを実際的な方法で見てみましょう。「ハッシュは同一です」と言う代わりに、「2つのファイルのハッシュを計算し、同じかどうかを印刷するコンピュータープログラムを作成しました」と言い、2つのファイルでプログラムを実行します。 「同一」。それができる理由はいくつかあります:

ファイルは同一である場合があります。私のコードにはバグがあるかもしれません(実際に実際に起こったのはmemcmpではなくstrcmpと2つの長い(256バイト)ハッシュを比較することでした:各ハッシュの最初のバイトがゼロの場合、比較は「同じ」を返し、ハードウェア障害(宇宙線がメモリセルにヒットし、それを切り替える)がある場合や、同一のハッシュを持つ2つの異なるファイル(ハッシュ衝突)のまれなケースがある場合があります。

同一ではないファイルの場合、間違いなく最も可能性の高い原因はプログラマーのエラーであり、次にハッシュを「false」から「true」と比較した結果でブール変数を変更した宇宙線が来ます。ハッシュ衝突の偶然。

各ファイルをハッシュし、サーバーに既に保存されている同一のハッシュを持つファイルをチェックすることにより、10,000人のユーザーから同一のファイルをバックアップすることを回避するエンタープライズバックアップシステムがあります。そのため、衝突が発生した場合、ファイルはバックアップされず、データが失われる可能性があります。誰かが、チェックサムが別のファイルと一致したため、file石がサーバーにヒットし、ファイルを失うよりもすべてのバックアップを破壊する可能性がはるかに高いと計算しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.