暗号化と言えば昔はpgpだったが今はgnupg(gpg)かな。
Linuxで使えるパスワード管理CLIのpassというソフトがあるんだけど、それをうまく使っていこうと思ったんですよ。例えばVPSやクラウドのホスティングを借りてある種の計算をして自動で株取引をしようと思うじゃないですか。いやこれは本当に「例えば」の話なんだけど、VPS上のファイルに置いたスクリプトに認証情報をベタ書きしたり、設定ファイルにベタ書きするのは嫌じゃないですか。それで、passを使っていこうと。
passを使う場合は、パスワード情報はgpgを使って暗号化されて保存される。gpgの秘密鍵はVPSで借りているOSの中に置かれるので、奴らには丸見え。しかしパスフレーズをつけておけばVPSのプロバイダ側にも株取引のパスワードはバレないはず、というわけです。gpgの場合はgpg-agentってのがいて、入力したパスフレーズを勝手にメモリ上に持ってくれるので、一度入力しておけばどうにかなる。リブートした時だけ手で入力してあげればいい。
逆に言えば、VPSプロバイダはディスクだけ押収してもpass管理下のパスワードを得ることはできないんだけど、gpg-agentのメモリをダンプしてパスフレーズ(というか開錠済みの秘密鍵?)を得て、ディスクのダンプでgpgの秘密鍵ファイルとpassのファイルを得れば行ける。難易度もそれなりに上がるので、ベタ書きよりはだいぶマシになる。gpg-agentの設定でキャッシュのTTLを長く設定すれば、まあある程度実用にはなるかな。生パスワードでログインしなければいけないWebスクレイピングを無人でやろうとする限り、完璧にはならない。このリスクがいやならクラウドなんて言わずに自前のサーバでやるのがいいだろう。
しかし思ったのは、この種の暗号化は鍵の管理が面倒になるのが必然なのですよね。で、いつも使っていて誰もが持っている、sshの公開鍵を暗号化にも使いたいなぁと思った。ググると、やってる人は何人か見つけたよ。opensslのrsautlを使う方法。
- 公開鍵の形式を変換する
- ssh-keygen -f ~/.ssh/id_dsa.pub -e -m PKCS8 > pubkey.pem
- 暗号化
- openssl rsautl -encrypt -pubin -inkey pubkey.pem -in input-file -out encrypt-file
- 復号
たいていの人がsshの公開鍵をgithubに登録している時代。そしてgithubはAPIでユーザの公開鍵を自由に取得できるので、これがgpgよりも便利になるであろうことは想像できる。パスフレーズも、ssh-agentが覚えてくれる。ssh-agentのプロトコルはIETFのドラフトに仕様がある→ https://tools.ietf.org/id/draft-miller-ssh-agent-00.html
という感じで夢が広がっていたんですけれども、しかしこの方法だとある程度以上大きなファイルだとエラーになるんですよね。rsautlは貧弱すぎるのでは? 245バイトまでしか暗号化できない(data too large for key size)。しかもrsautlは最近スタンダードになっている楕円曲線系の鍵を使えないという欠点があります。そういやTLSのプロトコル的にも公開鍵を使うのは小さな(プリ)マスターシークレットのやりとりだけだったなぁ。
やっぱ暗号化にはgpg使うのが正しいのか…それにしても鍵の管理が面倒すぎる。共通鍵ならopensslにしろgpgにしろ、だいぶ簡単になる。openssl encとかgpg -cでいいので。データサイズの制限もないし。ただその共通鍵のパスフレーズ自体をVPS上のファイルに置いておきたくないからね。