ZIPファイルの完全ガイド:歴史・構造・圧縮方式・暗号化・互換性と実務ベストプラクティス
ZIP とは — 概要
ZIP(ジップ)は、複数のファイルやディレクトリをひとつのアーカイブにまとめ、かつ圧縮して容量を小さくできるファイルフォーマット(およびその実装群)です。1989年にPKWAREのPhil Katz(フィル・カッツ)がPKZIPとして実装したことが広く知られており、以降長年にわたり事実上のデファクト標準として普及しています。Windows、macOS、主要なUnix系ツール、および多くのプログラミング言語がネイティブまたは標準ライブラリでサポートしています。
歴史と標準化
ZIP は 1989 年代に PKZIP として登場し、圧縮アルゴリズム DEFLATE(LZ77 とハフマン符号化の組合せ)を一般に普及させました。フォーマット仕様は PKWARE による APPNOTE(ZIP File Format Specification)で文書化され、後述する DEFLATE は IETF の RFC(RFC 1951)で記述されています。長年にわたり互換性を重視して発展し、ファイルサイズや個数の上限を超えるための拡張「ZIP64」なども導入されました。
内部構造(仕組み)
ローカルファイルヘッダ(Local File Header):各エントリ(ファイルごと)に付随するヘッダ。ファイル名や圧縮方式、CRC32、圧縮サイズ・非圧縮サイズなどのメタ情報を保持します。ストリーミングで作成する際はサイズが後で出ることがあるため、その場合は Data Descriptor(後述)を使います。
ファイルデータ:実際の(圧縮された)バイト列。
セントラルディレクトリ(Central Directory):アーカイブ末尾に置かれるインデックス。全エントリの一覧と詳細(相対オフセット、コメントなど)が格納され、これによりアーカイブを先頭から読み取らなくてもファイルを一覧・ランダムアクセスすることができます。
エンド・オブ・セントラルディレクトリレコード(EOCD):セントラルディレクトリの終端を示すレコードで、全体のエントリ数やセントラルディレクトリのサイズ・オフセットを記載します。ZIP64 拡張がある場合は追加のレコードが使われます。
主要な圧縮方式と関連規格
Stored(0):圧縮しない。そのまま格納。高速で可逆だが圧縮効果はない。
Deflate(8):最も一般的な方式。LZ77 によるマッチ検出とハフマン符号化を組合せた可逆圧縮。zlib(RFC 1950)や gzip(RFC 1952)でも DEFLATE が中心的に使われています。圧縮率と速度のバランスが良く、広く採用されています。
その他にも BZIP2、LZMA、PPMd などの方式をサポートする実装や拡張がありますが、標準的な互換性は実装に依存します(圧縮方式はヘッダの「method」番号で示されます)。
メタデータと文字コード
ZIP のヘッダはファイル名、コメント、タイムスタンプ、CRC-32(エラーチェック用)などを含みます。元来 ZIP は IBM Code Page 437(CP437)を基準としていましたが、国際化対応のために「UTF-8」フラグ(General Purpose Bit Flag のビット 11)を用いるなど、実装間での文字エンコーディングの扱いに注意が必要です。古いツールは CP932(日本語環境での Shift_JIS)やローカルコードページで扱うため、ファイル名の互換性問題が発生することがあります。
ZIP64 と容量制限
従来の ZIP フォーマットは 32-bit のサイズフィールドを使うため、個々のファイルサイズやアーカイブ全体のサイズ、エントリ数に 4 GB/65535 件の上限がありました。これを解決するために PKWARE が提案・実装したのが ZIP64 拡張で、64-bit のサイズを扱えるようにする追加ヘッダ/レコードを導入します。大容量ファイルや多数ファイルを扱う場合は ZIP64 を利用する必要がありますが、対応していない古いツールでは扱えないことがあります。
暗号化と署名
古い暗号(ZipCrypto / PKZIP stream cipher):互換性のために残っていますが、既に脆弱で解読が容易とされています。機密性を必要とする用途には適しません。
AES を用いた暗号化:WinZip などが導入した AES ベースの暗号化(強固な鍵管理)をサポートする実装も広がっています。ただし実装ごとに仕様(パスワード派生、ストレッチ、メタ情報の格納方法など)が異なり、相互運用性に注意が必要です。
デジタル署名:ZIP 内に署名情報や証明書を格納する仕組み(仕様や実装が複数)がありますが、これも全実装で普遍的にサポートされているわけではありません。
運用上の注意点(セキュリティと互換性)
Zip Slip(パス・トラバーサル):ZIP 内のエントリ名に「../」のような相対パスや絶対パスが含まれていると、解凍時に意図しない場所にファイルを展開してしまう危険があります。展開ツールは展開先のパスを正規化してチェックする必要があります(OWASP などで注意喚起されています)。
ZIP ボム(圧縮爆弾):極端に高い圧縮率のデータを用意し、解凍すると膨大なサイズになることでディスクやメモリを枯渇させる攻撃。受信した ZIP の自動解凍や検査には注意が必要です。
古い暗号の利用禁止:ZipCrypto は破られやすいため、パスワード保護が必要な場合は AES など強力な暗号を用いるか、圧縮後に外部でファイルを暗号化する(例:GPG)ことを推奨します。
ファイル名の文字コード:国際化環境では UTF-8 フラグや実装の互換性を確認してください。展開先で文字化けやファイル名衝突が起こることがあります。
実装とツール
コマンドライン・GUI:Unix 系の zip/unzip(Info-ZIP)、Windows のエクスプローラー内蔵機能、7-Zip、WinZip など多様な実装があります。
プログラミング言語のライブラリ:Python の zipfile、Java の java.util.zip、.NET の System.IO.Compression など標準でサポートされている場合が多いです。これらは DEFLATE を扱う機能やメタ情報の読み書きを提供しますが、ZIP64 や特殊圧縮方式、暗号化の対応状況はバージョンや実装差に注意してください。
相互運用性の観点:作成側と受信側でツールが異なると、暗号方式や圧縮方式、ZIP64 の有無、ファイル名エンコーディングで問題が発生します。配布先の環境を想定した設定(例:UTF-8 指定、ZIP64 の有無、AES 暗号利用)を選ぶことが重要です。
ZIP と他のアーカイブ形式の比較
比較対象としては tar.gz(tar + gzip)、tar.xz、7z、RAR などがあります。主な違いは次の通りです:
ランダムアクセス:ZIP はセントラルディレクトリによりランダムアクセスが容易。一方、tar 系はストリーム向けで(アーカイブの先頭から順に処理する)ランダムアクセスは困難です。
圧縮効率:7z / xz(LZMA2 など)は通常 DEFLATE より高い圧縮率を出しますが、圧縮・解凍の速度やメモリ要求も高くなり得ます。
互換性:ZIP は OS 標準で広くサポートされている点が利点です。複雑な圧縮方式や暗号を使うと互換性が落ちることがあります。
実務的なベストプラクティス
自動処理する場合は展開前にファイル名の正規化とパス検査を行い、Zip Slip を防ぐ。
機密性が必要なデータは ZIP の古い暗号に頼らず、AES ベースの暗号や外部の暗号化(GPG、OpenSSL など)を併用する。
大容量や多数ファイルを扱う場合は ZIP64 を利用し、受信側の互換性を確認する。
配布する ZIP はテスト環境で想定される受信ツールで展開テストを行う(ファイル名、パーミッション、タイムスタンプの保持など)。
まとめ
ZIP は長い歴史と高い互換性を持つ汎用的なアーカイブ形式で、ランダムアクセスに優れ、DEFLATE による適度な圧縮率を提供します。一方で、文字コード、暗号方式、ZIP64 の対応、セキュリティ(Zip Slip、zip bomb、弱い暗号)といった点で注意が必要です。運用においては用途と受信側環境に応じた設定と検査を行うことが重要です。
参考文献
- PKWARE — APPNOTE.TXT (ZIP File Format Specification)
- RFC 1951 — DEFLATE Compressed Data Format Specification
- RFC 1950 — ZLIB Compressed Data Format Specification
- RFC 1952 — GZIP File Format Specification
- Wikipedia — ZIP (file format)
- OWASP — Zip Slip Vulnerability
- Info-ZIP Project
- Snyk — Zip Slip: Arbitrary File Overwrite (解説記事)


