見出し画像

Metamaskのシークレットリカバリーフレーズ(シードフレーズ)の正体

Metamaskのウォレットのシークレットリカバリーフレーズ(Secret Recovery Phrase)は、ウォレットを復元するための単語列のことです。この単語列は、ウォレットを作成する際にランダムに生成され、利用者によって保存されます。

例:abandon, ability, able, about, above, absentなど

このシークレットリカバリーフレーズは,Metamaskが作った用語です.文献などでは「シードフレーズ」と呼ばれます.「シードフレーズ」は、ウォレットを紛失した場合やデータが破損した場合に、ウォレットを復元するための重要な情報となります。ただし、シードフレーズはセキュリティ上重要な情報であるため、安全な場所に保管しておくことが推奨されます。Metamaskは,「シードフレーズ」ではこの重要性が十分に伝わらないと判断し,2021年以降,「シークレットリカバリーフレーズ」という言葉に変更したようです.この記事では一般的な用語である「シードフレーズ」を用います.

Metamaskでウォレットを作成する際に,利用者はシードフレーズを書き留めることから始めます.一体このシードフレーズとは何者なのでしょうか.文献やBIP-32,BIP-39などの仕様を元に探ります.

全体像

Metamaskにおけるシードフレーズは,乱数を元に作成したルートシードと呼ばれる文字列を11ビット毎に分割し,BIP-39で定める英単語リストに変換したものです.ブロックチェーン上でトランザクションを行うために必要となる秘密鍵,公開鍵,ウォレットアドレスは,このルートシードから導出することが出来ます.全体像を図に示します.

図.乱数からシードフレーズ,秘密鍵のマスター生成までの流れ

①乱数を生成

まず,乱数生成器(RNG)で128~512ビットを生成します.
Metamaskは,128ビットの乱数を自動で生成します.128ビットの乱数とは,0か1の数字(1ビット)をランダムに128回選択し,1つのデータにつなげたものなのです.
この処理は,オフラインでも可能である点がポイントです.偶然に同じ乱数が生成される確率が極めて低いことから,このような仕様となっています.

②チェックサムを生成

SHA-256と呼ばれるハッシュ関数を用いて,①の乱数をハッシュ化します.ハッシュ化したデータの先頭のうち,データ長の32分の1のビットをチェックサムとして用います.
Metamaskの場合,乱数は128ですので,チェックサムは4ビットです.

③ルートシードを生成

①と②で生成した乱数,チェックサムを結合して,ルートシードを生成します.このルートシードは,BIP-32ではマスターシード(Master Seed)と呼ばれます.
Metamaskの場合,ルートシードは132ビットです.内訳は乱数が128ビット,チェックサムが4ビットです.

④ルートシードを11ビット毎に分割

⑤のシードフレーズを生成に前処理として,③で生成したルートシードを11ビット毎に分割します.
Metamaskの場合,132ビットを11ビット毎に分割するため,ルートシードは12個に分かれます.

⑤シードフレーズを生成

シードフレーズは,BIP-39などの規格でビット列との組み合わせが規定されています.

0001 abandon
0002 ability
0003 able
0004 about
0005 above



2047 zone
2048 zoo

https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt

BIP-39とは、ウォレットを復元するためのシードフレーズを生成するための仕様のことです。この仕様に従って生成されたシードフレーズをニーモニックとも呼ぶことがあります.
ニーモニックは、ウォレットを紛失した場合やデータが破損した場合に、ウォレットを復元するための重要な情報となります。
BIP-39には、単語のリストが定義されており、このリストからビット列に該当する単語を選択してニーモニックを生成することができます。

Metamaskのシードフレーズは,12個の英単語です.なお,シードフレーズは,BIP-39の英単語リストでルートシードに変換できます(上図の④',⑤').この仕組みにより,シードフレーズが同じであれば異なるデバイスのMetamaskで同じウォレットを使うことができます.

⑥鍵ストレッチ関数にルートシード,ソルトを代入

