ZIP (fájlformátum)

.A ZIP fájlok olyan archívumok, amelyek több fájlt tárolnak. A ZIP lehetővé teszi a tartalmazott fájlok tömörítését számos különböző módszerrel, valamint a fájl egyszerű tárolását tömörítés nélkül. Minden egyes fájl külön tárolódik, így az ugyanabban az archívumban lévő különböző fájlok különböző módszerekkel tömöríthetők. Mivel a ZIP-archívumban lévő fájlok külön-külön tömörítve vannak, lehetőség van a fájlok kivonására vagy újak hozzáadására anélkül, hogy a teljes archívumra tömörítést vagy dekompressziót kellene alkalmazni. Ez ellentétben áll a tömörített tar-fájlok formátumával, amelyek esetében az ilyen véletlenszerű hozzáférésű feldolgozás nem könnyen lehetséges.

A ZIP-fájl végén egy könyvtár található. Ez azonosítja, hogy milyen fájlok vannak a ZIP-ben, és azonosítja, hogy az adott fájl hol található a ZIP-ben. Ez lehetővé teszi a ZIP-olvasók számára a fájlok listájának betöltését a teljes ZIP-archívum beolvasása nélkül. A ZIP-archívumok olyan extra adatokat is tartalmazhatnak, amelyek nem kapcsolódnak a ZIP-archívumhoz. Ez lehetővé teszi, hogy egy ZIP-archívumot önkitömörítő archívummá (a benne lévő adatokat dekomprimáló alkalmazássá) alakítsanak, ha a programkódot a ZIP-archívum elé illesztik, és a fájlt futtathatónak jelölik. A katalógus végén történő tárolása lehetővé teszi a zippelt fájl elrejtését is egy ártalmatlan fájlhoz, például egy GIF képfájlhoz való csatolással.

A .ZIP formátum 32 bites CRC algoritmust használ, és az adatvesztés elleni nagyobb védelem érdekében az archívum könyvtárszerkezetének két példányát tartalmazza.

StructureEdit

ZIP-64 belső elrendezés

A ZIP-fájlt helyesen azonosítja a központi könyvtár végi rekord jelenléte, amely az archívumszerkezet végén található, hogy az új fájlokat könnyen hozzá lehessen csatolni. Ha a központi könyvtár vége rekord nem üres archívumot jelez, akkor az archívumon belül minden egyes fájl vagy könyvtár nevét egy központi könyvtár bejegyzésben kell megadni, a bejegyzésre vonatkozó egyéb metaadatokkal és a ZIP-fájlban egy eltolással együtt, amely a tényleges belépési adatokra mutat. Ez lehetővé teszi az archívum fájllistázását viszonylag gyorsan, mivel a fájlok listájának megtekintéséhez nem kell az egész archívumot elolvasni. A ZIP-fájlon belüli bejegyzések is tartalmazzák ezt az információt, a redundancia érdekében, egy helyi fájlfejlécben. Mivel a ZIP-fájlokhoz lehet csatolni, csak a fájl végén lévő központi könyvtárban megadott fájlok érvényesek. Egy ZIP-fájl átvizsgálása a helyi fájlfejlécek után érvénytelen (kivéve a sérült archívumok esetében), mivel a központi könyvtár kijelentheti, hogy egyes fájlok törlésre, más fájlok pedig frissítésre kerültek.

Elkezhetünk például egy ZIP-fájlról, amely A, B és C fájlokat tartalmaz, majd B fájlt töröljük, C-t pedig frissítjük. Ezt úgy lehet elérni, hogy az eredeti ZIP-fájl végére egy új C fájlt csatolunk, és hozzáadunk egy új központi könyvtárat, amely csak az A fájlt és az új C fájlt tartalmazza. Amikor a ZIP-et először megtervezték, a fájlok átvitele floppylemezen volt elterjedt, a lemezekre való írás azonban nagyon időigényes volt. Ha egy nagy, esetleg több lemezre kiterjedő zip-fájlunk volt, és csak néhány fájlt kellett frissítenünk, az összes fájl beolvasása és újraírása helyett lényegesen gyorsabb lett volna csak beolvasni a régi központi könyvtárat, hozzáfűzni az új fájlokat, majd hozzáfűzni egy frissített központi könyvtárat.

