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


21

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

ZIP 파일에는 많은 내부 중복성이 있으며 모두 확인하는 것이 좋습니다. 물론 일반적으로 중앙 디렉토리 만 있으면되지만 손상된 아카이브를 복구 할 때는 중앙 디렉토리가 클로버되거나 누락 된 조각 만있는 경우가 종종 있습니다. 내가 만든 아카이브가 가능한 한 복구 가능한지 알고 싶습니다.


2
무엇에 대해 unzip -t?
— FloHimself

지퍼와 동일한 동작입니다.
— Marc Rochkind

답변:


20

압축 해제 -t

아카이브 파일을 테스트하십시오.

이 옵션은 메모리에서 지정된 각 파일을 추출하고 확장 된 파일의 CRC (순환 중복 검사, 향상된 체크섬)를 원본의 저장된 CRC 값과 비교합니다.

[출처 : https://linux.die.net/man/1/unzip ]


파일 당 2 개의 CRC가 있습니다 : 로컬 및 중앙. unzip -t후자를 테스트합니다.
— Marc Rochkind

2
"local"과 "central"(무엇에 중점)의 의미가 무엇인지 모르지만 "unzip -t myzip_file.zip"을 실행하면 각 압축 파일의 무결성에 대한 주석이 출력됩니다. 다음과 같이 (더 나은 형식 지정) : "테스트 : AARiseTransitSet.cpp 확인 테스트 : AARiseTransitSet.h 확인 테스트 : AASaturn.cpp 확인 테스트 : AASaturn.h OK ...
— Theophrastus

ZIP 파일의 내부 구조를 설명하는 장소가 아닙니다. Wikepedia 기사는 이것에 꽤 좋습니다. 내가 말했듯이, 그것은 당신이보고있는 잘못된 보고서입니다.
— Marc Rochkind

16 진수 편집기로 zip 파일로 이동하여 1 바이트를 변경하면 하나의 파일을 볼 수 있습니다. testing : AA_sphere.htm bad CRC 7952862e (44c6f7f8이어야 함) 나머지는 "확인"으로 표시됩니다. 당신은 이것을 계속 "오해의 소지가있는"것으로 선언 할 것이지만, 이것이 바로 zip 파일의 파일 별 CRC 점검을 기대하는 것입니다. 이제 ... 행운을 빈다
— Theophrastus

마지막에 중앙 디렉토리 CRC를 변경했다고 생각합니다. 파일 전후에 로컬을 변경하십시오.
— Marc Rochkind

12

아카이브를 수정하려고하면 로컬 및 중앙 CRC를 비교하고이를 아카이브 테스트와 결합하면 모든 CRC를 확인할 수 있습니다. 당신이 실행하는 경우

unzip -t archive.zip

과

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

불평하지 않습니다. 즉, 아카이브의 내용이 중앙 CRC와 로컬 CRC 모두와 일치합니다. ( archivefix.zip나중에 삭제할 수 있습니다 .)

이를 확인하기 위해 Info-ZIP 소스 코드 zip3.0으로 시작하여 다음과 같이 파일을 작성했습니다.

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

그런 다음 zip.txt오프셋 0xB137에서 바이트를 변경 하여 중앙 디렉토리 CRC를 손상 시켰습니다. 나는 당신이 관찰 한 것과 반대되는 행동을했습니다. unzip -v중앙 디렉토리에서 변경 CRC를보고 있지만 unzip -t및 zip -T파일 확인 (현지 CRC에 대한 확인)이라고보고했다.

그러나 달리기

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.

에 대한 로컬 CRC를 변경하면 zip.txt오프셋을 0x10에서 모두 발생 unzip -t및 zip -TCRC 오류를보고하지만 zip -F아무것도 잘못을 발견하지 않았다.

따라서 내 실험에서 아카이브 항목의 내용과 해당 CRC 간의 불일치가 다음과 같이 감지 될 수 있습니다.

  • 로컬 전용 : zip -T및 unzip -t; zip -F또한 지역 중심의 불일치에 대해 불평합니다
  • 지역 및 중앙 : zip -T및unzip -t
  • 중앙 전용 : zip -T및 unzip -t불평하지 않을 것이다, 그러나 zip -F로컬 중앙 불일치를 나타냅니다

(주 기본은으로 zip -T간단하게 사용 unzip -tqq때문에, zip -T그리고 unzip -t정말 동일합니다 당신은 읽을 수 있습니다. unzip아카이브를 테스트하는 것은 정말 지역 CRC가 아닌 중앙 하나 비교 확인하기 위해 소스 코드를,위한 모습 extract_or_test_files(), extract_or_test_entrylist()그리고 extract_or_test_member(), 모두 extract.c.)


복잡한. 그리고 어떤 버전 (GNU, BSD 등)에 따라 크게 달라집니다. CRC는 수행 할 수있는 수많은 무결성 검사 중 하나 일뿐입니다.
— Marc Rochkind

1
아니 많은 버전이 있습니다 zip및 unzip볼은 유닉스 플랫폼; Info-ZIP은 거의 모든 곳에서 사용됩니다 ...
— Stephen Kitt

1
복잡하기 만하면 두 가지 명령이 필요합니다. 두 경우 unzip -t와는 zip -F오류없이 실행, 넌 OK 모두의 CRC 체크하고있다.
— Stephen Kitt

감사! 이것을 확인합니다. 또한 ZIP 파일은 ZIP64입니다.
— Marc Rochkind
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.