秘密鍵の保存方法について

パスワードのような他人に知られてはまずい情報をどのように管理するかは 悩ましいです。 これは暗号通貨の秘密鍵やマスタシードに限った話ではありませんが、暗号通貨は 以下のような特徴があるため、管理が難しくなっているかと思います。

  1. 非常に高額な資産も扱える
  2. 紛失すると二度と手に入らなくなる
  3. 盗まれると返してもらえる可能性は非常に低い

2については例えば銀行や取引所のパスワードでは、時間はかかりますが本人の証明 ができれば大抵は再発行できるでしょう。 1,3については大抵は1日の取引上限額があったりしますし、盗む人も中央へのアクセス しないといけないため足がつきやすく、全額がいきなり盗まれて犯人の手掛かりが全くな いということは考えにくいです。

さて、どうしたものでしょうか。

紛失のリスクと盗難のリスク

まず紛失が怖いので冗長化することや、とても頑丈な何かに記録することが必須 でしょう。

冗長化であれば複数のPCや記録媒体、紙などに記録していろんな場所に保管すれば よいでしょうか。あるいは複数のクラウドサーバへ保管しましょうか。

頑丈な何か、というのは例えば耐火プレートか何かに刻みつけるとか、頑丈な金庫 の中や貸金庫に保管するとかでしょうか。それでも一箇所にしか保管していないと いうのは不安に思います。

あるいは記憶はどうでしょうか。しかし歳をとるとに不安感が増してきますし、 若くても不慮の事故などで記憶が飛んでしまうこともあるでしょう。

やはり冗長化は避けて通れなさそうに思います。

しかし、冗長化すればするほど盗難のリスクが高くなりますよね。

秘密鍵を分散して保存

例えばfoo bar bazというマスタシードを分散かつ冗長化して保存したい場合、 3つに分けて1/3 foo, 2/3 bar, 3/3 bazのような紙を2枚ずつ合計6枚作成し、 これらを2種類ずつに分けて3個所に保存したらどうでしょうか。

  • 拠点A
    • 1/3 foo
    • 2/3 bar
  • 拠点B
    • 3/3 baz
    • 1/3 foo
  • 拠点C
    • 2/3 bar
    • 3/3 baz

仮に拠点Aが火事で燃えてしまったとすると、残りの4枚があれば復元すること が可能です。

拠点Aの2枚が盗まれたらどうでしょうか。2/3の情報が盗まれてしまったので3/3 のbaz部分をブルートフォースアタックされてしまうかもしれません。 拠点B,Cの4枚を慌てて回収してもこれは防ぐことができません。やられる前に別の ウォレットに移動するしかなさそうです。

ssssを使った秘密分散

ssssというソフトを使うともっといい感じに柔軟に分散させることが可能です。

point-at-infinity.org

さっそく実行してみましょう。

$ ssss-split -t 3 -n 6
Generating shares using a (3,6) scheme with dynamic security level.
Enter the secret, at most 128 ASCII characters: (foo bar bazを入力)
Using a 88 bit security level.
1-61c2c92a120d325a6bc48c
2-5cce244b08bd3b4f48b8c2
3-ef640c2cdfbad1369e4032
4-68ef3c65d085c08737e2bc
5-db45140207822afee11a5e
6-e649f9631d3223ebc26634

6行の文字列が生成されました。この6行のうち-tオプションで指定した数、この例 では3行を集めると復号化することができます。-nオプションで全体の個数を指定 できます。この例では6個です。

3,5,6を使って復号化してみます。

$ ssss-combine -t 3
Enter 3 shares separated by newlines:
Share [1/3]: 3-ef640c2cdfbad1369e4032
Share [2/3]: 5-db45140207822afee11a5e
Share [3/3]: 6-e649f9631d3223ebc26634
Resulting secret: foo bar baz

復号化できました。

さきほどの単純に3つに分割する方法と比べると、2つ盗まれても犯人は何も 情報を得られませんのでブルートフォースアタックの心配はなくなります。 また、盗まれたことに気付いた場合は残りの4枚を完全に消去してしまえば よいです。再度発行すれば別の文字列が得られますので、それに置き換え ればOKです。

まとめ

パスワードのような他人に知られてはまずい情報をssssを使って分散保存する方法を ご紹介しました。管理方法は人それぞれですが、1つの案として参考になれば幸いです。

Windows用のバイナリは今のところ見つけておりませんが、ソースは非常に小さく、 mini-gmpと組み合わせるとwasmで動作することも確認できております。 疑似乱数とUIをちゃんとすればブラウザ上でも使うことができるようになると思います。 (誰か作りませんか?)

なお、ssssはあまり大きなデータは保存できませんので、大きなデータを保存したい 場合はデータを暗号化し、そのパスフレーズなどの鍵を保存するようにすればよいか と思います。