A központi könyvtárban lévő fájlbejegyzések sorrendjének nem kell egyeznie az archívumban lévő fájlbejegyzések sorrendjével.

A ZIP-archívumban tárolt minden egyes bejegyzést egy helyi fájlfejléc vezet be, amely a fájlra vonatkozó információkat, például a megjegyzést, a fájlméretet és a fájlnevet tartalmazza, ezt követik az opcionális “extra” adatmezők, majd az esetleg tömörített, esetleg titkosított fájladatok. Az “extra” adatmezők jelentik a ZIP formátum bővíthetőségének kulcsát. Az “extra” mezőket a ZIP64 formátum, a WinZip-kompatibilis AES-titkosítás, a fájlattribútumok és a nagyobb felbontású NTFS vagy Unix fájl időbélyegek támogatására használják ki. Más kiterjesztések is lehetségesek az “Extra” mezőn keresztül. A ZIP-eszközöknek a specifikáció szerint figyelmen kívül kell hagyniuk az általuk nem ismert Extra mezőket.

A ZIP-formátum speciális 4 bájtos “aláírásokat” használ a fájl különböző struktúráinak jelölésére. Minden egyes fájlbejegyzést egy adott aláírás jelöl. A központi könyvtárrekord végét a sajátos aláírás jelzi, és a központi könyvtár minden egyes bejegyzése a 4 bájtos központi fájlfejléc aláírásával kezdődik.

A ZIP specifikációban nincs BOF vagy EOF jelölő. Hagyományosan a ZIP-fájlban az első dolog egy ZIP-bejegyzés, amely könnyen azonosítható a helyi fájlfejléc aláírása alapján. Ez azonban nem feltétlenül van így, mivel a ZIP specifikáció ezt nem követeli meg – leginkább az önkitömörítő archívum kezdődik egy futtatható fájl fejléccel.

A ZIP-archívumokat helyesen olvasó eszközöknek a központi könyvtárrekord végének aláírását kell keresniük, majd adott esetben a többi, jelzett központi könyvtárrekordot is. Nem szabad a ZIP-fájl tetején lévő bejegyzéseket keresniük, mivel (amint azt már korábban említettük ebben a szakaszban) csak a központi könyvtár adja meg, hogy hol kezdődik egy fájldarab, és hogy az nem lett törölve. A pásztázás hamis pozitív eredményekhez vezethet, mivel a formátum nem tiltja, hogy más adatok legyenek a chunkok között, és azt sem, hogy a fájl adatfolyamai ilyen aláírásokat tartalmazzanak. Azok az eszközök azonban, amelyek sérült ZIP-archívumokból próbálnak adatokat helyreállítani, nagy valószínűséggel a helyi fájlfejléc aláírásai után fogják vizsgálni az archívumot; ezt nehezíti, hogy a fájldarab tömörített mérete a fájldarab után tárolódhat, ami megnehezíti a szekvenciális feldolgozást.

A legtöbb aláírás a rövid egész számmal 0x4b50 végződik, amely little-endian sorrendben van tárolva. ASCII karakterláncként nézve ez “PK”, a feltaláló Phil Katz kezdőbetűi. Így amikor egy ZIP-fájlt egy szövegszerkesztővel nézünk meg, a fájl első két bájtja általában “PK”. (A DOS, OS/2 és Windows önkitömörítő ZIP-ek előtt EXE áll, tehát “MZ”-vel kezdődik; más operációs rendszerek önkitömörítő ZIP-jei előtt hasonlóan állhat az archívum tartalmának az adott platformon történő kicsomagolására szolgáló futtatható kód.)

A .ZIP specifikáció támogatja az archívumok több fájlrendszerfájlra történő szétterítését is. Eredetileg a nagy ZIP-fájlok több floppylemezen történő tárolására szánták, de ezt a funkciót ma már a ZIP-archívumok részekben történő elküldésére használják e-mailben, illetve más szállítóeszközökön vagy cserélhető adathordozókon.

