ZIP 파일의 무결성을 테스트하시겠습니까?

ZIP 파일의 무결성을 테스트하시겠습니까?

내가 아는 한, zip -T 옵션은 파일을 추출할 수 있는지 여부만 결정하며 실제로 아카이브의 내부 무결성을 테스트하지는 않습니다. 예를 들어, 파일의 로컬(중앙 디렉터리가 아닌) CRC를 의도적으로 손상시켰고 zip은 전혀 신경 쓰지 않고 아카이브를 정상적으로 보고했습니다. 이 작업을 수행할 수 있는 다른 유틸리티가 있습니까?

ZIP 파일에는 내부 중복성이 많은데, 모두 확인할 수 있는 방법이 있으면 좋을 것 같습니다. 물론 일반적으로 중앙 디렉터리만 필요하지만 손상된 아카이브를 복구할 때 일반적으로 가지고 있는 것은 중앙 디렉터리가 손상되거나 누락된 조각뿐입니다. 내가 만든 아카이브가 복구 가능한지 알고 싶습니다.

답변1

압축 풀기 -t

테스트 아카이브 파일.

이 옵션은 메모리에 지정된 각 파일을 추출하고 확장 파일의 CRC(Cyclic Redundancy Check, Enhanced Checksum)를 원래 저장된 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 -Tso unzip -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 파일을 읽는 데 문제가 발생하면 쓸모 없는 오류 메시지와 함께 종료될 수 있습니다.

관련 정보