ZIPファイルの整合性をテストしますか?

ZIPファイルの整合性をテストしますか?

私が知っている限り、zip -Tオプションはファイルを抽出できるかどうかを決定し、実際にはアーカイブの内部整合性をテストしません。たとえば、ファイルのローカル(非中央ディレクトリ)CRCを意図的に破損させ、zipはまったく気にせずにアーカイブを正常に報告しました。これを行うことができる他のユーティリティはありますか?

ZIPファイルには内部冗長性が多いのですが、すべて確認できる方法があれば良いようです。もちろん、通常は中央ディレクトリのみが必要ですが、破損したアーカイブを修復するときに通常持っているのは、中央ディレクトリが破損または欠落している部分だけです。私が作成したアーカイブが回復可能かどうかを知りたいです。

答え1

解凍 -t

テストアーカイブファイル。

このオプションは、メモリに指定された各ファイルを抽出し、拡張ファイルの巡回冗長検査、拡張チェックサム(CRC)を元に保存されたCRC値と比較します。

[源泉:https://linux.die.net/man/1/unzip]

答え2

使用情報郵便番号、アーカイブの回復を試みると、ローカルおよび中央CRCが比較され、それをアーカイブテストと組み合わせることで、すべてのCRCを確認できます。走れば

unzip -t archive.zip

そして

zip -F archive.zip --out archivefix.zip

両側とも不満はありませんでした。これは、書類の内容が中央および地域のCRCと一致したことを意味します。 (archivefix.zip今後削除される可能性があります。)

これを確認するために、3.0 Info-ZIPソースコードからzip次のようにファイルを生成しました。

zip -9 test.zip zip.txt zipup.c

zip.txtその後、オフセット0xB137でバイトを変更して中央ディレクトリCRCを破損させました。私の行動はあなたが観察したのと反対です。unzip -v変更されたCRCは中央ディレクトリに報告されますが、ファイルはOK(ローカルCRCと比較して確認済み)としてunzip -t報告されます。zip -T

しかし走っている

zip -F test --out testfix

レポート

Fix archive (-F) - assume mostly intact archive
Zip entry offsets do not need adjusting
 copying: zip.txt
        zip warning: Local Entry CRC does not match CD: zip.txt
 copying: zipup.c

「修正済み」ファイルには、まだ変更されたCRCがリストされていますzip.txt

zip.txtオフセット0x10でローカルCRCを変更すると、CRCエラーが発生して報告されunzip -tましたが、エラーは見つかりませんでした。zip -Tzip -F

したがって、私の実験では、アーカイブエントリの内容と対応するCRCの間の不一致は、次のように検出できます。

  • ローカルのみ:zip -Tunzip -t;zip -Fまた、ローカルと中央の不一致について文句を言います。
  • 地域と中央:zip -Tunzip -t
  • 中央のみ:文句をzip -T言わないが、ローカルが中央と一致しないとマークされます。unzip -tzip -F

(デフォルトではzip -Tsounzip -tqqzip -Trealのみがunzip -t同じです。unzipソースコードを読んで、テストアーカイブが実際に中央CRCではなくローカルCRCを比較しているかどうかをextract_or_test_files()確認extract_or_test_entrylist()できextract_or_test_member()ますextract.c

答え3

あなたは一度見たいと思うかもしれませんzipdetails。マニュアルページから:

Zipdetails は、zip ファイルの内部レコード構造に関する情報を表示します。 zipファイルに保存されている圧縮データの詳細を表示することとは関係ありません。

zipdetails不一致が検出されるかどうかはわかりませんが、不一致を見つけて理解するのに役立ちます。以下は出力の小さなサンプルです。

00000 LOCAL HEADER #1       04034B50
00004 Extract Zip Spec      14 '2.0'
00005 Extract OS            00 'MS-DOS'
00006 General Purpose Flag  0808
      [Bits 1-2]            0 'Normal Compression'
      [Bit  3]              1 'Streamed'
      [Bit 11]              1 'Language Encoding'
00008 Compression Method    0008 'Deflated'
0000A Last Mod Time         5352884C 'Mon Oct 18 17:02:24 2021'
0000E CRC                   00000000
00012 Compressed Length     00000000
00016 Uncompressed Length   00000000
0001A Filename Length       000B
0001C Extra Length          0000
0001E Filename              'graphic.svg'
00029 PAYLOAD

02947 STREAMING DATA HEADER 08074B50
0294B CRC                   C622C669
0294F Compressed Length     0000291E
02953 Uncompressed Length   0002F706

マンページでもこれを確認できます。

エラー処理はまだ進行中です。プログラムがzipファイルを読み取る際に問題が発生した場合は、役に立たないエラーメッセージで終了する可能性があります。

関連情報