A DOS FAT fájlrendszerének időbélyegfelbontása mindössze két másodperc; a ZIP-fájlrekordok ezt utánozzák. Ennek eredményeképpen a ZIP-archívumban lévő fájlok beépített időbélyegfelbontása csak két másodperc, bár a pontosabb időbélyegek tárolására további mezők is használhatók. A ZIP-formátum nem ismeri az időzóna fogalmát, így az időbélyegek csak akkor értelmezhetőek, ha ismert, hogy melyik időzónában készültek.

2007 szeptemberében a PKWARE kiadta a ZIP specifikáció felülvizsgálatát, amely lehetővé teszi a fájlnevek UTF-8 kódú tárolását, így a ZIP végre Unicode-kompatibilis lett.

FájlcímekSzerkesztés

A fejléc minden többbájtos értékét little-endian bájtsorrendben tárolja. Minden hosszmező a hosszúságot bájtban számolja.

Local file headerEdit

Local file header
Offset Bytes Description
0 4 Local file header signature = 0x04034b50 (olvasható little-endierként).endián szám)
4 2 A kivonatoláshoz szükséges verzió (minimum)
6 2 Általános célú bitjelző
8 2 Tömörítési módszer
10 2 A fájl utolsó módosításának ideje
12 2 A fájl utolsó módosításának dátuma
14 4 CRC-32 tömörítetlen adat
18 4 Tömörített méret (vagy 0xffffffffff ZIP64 esetén)
22 4 Tömörítetlen méret (vagy 0xffffffffff ZIP64 esetén)
26 2 Fájlnév hossza (n)
28 2 Extra mező hossza (m)
30 n Fájlnév
30+n m Extra mező

Az extra mező különböző opcionális adatokat tartalmaz, mint például OS-specifikus attribútumok. Tömbökre van osztva, mindegyik 16 bites azonosító kóddal és 16 bites hosszal. A ZIP64 esetében mindig van legalább egy darab (0001-es azonosító kódú és 32 bájt méretű), lásd alább.

Ezt közvetlenül a tömörített adatok követik.

Data descriptorEdit

Ha az általános célú flags mező 3. eltolásánál (0x08) lévő bit be van állítva, akkor a CRC-32 és a fájlméretek nem ismertek a fejléc írásakor. A helyi fejléc mezői nullával töltődnek fel, a CRC-32 és a méret pedig egy 12 bájtos struktúrában (amelyet opcionálisan egy 4 bájtos aláírás előz meg) közvetlenül a tömörített adatok után kerül hozzáadásra:

.

Adatleíró
Offset Byte Megnevezés
0 0/4 Opcionális adatleíró aláírás = 0x08074b50
0/4 4 CRC-32 tömörítetlen adat
4/8 4 Tömörített méret
8/12 4 Tömörítetlen size

Központi könyvtárfájl fejlécEdit

A központi könyvtár bejegyzés a helyi fejléc kibővített formája:

.

Central directory file header
Offset Bytes Description
0 4 Central directory file header signature = 0x02014b50
4 2 Version made by
6 2 Version needed to extract (minimum)
8 2 Általános célú bit flag
10 2 Tömörítési módszer
12 2 A fájl utolsó módosításának ideje
14 2 A fájl utolsó módosításának dátuma
16 4 CRC-32 tömörítetlen adat
20 4 Tömörített méret (vagy 0xffffffffff ZIP64 esetén)
24 4 Tömörítetlen méret
4 Nem tömörített méret (vagy 0xffffffffffff ZIP64 esetén)
28 2 Fájlnév hossza (n)
30 2 Extra mező hossza (m)
32 2 File comment length (k)
34 2 Disk number where file starts
36 2 2 Belső fájl attribútumok
38 4 Külső fájl attribútumok
42 4 A helyi fájlfejléc relatív eltolása. Ez a bájtok száma az első lemez kezdete, amelyen a fájl szerepel, és a helyi fájlfejléc kezdete között. Ez lehetővé teszi a központi könyvtárat olvasó szoftverek számára, hogy megtalálják a fájl helyét a ZIP-fájlon belül.
46 n Fájlnév
46+n m Extramező
46+n+m k File comment

Központi címtár rekord vége (EOCD)Edit

A központi címtár összes bejegyzése után következik a központi címtár rekord vége (EOCD), amely a ZIP-fájl végét jelzi:

