Kiểm tra tính toàn vẹn của tệp ZIP?


21

Gần như tôi có thể nói tùy chọn zip -T chỉ xác định xem các tệp có thể được giải nén hay không - nó không thực sự kiểm tra kho lưu trữ về tính toàn vẹn bên trong. Ví dụ: tôi cố tình làm hỏng CRC cục bộ (không phải thư mục trung tâm) cho một tệp và zip không quan tâm chút nào, báo cáo lưu trữ là OK. Có một số tiện ích khác để làm điều này?

Có rất nhiều dư thừa nội bộ trong các tệp ZIP và thật tuyệt khi có cách kiểm tra tất cả. Tất nhiên, thông thường thư mục trung tâm là tất cả những gì bạn cần, nhưng khi sửa chữa một kho lưu trữ bị hỏng thường thì tất cả những gì bạn có là một đoạn, với thư mục trung tâm bị ghi đè hoặc bị thiếu. Tôi muốn biết nếu tài liệu lưu trữ tôi tạo ra có thể phục hồi càng tốt.


2
Thế còn unzip -t?
FloHimelf

Hành vi tương tự như zip.
Marc Rochkind

Câu trả lời:


20

giải nén -t

Kiểm tra tập tin lưu trữ.

Tùy chọn này trích xuất từng tệp được chỉ định trong bộ nhớ và so sánh CRC (kiểm tra dự phòng theo chu kỳ, tổng kiểm tra nâng cao) của tệp được mở rộng với giá trị CRC được lưu trữ ban đầu.

[nguồn: https://linux.die.net/man/1/unzip ]


Có 2 CRC mỗi tệp: cục bộ và trung tâm. unzip -tchỉ kiểm tra cái sau.
Marc Rochkind

2
Tôi không biết ý của bạn là "cục bộ" so với "trung tâm" (trung tâm là gì?) nhưng khi tôi chạy "unzip -t myzip_file.zip" tôi thấy một đầu ra dòng để nhận xét về tính toàn vẹn của mỗi tệp được nén , như (tưởng tượng định dạng tốt hơn): "tests: AARiseTransitset.cpp OK tests: AARiseTransitSet.h OK tests: AASaturn.cpp OK tests: AASaturn.h OK ...
Theophrastus

Không phải là nơi để giải thích cấu trúc bên trong của các tệp ZIP. Bài viết của Wikepedia là khá tốt về điều này. Như tôi đã nói, đó là một báo cáo sai lệch mà bạn đang nhìn thấy.
Marc Rochkind

Nếu tôi đi vào một tệp zip với trình soạn thảo hex và thay đổi một byte, thì tôi thấy một tệp: tests: AA_sphere.htmlm xấu CRC 7952862e (nên là 44c6f7f8) trong khi phần còn lại được liệt kê là "OK". bạn sẽ tiếp tục tuyên bố điều này là "gây hiểu lầm", nhưng đó chính xác là những gì tôi mong đợi đối với kiểm tra CRC theo từng tệp của tệp zip. Bây giờ ... chúc may mắn cho bạn.
Theophrastus

Tôi nghĩ rằng bạn đã thay đổi thư mục trung tâm CRC, vào cuối. Hãy thử thay đổi cục bộ, trước hoặc sau tệp.
Marc Rochkind

12

Cố gắng sửa chữa một kho lưu trữ sẽ so sánh các CRC cục bộ và trung tâm, và kết hợp nó với các thử nghiệm lưu trữ sẽ cho phép tất cả các CRC được kiểm tra. Nếu bạn chạy

unzip -t archive.zip

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

và không phàn nàn, điều đó có nghĩa là nội dung của kho lưu trữ khớp với cả CRC trung tâm và địa phương. (Bạn có thể xóa archivefix.zipsau đó.)

Để xác minh điều này, bắt đầu với mã nguồn Info-ZIP cho zip3.0, tôi đã tạo một tệp như sau:

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

Sau đó tôi đã làm hỏng thư mục trung tâm CRC zip.txtbằng cách thay đổi byte ở offset 0xB137. Tôi có hành vi ngược lại với những gì bạn quan sát; unzip -vđã báo cáo CRC bị thay đổi từ thư mục trung tâm, nhưng unzip -tzip -Tbáo cáo rằng tệp này vẫn ổn (kiểm tra đối với CRC cục bộ).

Nhưng đang chạy

zip -F test --out testfix

báo cáo

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

Tệp "đã sửa" vẫn liệt kê CRC đã thay đổi cho zip.txt.

Việc thay đổi CRC cục bộ zip.txtở mức bù 0x10 đã gây ra cả hai unzip -tzip -Tbáo cáo lỗi CRC, nhưng zip -Fkhông phát hiện ra điều gì sai.

Do đó, từ các thử nghiệm của tôi, có thể phát hiện sự không khớp giữa nội dung của mục lưu trữ và CRC của nó như sau:

  • chỉ địa phương: zip -Tunzip -t; zip -Fcũng sẽ phàn nàn về sự không phù hợp giữa địa phương và trung ương
  • địa phương và trung ương: zip -Tunzip -t
  • chỉ trung tâm: zip -Tunzip -tsẽ không khiếu nại, nhưng zip -Fsẽ chỉ ra sự không phù hợp giữa địa phương và trung ương

(Lưu ý rằng theo mặc định zip -Tchỉ đơn giản là sử dụng unzip -tqq, vì vậy zip -Tunzip -tthực sự là tương đương. Bạn có thể đọc unzipmã nguồn để kiểm tra xem việc kiểm tra một kho lưu trữ có thực sự so sánh CRC cục bộ, không phải là trung tâm; tìm kiếm extract_or_test_files(), extract_or_test_entrylist()extract_or_test_member(), tất cả trong extract.c.)


Phức tạp. Và không còn nghi ngờ gì nữa phụ thuộc vào phiên bản nào (GNU, BSD, v.v.) Và CRC chỉ là một trong vô số kiểm tra tính toàn vẹn có thể được thực hiện.
Marc Rochkind

1
Không có nhiều phiên bản zipunzipcó sẵn trên các nền tảng giống như Unix; Info-ZIP được sử dụng khá nhiều ở mọi nơi ...
Stephen Kitt

1
Theo như nó phức tạp, chỉ cần hai lệnh; nếu cả hai unzip -tzip -Fchạy không có lỗi, bạn vẫn ổn và cả hai CRC đã được kiểm tra.
Stephen Kitt

Cảm ơn! Sẽ kiểm tra này. Ngoài ra, quên đề cập: tập tin ZIP là ZIP64.
Marc Rochkind
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.