質問のSHA-1ハッシュ衝突の部分については、いくつかの回答で対処されています。
ただし、この大部分は、作業しているファイルの種類に依存します。
ファイルの全体的なコンテンツと操作を維持します(ただし、もちろん、元々そこになかった悪意のあるコンテンツが含まれており、コンテンツが変更されています)
これが意味することは、変更を検出するものによって大きく異なります。
- (合理的な)チャンスではなく、署名された実行可能ファイルである場合、何らかの方法で2つのハッシュ衝突を取得する必要があります。ファイルのSHA-1と内部.exe署名です。
- 署名されていない実行可能ファイル、.com、署名されていない.dllなどの場合、それらのリソースフォークは操作を変更しない方法で追加できるため、(最終的に)「通常」では検出できないハッシュ衝突が発生する可能性があります操作。
- ソースコードファイルまたは類似の構造(.cs、.c、.h、.cpp、.rb、.yml、.config、.xml、.pl、.bat、.ini)の場合、追加、変更、または削除有効なコメント構文に制限して、変更をほとんどの用途で認識できないようにすることができます(テキストエディターで開くのではなく、コンパイルまたは実行します)。
- .isoまたは.zipまたはその他のコンテナ形式の場合、ほとんどのランダムな変更によりコンテナが破損するため、これも起こりにくいです。以下を行うことができます:偽のファイルエントリを追加するか、コンテナ内のコンテンツを変更して再チェックしますが、複雑さの層を追加し、結果をチェックするための時間を追加します。どのような内容が変更される可能性があるか。
- テキストまたはテキストのような形式の場合、「有効な」ファイルでありながら、ほぼすべての方法で変更できますが、コンテンツはおそらく目立つでしょう。
- .rtf、.doc、.html、.xslx、およびその他のマークアップ風の形式などの多くの形式では、パーサーが検出できない方法で追加または変更できます。 、自由度が低い)ファイルを変更して(最終的に)ハッシュ衝突を取得する一方で、有効なファイルであるだけでなく、使用される典型的なアプリケーションに見える方法で目立って変更されないようにすることができます。
したがって、残っているのは、破損しておらず、おそらくある程度検出できない構造で衝突を取得する方法です。
- 必要な機能変更(悪意のあるコンテンツの挿入など)を行い、ファイル形式固有の有効性を維持するために追加の変更を行います。
- 機能しないセクションを追加します(コメントブロックの間、テキストファイルの最後に3kの改行がある場合、現在のコメントブロックを分離します)
- 変更する文字/コードポイント/バイトを追加または選択し、可能なすべての有効な組み合わせを試してください(たとえば、すべてのバイトの組み合わせが異なるエンコーディングに有効であるとは限りません)。
- ハッシュを再計算し、衝突が一致するかどうかを確認します。
- そうでない場合は、3に進みます。
有効なバイトシーケンスでの変更とハッシュの再計算に1ミリ秒かかるような超高速コンピューターと小さなファイルがあるとします(おそらく専用ハードウェアが必要です)。ハッシュ分布が完全にランダムであり、範囲全体に分布している場合、2^160
試行ごとにSHA-1との衝突が発生します(強引に強制)。
2^160/1000/60/60/24/365.24
= 4.63x10^37 years
= 46,300,000,000,000,000,000,000,000,000,000,000,000 years
= 46 undecillion years.
しかし、ちょっと、バージョンを試してみましょう、2^60
そして2^52
それらは私たちが好きな方法でファイルを変更できるようにします(彼らはそうしません)、そして、それらも1msごとに行うことができます:
2^52 yields 142,714 years
/*humans might still be around to care, but not about these antiquated formats*/
2^60 yields 3.65x10^7 years = 36,500,000 years
/*machines will probably have taken over anyway*/
しかし、ちょっと、あなたは幸運になるかもしれません。本当に、本当に、何よりも奇跡のような、人々の呼び出しの奇跡はラッキーです。