いものやま。

雑多な知識の寄せ集め

自動生成パスワードで暗号化ZIPを作るツールを作ってみた。

f:id:yamaimo0625:20200122103438j:plain

技術書のPDFを頒布するときによく使われるのが、以下の方法:

  1. PDFを暗号化されたZIPファイルにする
  2. 暗号化されたZIPファイルをBOOTHなどに置く
  3. ダウンロードカードなどでダウンロードURLと解凍するためのパスワードを伝える

このとき便利な、パスワードを自動生成し、そのパスワードを使って暗号化されたZIPファイルを生成するツールを作ってみた。

※動作要件
Rubyが動く
-Pオプションをサポートしたzipコマンドが動く

よくある問題とその対策

「パスワードを用意してZIP圧縮するなんて、手動でちょちょいとやればいいんじゃないの?」という声もありそうだけど、以下のような問題がある:

1. パスワードに判別しづらい文字が使われてしまう

0O1lのように、フォントによっては判別しづらい文字がある。
ランダムな文字を適当に使ってパスワードを作ると、そういった判別しづらい文字が使われてしまう可能性がある。

そこで、以下の文字はパスワードに使われないようにした:

  • 0oO
  • 1lI
  • 2zZ
  • 5sS
  • 6b
  • gq
  • kK

2. 最新でないファイルを暗号化ZIPにしてしまう

手動でファイルを暗号化する場合、元のPDFを更新したのに暗号化ZIPの方は更新し忘れるといった可能性がある。
これを防ぐには暗号化ZIPの作成まで自動ビルドシステムに組み込んでしまった方がいい。

そこで、パスワード文字列をユーザが手入力する必要のないコマンドラインツールを用意した。

想定ユースケース

想定ユースケースは次の2つ:

  1. PDFとは別にダウンロードカードを用意する場合
  2. PDF内に解凍パスワードを用意する場合

1.の場合、パスワードの自動生成と暗号化ZIPファイルの作成は同時にやっていい。
一方2.の場合、まずはパスワードを自動生成し、それをPDF内に入れてから、生成済みのパスワードを使って暗号化ZIPファイルの作成をすることになる。

作ったツールはこのどちらのユースケースにも対応してある。

作ったツールとインストール方法

作ったツールはpasszip。

インストールはgemコマンドで出来る:

$ gem install passzip

(※システムのRubyを使ってる場合、sudoが必要かも)

使用方法

まず、パスワードの自動生成と暗号化ZIPファイルの生成を同時に行う場合、以下のようにする:

$ passzip <暗号化ZIPにしたいファイル>

こうすると、<ファイル名>.zipという暗号化ZIPファイルと、<ファイル名>.passという暗号化に使ったパスワード(=復号&解凍に使うパスワード)が書かれたテキストファイルが作られる。
あとはこのパスワードの書かれたダウンロードカードを用意すればいい。
(※実行するたびにパスワードは新しく生成されるので、生成済みのパスワードを使いたい場合は後述の方法を使う)

次はパスワードの自動生成と暗号化ZIPファイルの生成を別に行う場合。

パスワードの自動生成をするには、以下のようにする:

$ passzip -g <暗号化ZIPにしたいファイル>

これで生成されたパスワードの書かれた<ファイル名>.passだけ用意される。

そして、PDF内にパスワードを書いたら、以下のように暗号化ZIPファイルを作る:

$ passzip -e <暗号化ZIPにしたいファイル>

こうすると既に存在する<ファイル名>.passに書かれたパスワードを使って<ファイル名>.zipという暗号化ZIPファイルが生成される。

補足説明

パスワードの長さはデフォルトで10文字。
もし、もっと短くていい/もっと長くしたい場合は、-lオプションで長さを指定する。

# (例)パスワードの長さを16文字にする
$ passzip -l 16 hoge.pdf

なお、パスワードをファイルとして残すので、セキュリティ的にはけっこうガバガバ。
なので、不特定の複数ユーザが使うようなシステムでは使わない方が安全だと思う。
(当然、publicなリポジトリにコミットしたらパスワード見放題なので、privateなリポジトリにするかコミットしない方が安全)

ダウンロードカードを用意するかどうか

ちなみに、技術書典などのイベントで頒布するなら、ダウンロードカードを用意するかどうかも考えたいところ。

ダウンロードカードを用意した場合、次のようなメリットがある:

  • 即売会でPDFだけ売れる(ダウンロードカードだけを渡す)
  • 紙の本が売り切れてもダウンロードカードだけ販売できる(※ダウンロードカードは比較的安く印刷できるので紙の本より多く用意できる)

一方、デメリットも:

  • ダウンロードカードをデザインして入稿する必要がある
  • PDFだけ欲しがる人が多い場合に、紙の本と同数のダウンロードカードを最低限残しておく必要がある
  • 頒布時にダウンロードカードを渡す手間が発生する(最悪、渡しそびれる可能性あり)
  • とらのあなさんなどに委託する場合、おまけとしてダウンロードカードを渡す必要があるが、その扱いがけっこう面倒

なので、基本的には本の中にパスワードを書いてしまった方がいいと思う。
そのうえで、PDFだけでも頒布したければダウンロードカードを用意するとよさそう。

今日はここまで!