Javaでのパスワード付きzipファイルの圧縮/解凍方法(ZipCrypto/AES)

先日、JavaでのZIP暗号化の考察という記事を書きましたが、zip4jのメンテナンスが再開されており、バージョン2系が公開されていましたので、これを使って通常のzip圧縮/解凍、パスワード付きzip圧縮/解凍(ZipCrypto, AES256)のサンプルを作成してみました。

概要

  • zip4jはSrikanth Reddy Lingalaさんが開発しましたが2013年にメンテナンスが止まっていました。その後、JavaでのZIP圧縮ライブラリとしてzip4jが有名になったため、メンテナンスの再開を決意されたそうです。メンテナンスを再開してからのリリースは、バージョン2系として公開されています。
  • zip4jの公式サイトはGitHubのzip4jです。
  • バージョン2系では、より短いコードで簡単にファイル/ストリーム操作を行えるようになっています。単純な圧縮/解凍であればワンライナーでプログラミングが終わります。その他、処理状況を把握するためのプログレスモニターが追加されています。
  • バージョン2系の実行には、JRE8以上が必要となります。
  • 下記の調査結果の通り、Windows圧縮/解凍ではAES256を扱えませんが、その他のWindows、7-zip、Zip4j間での圧縮・暗号化の互換性は問題ありません。ファイル名に日本語が含まれる場合は文字化けする場合があるので、可能であれば日本語ファイル名を使用しないような設計を推奨します。
  • 解凍すると1GBになるようなファイルの解凍を試しましたが、特に大きくメモリを消費することもありませんでした。

サンプルコード

ソースコード

  • zip4jを使って、通常のZIP圧縮/解凍、パスワード付き圧縮/解凍(ZipCrypt, AES256)を行うサンプルです。JUnitで実行できます。
  • create(), extract()はWebサーバ上で使う想定のサンプルになっています。Webサーバにアップロードしたzipファイルを、サーバ上のファイルシステムに展開し、何らかの業務処理を行った後に、zipファイルのストリームに戻す、という想定です。
  • Webサーバにアップロードされたファイルは、サーバ上のプログラムからはInputStreamで参照することになります。そのため、解凍テスト用のメソッドextractTestでは、zipファイルの読み取り元としてInputStreamを使用します。
  • Webサーバ上に展開されたフォルダ内容をzipファイルとしてダウンロード、DBに登録する場合を想定します。このような場合、zipファイルの内容をOutputStreamに出力することになります。そのため、圧縮テスト用のcreateTestでは、zipファイルの出力先としてOutputStreamを使用します。
  • 内部的にメモリを大量に消費していないかを確認できるよう、debugメソッドでメモリ使用状況を出力するようにしています。
  • mavenを使う前提のサンプルになっています。
  • 分かりやすさを優先した関係で、一部でリソース解放やセキュリティの考慮がありませんので、業務で使用する際には検討してください。

mavenを使う前提であり、pom.xmlでzip4jライブラリを指定します。

実行結果の例

※パスが長すぎるので一部を”…”で省略しています。

補足

Windows、7-zip、zip4jの圧縮・解凍の互換性を確認しました。
確認で使用したのは、Windows10、zip4jは2.2.3、7-zipは19.00(x64)です。

変換元変換先成否備考
Windows圧縮zip4j解凍OK
7-zip圧縮OK
7-zip圧縮(ZipCrypto)OK
7-zip圧縮(AES-256)OK
zip4j圧縮Windows解凍OK
7-zip解凍OK
zip4j解凍OKディレクトリのエントリが含まれていないようで、ファイル作成時に親ディレクトリの存在確認(205~208行目)が必要
zip4j圧縮(ZipCrypto)Windows解凍OK
7-zip解凍OK
zip4j解凍OKディレクトリのエントリが含まれていないようで、ファイル作成時に親ディレクトリの存在確認(205~208行目)が必要
zip4j圧縮(AES-256)Windows解凍NGWindows圧縮/解凍はAES未対応(こちらの記事を参考のこと)
7-zip解凍OK
zip4j解凍OKディレクトリのエントリが含まれていないようで、ファイル作成時に親ディレクトリの存在確認(205~208行目)が必要

日本語を含んだファイルの圧縮/解凍の正常性も確認しました。

変換元変換先成否備考
Windows圧縮zip4j解凍NGファイル名が文字化けし、ファイルを作成できない場合がある。
7-zip圧縮
zip4j圧縮Windows解凍OK
7-zip解凍OK
zip4j解凍OK