1.

ZIP(.zip)完全ガイド — PKWARE 仕様・AES-256・ZipSlip 脆弱性・ZIP64・他形式比較

編集
この記事の要点
  • ZIP は 1989 年に PKWARE 社の Phil Katz が開発した、アーカイブと圧縮を一体で行うファイル形式
  • 圧縮アルゴリズムは Deflate が標準で、Windows / macOS 双方が OS 標準で読み書き可能
  • AES-256 暗号化に対応するが、レガシーな ZipCrypto 方式は脆弱なので使用すべきでない
  • ZipSlip 脆弱性(パストラバーサル)に注意。エントリ名に ../ を含むものを検証なく展開すると任意のディレクトリに書き込まれる
  • 従来仕様は 65,535 ファイル / 4GB 制限。これを超える場合は ZIP64 拡張が必要
  • マジックナンバーは 50 4B 03 04(ASCII で PK..)

概要

ZIP は 1989 年に米 PKWARE 社の Phil Katz が公開した、ファイル名・属性・複数ファイルのまとめ(アーカイブ)と、データの圧縮を 1 つの形式の中で同時に行う ファイルフォーマットです。Unix 系で広く使われる「tar でまとめてから gzip で圧縮する」二段構えとは対照的に、ZIP は各エントリを個別に圧縮してから 1 ファイルに格納するため、特定のファイルだけを取り出す(ランダムアクセス)のが高速という利点があります。

仕様は APPNOTE.TXT として PKWARE が公開しており、互換実装が容易だったことから世界中に普及しました。Windows は XP 以降「圧縮フォルダー」として、macOS は「アーカイブユーティリティ」として OS 標準で読み書きをサポートしており、ユーザーが追加ソフトを入れずに扱える「事実上の世界標準アーカイブ形式」となっています。

Microsoft Office の .docx / .xlsx / .pptx や、Java の .jar、Android の .apk、EPUB 電子書籍など、多くのコンテナ形式が中身は ZIP です。拡張子だけ変えれば unzip で中身を覗けることが多いのは、ZIP がそれだけ広く採用されている証拠です。

内部構造とマジックナンバー

ZIP ファイルは大きく分けて以下の 3 領域から構成されます。

  • ローカルファイルヘッダ + データ — 各ファイルごとに繰り返し格納。マジックは 50 4B 03 04(PK\x03\x04)
  • セントラルディレクトリ — ファイル一覧の索引。末尾近くに置かれる。マジック 50 4B 01 02
  • EOCD(End of Central Directory Record) — 末尾の固定位置にある終端マーカー。マジック 50 4B 05 06

展開ツールは「ファイルの末尾を読んで EOCD を見つける → セントラルディレクトリを読む → 各エントリにシークする」という順で動きます。末尾基準で動く ため、ZIP の前にゴミが付いていても、自己解凍 EXE のようにヘッダにバイナリが付いていても動作するのが特徴です(self-extracting archive の仕組みもこれを利用)。

圧縮方式(compression method)は仕様上は複数選べますが、実運用では method=8(Deflate)がほとんどです。ZIP64 拡張では method=12 (BZIP2)、method=14 (LZMA)、method=93 (Zstandard) なども定義されていますが、対応していない解凍ソフトに渡すと開けないため、互換性重視なら Deflate に留めるのが安全です。

主な用途

  • メール添付やクラウドストレージ経由でのフォルダ受け渡し(Windows/Mac/Linux のどこでも開ける)
  • ソフトウェア配布アーカイブ(バイナリ + 設定 + README をひとまとめに)
  • Office Open XML(.docx/.xlsx/.pptx)、Java JAR、Android APK、EPUB のコンテナ
  • Web からのダウンロード(複数ファイルを 1 リクエストで取得させたい場面)
  • パスワード付き機密データの簡易配布(AES-256 を使うこと、ZipCrypto は避けること)

関連形式との比較

形式圧縮率速度暗号化OS 互換性備考
ZIP (Deflate)速いAES-256 / ZipCryptoWindows/macOS 標準事実上の世界標準
7z非常に高い遅いAES-256要 7-ZipLZMA2 + 固体圧縮
tar.gz速いなし(GPG 併用)Unix 標準パーミッション保持
RAR高いAES-256要 WinRAR独占仕様
Zstandard中〜高非常に速いなし新興解凍が極めて速い

コマンド・ツール

# フォルダを ZIP に圧縮(Linux/macOS)
zip -r archive.zip mydir/

# ZIP を展開
unzip archive.zip

# 中身一覧(展開せず確認)
unzip -l archive.zip

# パスワード付き ZIP を作成(AES-256)
# ※標準の zip コマンドは ZipCrypto のみ。AES-256 が要るなら 7z を使う
7z a -tzip -p'mypassword' -mem=AES256 secret.zip mydir/

# 文字化け対策で Shift_JIS のファイル名を UTF-8 に変換しつつ展開
unzip -O cp932 archive.zip   # Info-ZIP 6.0 以降

# Windows PowerShell 5.1+
Compress-Archive -Path .\mydir\* -DestinationPath archive.zip
Expand-Archive -Path archive.zip -DestinationPath .\out\

注意点・落とし穴

  • ZipSlip 脆弱性 — エントリ名に <../../etc/passwd> のようなパストラバーサルが含まれる ZIP を、検証なしで展開するライブラリは任意のパスへ書き込まれてしまう。展開先のディレクトリ配下に正規化後のパスが収まるかを必ずチェックする。
  • ZipCrypto は破られる — 既知平文攻撃で短時間で復号される。パスワード保護を使うなら必ず AES-256 を指定する。
  • ファイル名の文字コード — 古い ZIP は Shift_JIS、新しい ZIP は UTF-8(汎用フラグ bit 11 で示す)と混在しがちで、Windows/macOS/Linux 間で文字化けが起きる。unzip -O cp932 や 7-Zip の文字コード指定で対処する。
  • 4GB / 65,535 ファイル制限 — 従来仕様の限界。これを超える場合は ZIP64 拡張が必要だが、古い解凍ソフトでは開けない可能性がある。
  • Symlink/特殊ファイル — Unix のシンボリックリンクや特殊属性は ZIP では完全には表現できない。これらを保ちたいなら tar を使う。

関連リンク

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. ZIP(.zip)
  2. TAR(.tar)
  3. GZ / GZIP(.gz / .tgz)
  4. 7z(.7z)
  5. RAR(.rar)
  6. BZ2 / BZIP2(.bz2 / .tbz2)
  7. XZ / LZMA2(.xz / .txz)
  8. Zstandard(.zst / .zstd)
  9. CAB(.cab)
  10. LZH(.lzh / .lha)

最近更新/作成されたページ