4

バイナリ ファイルを識別する最も効率的な方法は何ですか? バイナリ ファイルからある種の署名を抽出し、それを使用して他の署名と比較したいと考えています。

ブルート フォース アプローチは、ファイル全体を署名として使用することです。私はこの問題に対するよりスマートなアプローチを探しており、パフォーマンスのために少し精度を犠牲にしても構わないと思っています。

(Java コード例が優先されますが、言語にとらわれない回答が推奨されます)

編集:ファイル全体をスキャンしてハッシュを作成すると、ファイルが大きくなるほど時間がかかるという欠点があります。とにかくハッシュは一意ではないため、より効率的なアプローチがあるかどうか疑問に思っていました(つまり、バイトの均等に分散されたサンプリングからのハッシュ)。

4

4 に答える 4

12

このような場合に有効だとわかったアプローチは、2 つの SHA-1 ハッシュを計算することでした。1 つはファイルの最初のブロック (ブロック サイズとして任意に 512 バイトを選びました) 用で、もう 1 つはファイル全体用です。次に、2 つのハッシュをファイル サイズと共に保存しました。ファイルを特定する必要があるときは、まずファイルの長さを比較します。長さが一致する場合は、最初のブロックのハッシュを比較し、一致する場合はファイル全体のハッシュを比較します。最初の 2 つのテストでは、多くの一致しないファイルがすぐに除外されました。

于 2010-08-14T12:43:45.117 に答える
3

それがハッシュの目的です。MessageDigestを参照してください。

ファイルが大きすぎてメモリに読み込めない場合でも、ファイルのチャンクをハッシュ関数に渡すことができるので問題ありません。たとえば、MD5 と SHA1 は 512 ビットのブロックを取ることができます。

また、同じハッシュを持つ 2 つのファイルは必ずしも同一ではありません (そうでないことは非常にまれです) が、同一の 2 つのファイルは必ず同じハッシュを持ちます。

于 2010-08-14T12:11:01.297 に答える
2

通常の答えはMD5を使用することですが、最近のアプリケーションでMD5を使用するには衝突が多すぎることをお勧めします:http ://www.mscs.dal.ca/~selinger/md5collision/

SHA-1は10年以上前にMD5に取って代わりました。

NISTは、SHA-1の縮小されたバリアントでの衝突を実証するために行われた作業のため、2010年までにSHA-1の代わりにSHA-2を使用することを2005年に推奨しました。(衝突を見つけるのに2 ^ 80の作業が理想的に必要なもので、衝突を見つけるのに2 ^ 51の作業が必要であることがわかっているので、これはかなり良い先見の明です。)

ですから、あなたがやろうとしていること、そしてあなたが相互運用する必要があるかもしれない他のプログラムに基づいて、MD5(しないでください)、SHA-1(私は理解しますが、私たちはもっとうまくいくことができます)、そしてSHAから選択してください-2(私を選んでください!私を選んでください!)。

于 2010-08-14T12:27:49.553 に答える
0

ヘッダーIDを使用することを考慮していますか。このような方法でファイルを設計できれば、これは高速で信頼性の高いものになります。1バイトを使用すると、255のファイルタイプを区別できます;)

于 2010-08-14T12:34:35.123 に答える