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.