Verifica l'integrità del file ZIP?


21

Per quanto ne so, l'opzione zip -T determina solo se i file possono essere estratti - non verifica realmente l'integrità interna dell'archivio. Ad esempio, ho deliberatamente corrotto il CRC locale (non della directory centrale) per un file e zip non mi importava affatto, segnalando l'archivio come OK. C'è qualche altra utility per farlo?

C'è molta ridondanza interna nei file ZIP e sarebbe bello poter controllare tutto. Naturalmente, normalmente la directory centrale è tutto ciò che serve, ma quando si ripara un archivio danneggiato spesso tutto ciò che si ha è un frammento, con la directory centrale ostruita o mancante. Mi piacerebbe sapere se gli archivi che creo sono il più recuperabili possibile.


2
Che dire unzip -t?
FloHimself

Stesso comportamento di zip.
Marc Rochkind,

Risposte:


20

decomprimere -t

Test dei file di archivio.

Questa opzione estrae tutti i file specificati in memoria e confronta il CRC (controllo di ridondanza ciclico, un checksum avanzato) del file espanso con il valore CRC memorizzato dell'originale.

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


Esistono 2 CRC per file: locale e centrale. unzip -tprova solo quest'ultimo.
Marc Rochkind,

2
non so cosa intendi per "locale" rispetto a "centrale" (centrale per cosa?) ma quando eseguo "decomprimere -t myzip_file.zip" vedo un output di riga per commentare l'integrità di ogni singolo file zippato , come (immaginare una migliore formattazione): "test: test AARiseTransitSet.cpp OK: OK AARiseTransitSet.h di test: test AASaturn.cpp OK: AASaturn.h OK ...
Teofrasto

Non è il posto giusto per spiegare la struttura interna dei file ZIP. L'articolo di Wikepedia è abbastanza buono su questo. Come ho detto, è un rapporto fuorviante che stai vedendo.
Marc Rochkind,

Se vado in un file zip con un editor esadecimale e cambio un byte, vedo un file: testing: AA_sphere.htm CRC non valido 7952862e (dovrebbe essere 44c6f7f8) mentre gli altri sono elencati come "OK". continuerai a dichiararlo "fuorviante", ma è esattamente quello che mi aspetto per un controllo CRC file per file di un file zip. ora ... buona fortuna, signore.
Teofrasto

Penso che alla fine tu abbia cambiato la directory centrale CRC. Prova a cambiare quello locale, prima o dopo il file.
Marc Rochkind

12

Il tentativo di riparare un archivio confronterà i CRC locali e centrali e combinandolo con i test di archivio consentirà di verificare tutti i CRC. Se corri

unzip -t archive.zip

e

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

e nessuno si lamenta, ciò significa che i contenuti dell'archivio corrispondono sia ai CRC centrali che a quelli locali. (Puoi cancellarearchivefix.zip seguito.)

Per verificarlo, a partire dal codice sorgente Info-ZIP per zip3.0, ho creato un file come segue:

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

Ho quindi corrotto la directory centrale CRC per zip.txt cambiando il byte all'offset 0xB137. Ho avuto il comportamento opposto a quello che hai osservato; unzip -vsegnalato il CRC modificato dalla directory centrale, maunzip -t e zip -Tha riferito che il file era OK (il controllo contro il CRC locale).

Ma correndo

zip -F test --out testfix

segnalati

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

Il file "corretto" elencava ancora il CRC modificato per zip.txt .

La modifica del CRC locale per l' zip.txtoffset 0x10 ha causato sia unzip -tezip -T segnalato un errore CRC, ma zip -Fnon ha rilevato alcun errore.

Pertanto, dai miei esperimenti, le discrepanze tra il contenuto di una voce di archivio e i suoi CRC possono essere rilevate come segue:

  • solo locale: zip -Te unzip -t;zip -Fsi lamenterà anche della mancata corrispondenza locale-centrale
  • locale e centrale: zip -Teunzip -t
  • solo centrale: zip -Te unzip -tnon si lamenterà, ma zip -Findicherà una mancata corrispondenza locale-centrale

(Si noti che di default zip -Tusa semplicemente unzip -tqq, in modo zip -Te unzip -tin realtà sono equivalenti È possibile leggere il. unzipCodice sorgente per controllare che il test di un archivio confronta davvero il CRC locale, non quello centrale, look per extract_or_test_files(), extract_or_test_entrylist()e extract_or_test_member(), il tutto in extract.c.)


Complicato. E senza dubbio dipende molto da quali versioni (GNU, BSD, ecc.) E CRC è solo uno dei numerosi controlli di integrità che è possibile eseguire.
Marc Rochkind,

1
Non ci sono molte versioni zipe unzipdisponibili su piattaforme simili a Unix; Info-ZIP è usato praticamente ovunque ...
Stephen Kitt,

1
Per quanto complicato, ci vogliono solo due comandi; se entrambi unzip -te zip -Fgestita senza errori, che stai bene ed entrambi i CRC sono stati verificati.
Stephen Kitt,

Grazie! Lo verificherò. Inoltre, ho dimenticato di menzionare: i file ZIP sono ZIP64.
Marc Rochkind,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.