End of central directory record (EOCD)
Offset Bytes Description
0 4 End of Központi könyvtár aláírása = 0x06054b50
4 2 A lemez száma
6 2 Diszk, ahol a központi könyvtár található. kezdődik
8 2 A központi könyvtár rekordjainak száma ezen a lemezen
10 2 2 A központi könyvtár rekordjainak száma összesen. könyvtárrekordok száma
12 4 A központi könyvtár mérete (bájt)
16 4 A központi könyvtár kezdetének eltolódása, az archívum elejéhez képest
20 2 Comment hossza (n)
22 n Comment

Ez a rendezés lehetővé teszi a ZIP fájl létrehozását egy menetben, de a központi könyvtár is a fájl végére kerül, hogy megkönnyítse a fájlok könnyű eltávolítását a több részből álló (e.

Tömörítési módszerekSzerkesztés

A .ZIP fájlformátum specifikáció a következő tömörítési módszereket dokumentálja: Store (nincs tömörítés), Shrink (LZW), Reduce (1-4. szint; LZ77 + valószínűségi), Implode, Deflate, Deflate64, bzip2, LZMA, WavPack, PPMd, és az IBM z/OS CMPSC utasítás által biztosított LZ77 változat. A leggyakrabban használt tömörítési módszer a DEFLATE, amelyet az IETF RFC 1951 ír le.

A többi említett, de a specifikációban részletesen nem dokumentált módszer a következő: PKWARE DCL Implode (régi IBM TERSE), új IBM TERSE, IBM LZ77 z Architecture (PFS) és egy JPEG-változat. A “Tokenize” módszert egy harmadik fél számára tartották fenn, de a támogatást soha nem adták hozzá.

A PKWARE túlzásba viszi az Implode szót: a DCL/TERSE Implode különbözik a régi PKZIP Implode-tól, a Deflate elődjétől. A DCL Implode nem dokumentált, részben az IBM tulajdonjoga miatt, de Mark Adler ennek ellenére a zlib mellé egy “blast” nevű dekompresszort adott.

EncryptionEdit

AZIP támogat egy egyszerű jelszó alapú szimmetrikus titkosítási rendszert, amely általában ZipCrypto néven ismert. Ez dokumentálva van a ZIP specifikációban, és köztudottan súlyosan hibás. Különösen sebezhető az ismert nyílt szövegű támadásokkal szemben, amelyeket egyes esetekben a véletlenszám-generátorok rossz implementációja tovább ront.

A ZIP fájlformátum specifikációban az 5.2. verzió óta új funkciók, köztük új tömörítési és titkosítási (pl. AES) módszerek is dokumentálva vannak. A WinZip által kifejlesztett AES-alapú nyílt szabványt (“AE-x” az APPNOTE-ban) a 7-Zip és az Xceed is használja, de néhány gyártó más formátumokat használ. A PKWARE SecureZIP (SES, saját fejlesztésű) támogatja az RC2, RC4, DES, Triple DES titkosítási módszereket, a digitális tanúsítvány alapú titkosítást és hitelesítést (X.509), valamint az archívumfejlécek titkosítását is. Ez azonban szabadalmaztatott (lásd § Erős titkosítási vita).

A fájlnevek titkosítását a .ZIP File Format Specification 6.2 vezeti be, amely titkosítja az archívum központi könyvtárrészében tárolt metaadatokat, de a helyi fejlécrészek titkosítatlanok maradnak. Egy megfelelő archiváló meghamisíthatja a Local Header adatokat a Central Directory Encryption használata esetén. A specifikáció 6.2-es verziójától kezdve a Local Headerben a tömörítési módszer és a tömörített méret mezők még nem maszkoltak.

ZIP64Edit

Az eredeti .ZIP formátumban 4 GiB (232 bájt) volt a különböző dolgok (egy fájl tömörítetlen mérete, egy fájl tömörített mérete és az archívum teljes mérete), valamint egy ZIP-archívum 65 535 (216) bejegyzésének korlátja. A specifikáció 4.5-ös verziójában (ami nem azonos egy adott eszköz v4.5-ös verziójával) a PKWARE bevezette a “ZIP64” formátumbővítményeket, hogy megkerülje ezeket a korlátozásokat, és 16 EiB-ra (264 bájt) emelte a korlátokat. Lényegében egy “normál” központi könyvtárbejegyzést használ egy fájlhoz, amelyet egy opcionális “zip64” könyvtárbejegyzés követ, amely a nagyobb mezőkkel rendelkezik.

A helyi fájlfejléc és a központi könyvtárbejegyzés formátuma ugyanaz a ZIP és a ZIP64 esetében, de a méreteknél mindig 0xffffffffffff tárolt, és mindig van egy extra mező:

.

Zip64 kiterjesztett információ extra mező
Offset Byte Description
0 2 Header ID 0x0001
2 2 Az extra meződarab mérete (16, 24 vagy 28)
4 8 Az eredeti tömörítetlen fájl mérete
12 8 A tömörített adat mérete
20 8 A helyi fejlécrekord eltolási értéke
28 4 A lemez száma, amelyen ez a fájl kezdődik

A másik oldalon, a ZIP64 EOCD formátuma némileg eltér a normál ZIP verziótól (lásd a függelék 4. szakaszát.3.14).

.

.

.

Zip64 Központi könyvtárrekord vége (EOCD64)
Offset Byte Description
0 4 End of central directory signature = 0x06064b50
4 8 Size of the EOCD64 – 8
12 2 Version made by
14 2 Version szükséges a kivonatoláshoz (minimum)
16 4 A lemez száma
20 4 A lemez, ahol a központi könyvtár kezdődik
24 8 A központi könyvtár rekordjainak száma ezen a lemezen
32 8 A központi könyvtár rekordjainak száma összesen
40 8 A központi könyvtár mérete (byte)
48 8 A központi könyvtár kezdetének eltolódása, az archívum elejéhez képest
56 n Kommentár (az EOCD64 méretéig)

Ez sem feltétlenül az utolsó rekord az állományban, egy opcionális End of Central Directory Locator következhet (további 20 bájt a végén).

A Windows XP-ben a Fájlkereső nem támogatja a ZIP64-et, a Windows Vista és újabb operációs rendszerek Fájlkeresője viszont igen. Hasonlóképpen, néhány kiterjesztő könyvtár támogatja a ZIP64-et, például a DotNetZip, a QuaZIP és az IO::Compress::Zip Perlben. A Python beépített zipfile-ja a 2.5 óta támogatja, a 3.4 óta pedig alapértelmezés szerint. Az OpenJDK beépített java.util.zip fájlja a Java 7-es verziójától támogatja a ZIP64-et. Az Android Java API az Android 6.0 óta támogatja a ZIP64-et. A Mac OS Sierra Archive Utility nevezetesen nem támogatja a ZIP64-et, és hibás archívumokat hozhat létre, amikor a ZIP64-re lenne szükség. A Mac OS-hez mellékelt ditto parancs azonban kicsomagolja a ZIP64 fájlokat. A Mac OS újabb verzióiban az info-zip zip és unzip parancssori eszközei támogatják a Zip64-et: az ellenőrzéshez futtassa a zip -v parancsot, és keresse a “ZIP64_SUPPORT”-t.

Kombináció más fájlformátumokkalSzerkesztés

A .ZIP fájlformátum lehetővé teszi, hogy a fájl végén a központi könyvtár után egy legfeljebb 65 535 (216-1) bájtnyi adatot tartalmazó megjegyzés szerepeljen. Továbbá, mivel a központi könyvtár megadja az archívum minden egyes fájljának a kezdethez viszonyított eltolását, lehetséges, hogy az első fájlbejegyzés a nullától eltérő eltolással kezdődjön, bár egyes eszközök, például a gzip, nem dolgozza fel azokat az archívumfájlokat, amelyek nem nullával kezdődnek.

Ez lehetővé teszi, hogy tetszőleges adatok szerepeljenek a fájlban a ZIP-archívum adatai előtt és után, és az archívumot egy ZIP-alkalmazás továbbra is be tudja olvasni. Ennek mellékhatása, hogy lehetséges olyan fájlt írni, amely egyszerre egy működő ZIP-archívum és egy másik formátum, feltéve, hogy a másik formátum tolerálja a tetszőleges adatokat a végén, elején vagy közepén. A WinZip által támogatott önkitömörítő archívumok (SFX) ezt kihasználják, mivel ezek futtatható (.exe) fájlok, amelyek megfelelnek a PKZIP AppNote.txt specifikációnak, és a megfelelő zip-eszközökkel vagy könyvtárakkal olvashatók.

A .ZIP formátumnak és a ZIP egyik változatának, a JAR formátumnak ezt a tulajdonságát ki lehet használni arra, hogy egy látszólag ártalmatlan fájlba, például egy webre feltöltött GIF-képbe rosszindulatú tartalmat (például káros Java-osztályokat) rejtsenek. Ez az úgynevezett GIFAR exploit hatékony támadásként mutatkozott be olyan webes alkalmazások ellen, mint például a Facebook.

LimitsEdit

A .ZIP fájl minimális mérete 22 bájt. Az ilyen üres zip-fájl csak egy EOCD (End of Central Directory Record) rekordot tartalmaz:

Az archívumfájl és a benne lévő egyes fájlok maximális mérete 4 294 967 295 bájt (232-1 bájt, azaz 4 GiB mínusz 1 bájt) a szabványos ZIP esetében. ZIP64 esetén a maximális méret 18,446,744,073,709,551,615 bájt (264-1 bájt, azaz 16 EiB mínusz 1 bájt).

Proprietary extensionsEdit

Extra fieldEdit

.A ZIP fájlformátum tartalmaz egy extra mező lehetőséget a fájlfejléceken belül, amely a meglévő ZIP specifikációk által nem definiált extra adatok tárolására használható, és amely lehetővé teszi a mezők biztonságos kihagyását a kompatibilis archiválók számára, amelyek nem ismerik a mezőket. A 0-31 fejlécazonosítók a PKWARE számára vannak fenntartva. A fennmaradó azonosítókat harmadik fél gyártók saját használatra használhatják.

Erős titkosítási vitaEdit

Amikor 2003-ban megjelent a WinZip 9.0 nyilvános béta verziója, a WinZip bevezette saját AES-256 titkosítását, amely egy másik fájlformátumot használt, az új specifikáció dokumentációjával együtt. Maguk a titkosítási szabványok nem voltak szabadalmaztatottak, de a PKWARE 2001 óta nem frissítette az APPNOTE.TXT-t, hogy tartalmazza az erős titkosítási specifikációt (SES), amelyet a PKZIP 5.0 és 6.0 verziója használt. Kevin Kearney, a WinZip technikai tanácsadója és Mathew Covington, a StuffIt termékmenedzsere azzal vádolta a PKWARE-t, hogy visszatartja a SES-t, de Jim Peterson, a PKZIP technológiai vezetője azt állította, hogy a tanúsítvány alapú titkosítás még mindig nem teljes.

Egy másik ellentmondásos lépésként a PKWare 2003. július 16-án szabadalmat jelentett be, amelyben leírta a ZIP és az erős titkosítás kombinációjának módszerét egy biztonságos fájl létrehozásához.

A PKWARE és a WinZip végül megegyezett, hogy támogatják egymás termékeit. 2004. január 21-én a PKWARE bejelentette a WinZip-alapú AES tömörítési formátum támogatását. A WinZip egy későbbi béta verziójában már képes volt támogatni a SES-alapú ZIP fájlokat. A PKWARE végül kiadta a nyilvánosság számára a .ZIP fájlformátum specifikáció 5.2-es verzióját, amely dokumentálta a SES-t. A szabad szoftveres 7-Zip projekt szintén támogatja az AES-t, de nem a SES-t a ZIP-fájlokban (ahogy a POSIX portja, a p7zip is).

A WinZip alatt az AES titkosítás használatakor a tömörítési módszer mindig 99-re van állítva, a tényleges tömörítési módszer pedig egy AES extra adatmezőben van tárolva. Ezzel szemben az Erős titkosítási specifikáció a tömörítési módszert a Helyi fejléc és a Központi könyvtár alapvető fájlfejléc szegmensében tárolja, kivéve, ha a Központi könyvtár titkosítása a metaadatok maszkolására/titkosítására szolgál.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.