测试ZIP文件的完整性?


21

据我所知,zip -T选项仅确定是否可以提取文件-并没有真正测试存档的内部完整性。例如,我故意破坏了文件的本地(而非中央目录)CRC,而zip根本不关心,将存档报告为OK。还有其他实用程序吗?

ZIP文件中有很多内部冗余,最好有一种检查所有方法的方法。当然,通常只需要中央目录,但是在修复损坏的存档时,通常您所拥有的只是一个片段,中央目录被破坏或丢失。我想知道我创建的档案是否可恢复。


2
unzip -t
FloHimself 2015年

与zip相同。
马克·罗奇金德

Answers:


20

解压-t

测试存档文件。

此选项提取内存中的每个指定文件,并将扩展文件的CRC(循环冗余校验,增强的校验和)与原始文件的CRC值进行比较。

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


每个文件有2个CRC:本地和中央。unzip -t仅测试后者。
马克·罗奇金德

2
我不知道“本地”与“中央”(中央是什么)的意思,但是当我运行“ unzip -t myzip_file.zip”时,我看到一行输出,用于评论每个压缩文件的完整性,例如(设想更好的格式):“测试:AARiseTransitSet.cpp OK测试:AARiseTransitSet.h OK测试:AASaturn.cpp OK测试:AASaturn.h OK ...
Theophrastus

不是解释ZIP文件内部结构的地方。Wikepedia的文章对此非常好。如我所说,这是您看到的误导性报告。
马克·罗奇金德

如果我进入一个带有十六进制编辑器的zip文件并更改一个字节,那么我会看到一个文件:测试:AA_sphere.htm错误的CRC 7952862e(应为44c6f7f8),其余的列为“确定”。您将继续将其声明为“误导性”,但这正是我期望对zip文件进行逐文件CRC检查的结果。现在...祝你好运先生。
Theophrastus 2015年

我认为您最后已经更改了中央目录CRC。尝试在文件之前或之后更改本地文件。
马克·罗奇金德

12

尝试修复存​​档将比较本地和中央CRC,并将其与存档测试结合将允许检查所有CRC。如果你跑

unzip -t archive.zip

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

而且没有人抱怨,这意味着存档的内容与中央和本地CRC都匹配。(您可以archivefix.zip随后删除。)

为了验证这一点,从zip3.0 的Info-ZIP源代码开始,我创建了一个文件,如下所示:

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 -T报告CRC错误,但zip -F没有发现任何错误。

因此,根据我的实验,可以按以下方式检测到存档条目的内容与其CRC之间的不匹配:

  • 仅本地:zip -Tunzip -t; zip -F也将抱怨本地中心不匹配
  • 本地和中央:zip -Tunzip -t
  • 仅限中央:zip -T并且unzip -t不会抱怨,但zip -F会指示本地-中央不匹配

(请注意,在默认情况下zip -T简单地使用unzip -tqq,所以zip -Tunzip -t真正等价你可以阅读。unzip源代码检查测试存档真的比较本地CRC,没有中央一;找extract_or_test_files()extract_or_test_entrylist()extract_or_test_member(),都在extract.c。)


复杂。毫无疑问,这完全取决于什么版本(GNU,BSD等),而CRC只是可以执行的众多完整性检查之一。
马克·罗奇金德

1
类似Unix的平台zip并没有很多版本unzip可用;Info-ZIP几乎无处不在...
Stephen Kitt 2015年

1
就复杂程度而言,它仅需两个命令。如果两个unzip -tzip -F运行没有错误,你真行和两个社区康复中心已检查。
史蒂芬·基特

谢谢!将检查出来。另外,忘记提及:ZIP文件是ZIP64。
马克·罗奇金德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.