« ^ »
所要時間: 約 3分

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度程度定期的に書き込みを行う運用フローにしようと思う。またこれらのファイルを紙に印刷してしまって置こうと思う。