技術書のPDFを頒布するときによく使われるのが、以下の方法:
- PDFを暗号化されたZIPファイルにする
- 暗号化されたZIPファイルをBOOTHなどに置く
- ダウンロードカードなどでダウンロードURLと解凍するためのパスワードを伝える
このとき便利な、パスワードを自動生成し、そのパスワードを使って暗号化されたZIPファイルを生成するツールを作ってみた。
※動作要件
Rubyが動く
-P
オプションをサポートしたzipコマンドが動く
よくある問題とその対策
「パスワードを用意してZIP圧縮するなんて、手動でちょちょいとやればいいんじゃないの?」という声もありそうだけど、以下のような問題がある:
1. パスワードに判別しづらい文字が使われてしまう
0
とO
、1
とl
のように、フォントによっては判別しづらい文字がある。
ランダムな文字を適当に使ってパスワードを作ると、そういった判別しづらい文字が使われてしまう可能性がある。
そこで、以下の文字はパスワードに使われないようにした:
0
、o
、O
1
、l
、I
2
、z
、Z
5
、s
、S
6
、b
g
、q
k
、K
2. 最新でないファイルを暗号化ZIPにしてしまう
手動でファイルを暗号化する場合、元のPDFを更新したのに暗号化ZIPの方は更新し忘れるといった可能性がある。
これを防ぐには暗号化ZIPの作成まで自動ビルドシステムに組み込んでしまった方がいい。
そこで、パスワード文字列をユーザが手入力する必要のないコマンドラインツールを用意した。
想定ユースケース
想定ユースケースは次の2つ:
- PDFとは別にダウンロードカードを用意する場合
- 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だけでも頒布したければダウンロードカードを用意するとよさそう。
今日はここまで!