web-dev-qa-db-ja.com

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

私は2つのExcelドキュメントを持っています、そして、それらがファイル名を除いて、それらが全く同じであるかどうかチェックしたいです。

たとえば、ファイルはfileone.xlsおよびfiletwo.xlsと呼ばれます。ファイル名を除いて、それらの内容は同一であると推定されますが、これは私がチェックしたいものです。

私はこれをレビューするためのプラグインの束をインストールせずに方法を探しています。簡単な方法はありません。

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

57
sam

ハッシュが同一の場合、これはファイルの内容が1:1と同じということですか?

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

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

たった2つのハッシュが偶然衝突する確率は1/2128 どれが340のうち1である282兆366ノニオン920オクテリオン938セクシリオン463キンギリオン374クアドリリオン607兆4310億768百万211000 456。( StackOverflow 。)

ハッシュは「一方向のみ」で動作するように意図されています - すなわち、あなたはバイトのコレクションを取ってハッシュを得るが、あなたはハッシュを取ってバイトのコレクションを取り戻すことはできません。

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

2005年頃、方法が発見されました。 mD5ハッシュを取り、そのハッシュに一致するデータを作成します。 同じMD5ハッシュ( collision attack )を持つ2つの文書を作成します。 下記の@ user2357112のコメントを参照してください。 これは、攻撃者が同じMD5を持つ2つの実行可能ファイルを作成できることを意味します。だまされますよ。

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

あなたがあなた自身のものを生成するならば、あなたはあなたが自分自身にとって悪意がないということを知っています(うまくいけば)。それであなたの使用のために、それは大丈夫です、しかし、もしあなたが誰かがそれを再生できるようにしたい、そしてあなたが公にMD5ハッシュを公表したいのであれば、より良いハッシュを使うべきです。


2つのExcelファイルの同じ行と列に同じ値を含めることは可能ですが、フォーマット、スタイル、設定などが異なるため、ファイルのバイトストリームが完全に異なる可能性があります。

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

93
LawrenceC

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

一般的には、しかし、いいえ、 同じハッシュを持つ2つの任意のファイルが間違いなくそれらが同一であることを意味するとは言えません。

暗号化ハッシュ関数が機能する方法は、任意の長さの入力を受け取り、その入力から計算された固定長の値を出力することです。ハッシュ関数の中には、選択できる出力長が複数あるものもありますが、それでも出力はある程度固定長の値になります。この値は最大数十バイトの長さになります。今日一般的に使用されている最も長い出力値を持つハッシュアルゴリズムは、512ビットの出力を持ち、512ビットの出力は64バイトです。

ハッシュ関数への入力がハッシュ関数の出力より長い場合、入力が出力に収まるようにある程度の忠実度を削除する必要があります。その結果、 出力の長さより大きい長さの複数の入力が存在しなければならず、それらが同じ出力を生成します。

例として、現在の主力製品であるSHA-256を取り上げましょう。 256ビット、つまり32バイトのハッシュを出力します。それぞれ正確に32バイトの長さであるが異なる2つのファイルがある場合は、ファイルの内容に関係なく、これらは(アルゴリズムに問題がないと仮定して)異なる値にハッシュする必要があります。数学的には、ハッシュは2を写像する関数です。256 2への入力スペース256 出力スペース。これは衝突なしに実行できるはずです。しかし、それぞれが33バイトの長さの2つのファイルがある場合、両方のファイルに同じ32バイトの出力ハッシュ値を与える何らかの入力の組み合わせが存在する必要があります。 2をマッピング264 2への入力スペース256 出力スペースここでは、平均して2つ存在するはずであることがすぐにわかります28 単一の出力ごとに入力します。これをさらに進めば、64バイトのファイルでは2つ存在するはずです。256 一つ一つの出力に入力!

暗号化ハッシュ関数は、特定の出力を与える入力を構成すること、または同じ出力を与える2つの入力を構成することが計算上困難になるように設計されています。これは、プリイメージ攻撃 耐性またはとして知られています。衝突攻撃 耐性。これらの衝突を見つけるのは不可能ではありません。それは本当に、本当に、本当に、本当に難しいことを意図しています。 (衝突攻撃のちょっとした特殊なケースは、 誕生日攻撃 です。)

いくつかのアルゴリズムは他のものよりも攻撃者に抵抗する点で優れています。最近ではMD5は完全に壊れていると考えられていますが、最後に見たところ、まだかなり良い最初のプリイメージ耐性を示していました。 SHA-1も同様に事実上壊れています。プリイメージ攻撃は実証されていますが、特定の条件を必要としますが、それがいつまでもそうなると信じる理由はありません。その言葉が示すように、攻撃は常に良くなり、悪くなることはありません。 SHA-256/384/512は現在でもほとんどの目的で安全だと考えられています。 ただし、、2つの不正ではない有効なファイルが同じであるかどうかを確認するだけの場合は、これらのどれでも構いません。入力空間はすでに十分に制約されているので、ランダム衝突に主に関心があるはずです。ファイルが悪意を持って作成されたと信じる理由がある場合は、少なくとも安全と考えられている暗号ハッシュ関数を少なくとも使用する必要があります。

最初のプリイメージは、特定の出力ハッシュ値をもたらす入力を見つけることです。 2番目のプリイメージは、他の指定された入力と同じ出力を与える1つの入力を見つけることです。 衝突は、それが何であるかにかかわらず、時には入力が何であるかに関係なく、同じ出力を生成する2つの入力を見つけることです。

