Prueba de integridad del archivo ZIP?

21

Por lo que puedo decir, la opción zip -T solo determina si se pueden extraer los archivos; realmente no prueba la integridad interna del archivo. Por ejemplo, dañé deliberadamente el CRC local (no el directorio central) para un archivo, y zip no me importó en absoluto, informando que el archivo estaba bien. ¿Hay alguna otra utilidad para hacer esto?

Hay mucha redundancia interna en los archivos ZIP, y sería bueno tener una forma de verificarlo todo. Por supuesto, normalmente el directorio central es todo lo que necesita, pero al reparar un archivo dañado a menudo todo lo que tiene es un fragmento, con el directorio central tropezado o faltante. Me gustaría saber si los archivos que creo son lo más recuperables posible.

Marc Rochkind
fuente
2
¿Qué hay de unzip -t?
FloHims
Mismo comportamiento que zip.
Marc Rochkind

Respuestas:

20

descomprimir -t

Prueba de archivos de almacenamiento.

Esta opción extrae cada archivo especificado en la memoria y compara el CRC (verificación de redundancia cíclica, una suma de verificación mejorada) del archivo expandido con el valor CRC almacenado del original.

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

Teofrasto
fuente
Hay 2 CRC por archivo: local y central. unzip -tsolo prueba esto último.
Marc Rochkind
2
no sé a qué te refieres con "local" versus "central" (¿central para qué?) pero cuando ejecuto "descomprimir -t myzip_file.zip" veo una salida de línea para comentar sobre la integridad de cada archivo comprimido , como (imagine un mejor formato): "prueba: AARise transitSet.cpp Prueba correcta: AARise transitSet.h Prueba correcta: AASaturn.cpp Prueba correcta: AASaturn.h OK ...
Theophrastus
No es el lugar para explicar la estructura interna de los archivos ZIP. El artículo de Wikepedia es bastante bueno en esto. Como dije, es un informe engañoso lo que estás viendo.
Marc Rochkind
Si entro en un archivo zip con un editor hexadecimal y cambio un byte, veo un archivo: testing: AA_sphere.htm bad CRC 7952862e (debería ser 44c6f7f8) mientras que el resto aparece como "OK". continuará declarando esto como "engañoso", pero eso es exactamente lo que espero para una verificación CRC archivo por archivo de un archivo zip. ahora ... buena suerte señor.
Theophrastus
Creo que ha cambiado el directorio central CRC, al final. Intente cambiar el local, antes o después del archivo.
Marc Rochkind
12

Intentar arreglar un archivo comparará los CRC locales y centrales, y combinar eso con las pruebas de archivo permitirá verificar todos los CRC. Si tu corres

unzip -t archive.zip

y

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

y tampoco se quejan, eso significa que el contenido del archivo coincide con los CRC centrales y locales. (Puede eliminar archivefix.zipdespués).

Para verificar esto, comenzando con el código fuente Info-ZIP para zip3.0, creé un archivo de la siguiente manera:

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

Luego corrompí el directorio central CRC zip.txtcambiando el byte en el desplazamiento 0xB137. Obtuve el comportamiento opuesto a lo que observaste; unzip -vinformó el CRC alterado desde el directorio central, pero unzip -te zip -Tinformó de que el archivo estaba bien (comprobación con la CDN local).

Pero corriendo

zip -F test --out testfix

reportado

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

El archivo "corregido" todavía enumeraba el CRC alterado para zip.txt.

La alteración de la CRC local zip.txten el desplazamiento 0x10 causó ambos unzip -te zip -Tinformar un error de CRC, pero zip -Fno detectó nada malo.

Por lo tanto, a partir de mis experimentos, los desajustes entre el contenido de una entrada de archivo y sus CRC se pueden detectar de la siguiente manera:

  • solo local: zip -Ty unzip -t; zip -Ftambién se quejará de la discordancia local-central
  • local y central: zip -Tyunzip -t
  • solo central: zip -Ty unzip -tno se quejará, pero zip -Findicará un desajuste local-central

(Tenga en cuenta que por defecto zip -Tsimplemente utiliza unzip -tqq, por lo que zip -Ty unzip -trealmente son equivalentes Puede leer el. unzipCódigo fuente para comprobar que las pruebas de un archivo realmente compara el CRC local, no el central, buscar extract_or_test_files(), extract_or_test_entrylist()y extract_or_test_member(), en todo extract.c.)

Stephen Kitt
fuente
Complicado. Y sin duda depende mucho de qué versiones (GNU, BSD, etc.) Y CRC es solo una de las numerosas comprobaciones de integridad que se pueden realizar.
Marc Rochkind
1
No hay muchas versiones zipy están unzipdisponibles en plataformas similares a Unix; Info-ZIP se usa prácticamente en todas partes ...
Stephen Kitt
1
En la medida en que sea complicado, solo toma dos comandos; si ambos unzip -ty se zip -Fejecutan sin error, está bien y ambos CRC han sido verificados.
Stephen Kitt
¡Gracias! Verificaremos esto. Además, olvidé mencionar: los archivos ZIP son ZIP64.
Marc Rochkind