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 -tzip -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 -tzip -TCRC 오류를보고하지만 zip -F아무것도 잘못을 발견하지 않았다.

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

  • 로컬 전용 : zip -Tunzip -t; zip -F또한 지역 중심의 불일치에 대해 불평합니다
  • 지역 및 중앙 : zip -Tunzip -t
  • 중앙 전용 : zip -Tunzip -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
아니 많은 버전이 있습니다 zipunzip볼은 유닉스 플랫폼; 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.