すべてのことを言って、それは心に留めておくことが重要です /ファイルは非常に異なるデータ表現を持ち、それでも全く同じように表示されるかもしれないこと。そのため、それらの暗号化ハッシュが一致しなくても同じであるように見えますが、ハッシュが一致すれば非常に可能性が高い同じ。

37
a CVn

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

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

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

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

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

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

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

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


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

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

10
Attie

簡単な答え:A 暗号化ハッシュ は、一致するハッシュを持つファイルが信頼できると確信できるようにするためのものです。同じ。意図的に作られていない限り、2つのわずかに異なるファイルが似たようなハッシュ値を持つ可能性は途方もなく小さいです。しかし、意図的に改ざんされている可能性のあるファイルを比較して検証することになると、MD5は不適切な選択です。 (SHA3やBLAKE2のような他のハッシュ関数を使ってください。

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

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

それで、私は、MD5が良性のファイルを比較するために信頼性がある(そしてそれでもまだ)信頼性がある一方で、それを完全に使用することをやめなければならないと結論しました。 MD5ハッシュを使用してファイルを比較し始めると、ある日セキュリティの細字を忘れて、同じハッシュを持つように意図的に作成された2つのファイルを比較することになります。さらに、CPUと暗号化プロセッサがそれをサポートすることはほとんどありませんでした。

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

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

2つのファイルが同じMD5ハッシュを持ち、それらが両方とも特別に細工されていない場合、それらは同一です。同じMD5ハッシュを持つファイルを作成するのがどれほど難しいかはファイルフォーマットに依存します、私はそれがExcelファイルでどれほど簡単であるかわかりません。

ですから、自分だけのファイルがあり、それが横になっていて重複を見つけたいのであれば、MD5は安全です。片方のファイルを作成し、もう一方のファイルがOriginの疑わしいものである場合、MD5はまだ安全です(同じMD5チェックサムで異なるファイルを取得する唯一の方法は両方のファイルを作成することです)。あなたが信頼していない誰かがあなたにあなたに予算提案を送り、後で彼らが同じであると主張する別のファイルを送るなら、MD5は十分でないかもしれません。

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

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

あなたが利用可能なUnix/Linuxツールを持っているなら、あなたは2つのファイルを比較するためにcmpを使うことができます。同じマシン上の2つのファイルを比較するために、チェックサムは物事をより複雑にするだけです。

6
Gilles

MD5やSHAなどのハッシュは固定長で、300文字の英数字としましょう(実際にはそれより短く、すべての英数字を使用しないでください)。

ファイルは最大2GBの英数字で作られていると言えるでしょう。

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

また、shattered.ioで示されているように1 まったく異なるSHA-1ハッシュ値を持つ2つの異なるファイルshattered.io/static/shattered-1.pdfとshattered.io/static/shattered-2.pdfがあります。

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

5
styrofoam fly

私は2つのExcelドキュメントを持っています、そして、それらがファイル名を除いて、それらが全く同じであるかどうかチェックしたいです。

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

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

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

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

5
Andrew Henle

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

現代のハッシングスキームとの確率のバランスでは、それらは同じです。

4
mckenzm

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

3
David Rice

他の答えを付け加えると、 ここ は同じMD5ハッシュと異なる内容を持つファイルのカップルの多くの例です。

3

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

2つのファイルが同じかどうかを確認したい場合は、ファイルとハッシュが自分の管理下にあるかどうかによって大きく左右されます。

あなたがファイルから自分でハッシュを生成し、意図的に間違った結論に達することを試みる機会/スキル/動機を他に誰も持っていなかったと確信しているなら、ほとんどすべてのハッシュ - MD5やSHA1のような十分であることはほぼ確実です。しかし、何百万年もの間高速でファイルを生成することができ、実際には異なるが実際には異なる2つのファイルがstillになることはまずないでしょう。同じハッシュほぼ確実に安全です。

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

ファイルの1つ、または事前計算されたハッシュが誤った結論にあなたを欺くように操作または設計されている可能性があるシナリオにいる場合は、より強力な(壊れていない)ハッシュ、またはその他のセキュリティが必要です。たとえば、ファイルをダウンロードしてハッシュを調べてそれが有効かどうかをチェックすると、攻撃者は正しいハッシュを使用して不良ファイルを設計したり、Webサイトを攻撃して正しいハッシュを検索したりする可能性があります。 msgstr "(期待される)値です。これはより広いセキュリティ問題に帰着します。

2
Stilez

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

comp fileone.xls filetwo.xls
2
Chad

この答えは起こり得るまたは起こらないシナリオとあなたが適用できる推論の便利な地図であることを意図しています。ハッシュ関数がこのように機能する理由については、他の回答を参照してください。


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

          |    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つの推論:

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

ハッシュが同一の場合、これはファイルの内容が1:1と同じということですか?

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

1
user207421

あなたの目的のために、はい、同一のハッシュは同一のファイルを意味します。

他の答えが明らかにしているように、同じハッシュをもたらす2つの異なるファイルを構築することは可能であり、MD5はこの点に関して特に頑強ではありません。

したがって、多数のExcel文書を比較する予定がある場合、または比較を操作したいと思う場合は、より強力なハッシュアルゴリズムを使用してください。 SHA1はMD5より優れています。 SHA256はまた優れており、あなたの特定の用法に対する完全な信頼をあなたに与えるはずです。

0
jah