OpenPGPの主鍵の秘密鍵は絶対に漏洩させても紛失させてもいけないため、取り扱いが難しい。よく行われる方法として以下の方法があるようだ。
- ネットワークから遮断された状態のストレージに保存する。
- 紙に印刷する。
そしてこれを実施した後、普段使用しているGnuPGのデータベース内からは削除してしまうようだ。普段使いしている機械は、様々なリクスを抱える事になるから、重要な情報は保存しないという事なのだろう。なるほど、これは取り扱いが難しい。
ネットワークから遮断された状態のストレージは、手元にあるMicroSDにでも焼いておこう。消えてしまいそうだけど。紙での印刷については2種類用意した方が良さそうだ。
1つはASCII Armor形式のもの。ASCII Armorは鍵のデータをASCII radix-64に変換し、ヘッダーとフッターを付与する12。もう1つは、QRコード等の画像から読取可能な2次元コードが良い。また2次元コードはASCII Artで表現されていて、CUIコンソールで表示できるとなお良い。
QRコードを生成する為に、Python3とqrcodeライブラリを使用する。
pip3 install qrcode
qrcodeを入れるとqrコマンドを使用できる。このコマンドは標準入力からデータを受け取りQRコードを生成する。
対象となる鍵のフィンガープリントを確認する。
gpg --list-secret-keys
秘密鍵を出力しファイルとして保存する。
gpg --export-secret-key --armor フィンガープリント > primary-priv-key.aarmor
次にこのファイルから、QRコードを生成する。
qr < primary-priv-key.aarmor > primary-priv-key.png
pgpコマンドに --armor
を指定するとASCII Armor形式で出力される。指定しなければバイナリデータが標準出力に出力される。これら2つをPNG形式のQRコードを生成すると、ASCII Armor形式を元にしたQRコードのサイズは約6KBだったのに対し、バイナリデータを元にしたQRコードのサイズは約3KBだった。約2倍の差があるためバイナリの方が良いのではとも思えるが、そもそものサイズが小さい事と、ASCII Armor形式の方がQRコードを読み取った後にも確認がしやすいだろうと考え、ASCII Armor形式を使う事にする。またPNGとSVGについても比較してみたが、ASCII Armor形式を元にしたSVGのサイズが352KBとなった。これは大きすぎるため、ASCII Armor形式を元にしたPNG形式のQRコードを生成する事にする。
この2つのファイルはMicroSDに焼いて、肌身離さないで置く。MicroSDなので、消えてしまうリスクは十分にあるけれど、消えないストレージというものは存在しないので、年に1度程度定期的に書き込みを行う運用フローにしようと思う。またこれらのファイルを紙に印刷してしまって置こうと思う。