このルートシードから512ビットのシードを導出するために鍵ストレッチ関数であるHMAC-SHA512あるごリスズムを用いたPBKDF2を使います.鍵ストレッチ関数の引数は,ルートシードとソルトです.このストレッチは,引き伸ばしという意味で使われています.
ソルトは,文字列定数のmnemonicと任意の文字列であるパスフレーズを結合したものです.パスフレーズはオプションですので,指定しないことも可能です.
Metamaskでは,パスフレーズは使用していないようです.

なお,Metamaskにおける「パスワード」はパスフレーズとは異なります.「パスワード」は「パスフレーズ(Secret Recovery Phrase)の複合化に使われます.詳細は下記のとおりです.

MetaMaskは、パスワードを使ってSecret Recovery Phraseをローカルに暗号化します。つまり、ウォレットをロックすると、自分でパスワードを入力するまで誰もあなたの資金を使用することはできません。パスワードを忘れた場合でも、Secret Recovery Phraseを用いることでアカウントへのアクセスが再度できるようになります。つまりSecret Recovery Phraseは、ウォレットにアクセスするためのあなただけの鍵だからです。紛失してしまうと、MetaMaskも、他の誰にもあなたのSecret Recovery Phraseを変更したり復元することはできないと理解しておくことが重要です。しっかりと守ってください。

https://metamask.zendesk.com/hc/ja/articles/360060826432--Secret-Recovery-Phrase-%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B-%E6%9A%97%E5%8F%B7%E3%82%A6%E3%82%A9%E3%83%AC%E3%83%83%E3%83%88%E3%82%92%E5%AE%89%E5%85%A8%E3%81%AB%E4%BF%9D%E3%81%A4%E6%96%B9%E6%B3%95

⑦シードの生成

⑥の鍵ストレッチ関数によって,512ビットのシードを生成します.

⑧秘密鍵のマスターの生成

⑦で生成したシートのうち,このシードの左側256ビットが秘密鍵のマスター(親)になります(上図の⑧).この秘密鍵のマスター(親)から公開鍵のマスターやウォレットアドレスを計算が計算できます.
なお,右側256ビットは,このシードから次のカギ(子)を導出するために使うチェーンコードのマスターです.

まとめ

Metamaskのシードフレーズの正体は,秘密鍵,公開鍵,ウォレットアドレスが導出できるルートシードを覚えやすくするための単語群でした.
なお,このシードフレーズやルートシードからは複数の秘密鍵,公開鍵,ウォレットアドレスを導出できる仕様があります.そちらの仕様はまた別の機会に作成していければと考えております.

参考文献

  1. 「Secret Recovery Phrase」とは何か、暗号ウォレットを安全に保つ方法
    https://metamask.zendesk.com/hc/ja/articles/360060826432--Secret-Recovery-Phrase-%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%8B-%E6%9A%97%E5%8F%B7%E3%82%A6%E3%82%A9%E3%83%AC%E3%83%83%E3%83%88%E3%82%92%E5%AE%89%E5%85%A8%E3%81%AB%E4%BF%9D%E3%81%A4%E6%96%B9%E6%B3%95

  2. 「マスタリング・イーサリアム ―スマートコントラクトとDAppの構築」, Andreas M. Antonopoulos (著), Gavin Wood (著), 宇野 雅晴 (監修, 翻訳), 鳩貝 淳一郎 (監修, 翻訳), オライリージャパン (2019)

  3. 「いちばんやさしいブロックチェーンの教本 人気講師が教えるビットコインを支える仕組み」, 杉井 靖典, インプレス (2017)

  4. 「詳解 ビットコイン ―ゼロから設計する過程で学ぶデジタル通貨システム」, Kalle Rosenbaum (著), 斉藤 賢爾 (監修), 長尾 高弘 (翻訳), オライリージャパン (2020)

  5. BIP-0032
    https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki

  6. BIP-0039
    https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki


この記事が気に入ったらサポートをしてみませんか?