ZIPファイル徹底解説:構造・圧縮方式・セキュリティ・運用のベストプラクティス
はじめに — ZIPファイルとは何か
ZIPファイルは複数のファイルやディレクトリを1つのアーカイブファイルにまとめ、圧縮や保存を容易にするための汎用フォーマットです。1989年にPhil KatzがPKZIPとして発表して以来、互換性の高さと実装の容易さから広く普及しました。WindowsやmacOS、Linuxの標準ツール、ならびに多くのプログラミング言語ライブラリがZIPをサポートしています。
歴史と発展
ZIPは最初にPKZIP形式で登場し、データ圧縮アルゴリズムとしてDeflate(DEFLATE)が標準的に使われるようになりました。後にファイルサイズやファイル数の制限(4GB、65535エントリ)を超える用途に対応するためZIP64拡張が導入されました。暗号化については初期のZipCrypto(弱い独自方式)に続き、AESベースの拡張(WinZip AESなど)が普及しています。
ZIPファイルの内部構造(概要)
- ローカルファイルヘッダ(Local File Header):各ファイルごとに格納され、ファイル名、圧縮方法、CRC32、圧縮後/前のサイズなどの情報を含みます。
- ファイルデータ:実際の圧縮データまたは格納データ(stored)本体。
- セントラルディレクトリ(Central Directory):アーカイブ全体の目次に相当し、各エントリに対するメタデータがまとめて格納されます。検索や一覧取得を高速にします。
- End of Central Directory(EOCD)レコード:セントラルディレクトリの終端を示すレコードで、アーカイブの終了位置やエントリ数などが含まれます。ZIP64ではEOCD拡張が追加されます。
代表的な圧縮方式
- DEFLATE:最も一般的。LZ77とハフマン符号を組み合わせた方式で、互換性が高い。
- STORE(格納):圧縮を行わず、そのまま格納するモード。すでに圧縮済みのファイルを再圧縮したくないときに使う。
- BZIP2 / LZMA / PPMd:一部のZIP実装でサポートされる高圧縮率アルゴリズム。ただし、対応状況はクライアント依存で互換性に注意が必要。
暗号化と署名
ZIPの暗号化には大きく分けて旧来のZipCryptoと、より強力なAESベースの方式があります。ZipCryptoは既知の脆弱性があり機密性確保には不向きです。AESベース(WinZip AESや仕様ベースの拡張)は現実的に安全ですが、実装間の互換性やメタデータの扱いに差があるため、相手環境で復号可能かあらかじめ確認することが重要です。署名についてはPKCS#7などを組み合わせたデジタル署名のサポートが一部実装にありますが、標準的な機能ではありません。
ZIP64とサイズ/件数の限界
従来のZIPは4GBと65535件の制約があり、大容量データや多数ファイルを扱う場合はZIP64が必須です。ZIP64は拡張フィールドで64ビットのサイズ情報を保持しますが、古いツールはZIP64をサポートしないため注意が必要です。運用で大きなアーカイブを作るときは、利用クライアントがZIP64対応であることを確認してください。
文字エンコーディングと互換性
ファイル名の文字コードは歴史的な経緯から混在しやすく、CP437(IBM PCのデフォルト)やローカルコードページ、UTF-8が混在する問題があります。Info-ZIPではGeneral Purpose Bit Flagの11ビット(EFSフラグ)でUTF-8を指定できますが、全ての実装がこれを尊重するわけではありません。日本語ファイル名を含むZIPをやり取りする場合は、UTF-8対応クライアントを利用するか、ファイル名を事前にASCII化しておくなどの対策が有効です。
セキュリティ上の注意点
- Zip Slip(パストラバーサル):悪意あるZIPに"../"を含むパスがあると、解凍時に任意の場所へファイルが上書きされる恐れがあります。解凍前に展開先パスの正規化と検証を必ず行ってください。
- Zip Bomb(圧縮爆弾):小さなZIPが展開すると膨大なデータになるケース。自動解凍サービスやサーバーでは解凍時の展開サイズ、ファイル数、再帰的な圧縮率に上限を設けるべきです。
- 弱い暗号の使用:ZipCryptoは既に解析されており、機密情報を守る手段としては不十分です。機密性が必要ならAESベースや別途TLS/PGPで保護してください。
- メタデータの信頼性:CRC32は転送エラーや不正改ざんの検出には有用ですが、強力な改ざん検出(署名)ではありません。真正性が重要な場面ではデジタル署名やHMACなどを併用してください。
運用とベストプラクティス
- 大容量/多数ファイルのアーカイブにはZIP64を使用し、受け手の対応を確認する。
- 機密情報の送付はZIPの暗号に依存せず、TLSやPGP/ S/MIME、あるいはAESで保護されたZIPで二重保護する。
- 自動解凍サーバーではパストチェックと展開サイズ上限、タイムアウトを設定する。
- ファイル名のエンコーディングに注意し、必要ならファイル名変換やUTF-8利用を明示する。
- 圧縮アルゴリズムは互換性優先ならDEFLATEを、圧縮率優先ならクライアント互換性を確かめてから他方式を選択する。
実用ツールとライブラリ
代表的なコマンドラインとGUIツールにはzip/unzip(Info-ZIP)、7-Zip、WinZip、macOSのアーカイブユーティリティなどがあります。開発用ライブラリは言語別に充実しており、例としてPythonのzipfile、Javaのjava.util.zip、.NETのSystem.IO.Compression、Goのarchive/zipなどが挙げられます。これらを使う際はZIP64、圧縮方式、文字コード、暗号化のオプションをライブラリが対応しているか確認してください。
トラブルシューティングのポイント
- アーカイブが開けない場合:ZIP64や非標準圧縮方式(LZMA等)を疑う。
- ファイル名が文字化けする場合:送信側の文字コードと受信側のデコーディング(CP437/UTF-8)を確認する。
- 解凍で上書きや不正配置が発生する場合:パス検証ロジックを実装し、絶対パスや".."を弾く。
- 復号できない場合:暗号方式の種類(ZipCrypto、AES)とパスワードに誤りがないか、また互換性を確認する。
将来の方向性と代替フォーマット
ZIPは依然として広く使われていますが、コンテナの要件が変わるにつれて代替フォーマット(tar+gz/tar.xz、7z、zstdベースのアーカイブなど)を検討する場面も増えています。特に高速圧縮や高圧縮率、ストリーミング適性、並列処理、より強力な暗号・署名サポートが必要な場合は、用途に応じてフォーマット選定を行うことが重要です。
まとめ
ZIPファイルは歴史が長く互換性の高いアーカイブフォーマットですが、運用では文字コード、ZIP64対応、暗号方式、セキュリティ対策に注意が必要です。機密性や完全性を求める場合は、AESやデジタル署名、あるいは別の暗号化手段との併用を検討し、解凍処理を行うサービス側ではパストラバーサルや圧縮爆弾対策の実装を行ってください。
参考文献
- APPNOTE.TXT — PKWARE ZIP File Format Specification
- Zip (file format) — Wikipedia
- RFC 1951 — DEFLATE Compressed Data Format Specification
- ZIP64 — Wikipedia
- NIST Special Publication — Cryptographic Standards (参考:暗号利用の観点)
- Zip Slip Vulnerability — Snyk


