29 / 736BIP39

BIP 39

ウォレットのバックアップ用単語ができる仕組み

復元用の単語は、元の機器が壊れてもウォレットへのアクセスを取り戻せるようにするものです。BIP39は、その単語の作り方と、対応するウォレットが単語から鍵の基礎となるデータを再び計算する方法を定めています。復元には、使用していたpassphraseやウォレットの設定も関わります。

BIP39は、ランダムなデータをSeed Phraseと呼ばれる復元用の単語に変換する標準です。ウォレットはその単語と、任意で加える秘密の情報であるpassphraseから、鍵を作る出発点となるデータ「シード」を計算します。これによりBitcoinへのアクセスをバックアップできますが、単語自体にコインや支払い履歴が保存されるわけではありません。

AliceはBIP39を使うウォレットを作り、案内に従って復元用の単語を安全に記録しました。その後、スマートフォンが壊れてしまいます。それでBitcoinがネットワークから消えたわけではありません。失ったのは、支払いに署名するための鍵を保管していた機器です。信頼できる代わりの機器で、対応するウォレットの復元機能を使えます。同じ単語を同じ順番で入力し、passphraseを使っていたならそれも同じものを入力すると、同じシードが得られます。続く処理で必要な秘密鍵が再び作られ、ウォレットがBitcoinネットワーク上の支払いを探します。これは、サポートに頼んでパスワードをリセットできるアカウントへのログインではありません。Aliceがpassphraseを使っていたなら、それも必要です。古いスマートフォンのPINでは代用できません。復元後の残高がゼロでも、必ずしもコインを失ったとは限りません。単語とpassphraseに加え、正しいアカウントや復元設定を選んでいるかも確認する必要があります。だからこそ、大きな金額を保管する前に、一連の復元手順を確かめておくことが大切です。 [1] [5] [13] [14]

長いコンピューターデータの表記に比べ、単語は人が書き写して確認しやすい形です。Marek Palatinus、Pavol Rusnak、Aaron Voisine、Sean Boweは、コンピューターが生成したランダムなデータを、手で書き写しやすい形に変える方法を提案しました。提案の日付は2013年9月10日で、仕様上の状態はDeployedです。単語は良質なランダム入力から作る必要があり、好きな文章をもとに自分で考えてはいけません。それでは、人間の予測しやすい秘密に頼るBrainwalletになってしまいます。Bitcoinのノードが検証するのは取引とブロックであり、BIP39や、ウォレットが鍵を作った方法ではありません。 [1]

丁寧な記録も、それを使ってウォレットを復元できてこそ役に立ちます。大切な資金を保管する前に、メーカーが勧める復元手順を信頼できる機器で確認してください。正確な単語の順序に加え、必要なpassphrase、ウォレット情報、必要に応じて導出や署名の設定も保管します。一般的な単一署名のウォレットなら、完全なバックアップと必要なpassphraseを持つ人は、元の機器がなくても鍵を導出できます。Multisigでは、追加で必要となる鍵をそろえ、定められた署名規則にも従う必要があります。写真、クラウド上のコピー、プリンター、クリップボードの履歴は、秘密をほかの人やサービスにさらすおそれがあります。紙と金属にはそれぞれ異なる物理的な弱点があり、どんな素材も、それだけで盗難を防げるわけではありません。 [9] [13] [14]

BIP39は互換性のために英語の単語リストを強く推奨しています。ほかのリストに対応していないウォレットが多いためです。バックアップを翻訳しても、元のウォレットは維持されません。導出の入力に使われるのは、フレーズそのものだからです。ほかの方式にも注意が必要です。Electrumは独自形式のバックアップに独自のバージョン管理手順を使っており、似た単語が並んでいるだけでBIP39になるわけではありません。SLIP39は、独自の1 024語のリストと、復元にいくつの分割片が必要かという規則を持つ別の形式です。BIP39のバックアップを単純に切り分けたものではありません。24語をいくつかの封筒に分けてもShamir Secret Sharingにはならず、保護や復元の可能性をかえって損なうことがあります。バックアップの実際の形式を必ず把握しておく必要があります。 [1] [11] [12]

出発点はエントロピー、つまりENT = 128、160、192、224、256ビットのいずれかの長さを持つランダムなデータです。元のデータのSHA-256の結果から、先頭のCS = ENT/32ビットをチェックサムとして加えます。全体を11ビットずつに分け、それぞれの組が一つの単語を指定します。そのため、MS = (ENT+CS)/11という関係から、単語数は正確に12、15、18、21、24個のいずれかになります。12個の単語が表すのは128ビットのランダム性と4ビットのチェックサムであり、132ビットすべてが独立した秘密というわけではありません。24個の場合は256+8ビットです。バックアップの信頼性を支えるのは乱数生成器であり、単語がどれほど珍しく見えるかではありません。 [1]

11ビットの各組は、順序の決まった2 048語のリストから一つの項目を選びます。したがって、最初の単語が最初の秘密鍵なのではありません。すべての単語が一緒になって、元のデータとチェックサムを表しています。英語のリストでは、先頭の4文字で各単語を区別できます。ただし、これはどの言語にも通用する規則ではなく、復元時に自分の判断で単語を省略してよいという意味でもありません。順序の変更、類義語への置き換え、翻訳はいずれも入力データを変えます。チェックサムが無効になる場合もあれば、別の有効なバックアップになる場合もあります。単語の表記と順序は、どちらも正確に保管する必要があります。 [1] [2]

コンピューターは、実際にどの文字を受け取ったのかを判別する必要があります。BIP39では、バックアップ用のフレーズとpassphraseの両方にUnicode NFKD正規化を行い、その後UTF-8で符号化することを定めています。NFKDは、たとえば一部の発音区別符号付き文字を分解することで、異なる表記の一部をそろえます。そのため、異なる二つの表記が正規化後に同じ結果になることがありますが、見た目が似ているだけでは保証されません。単語の順序、空白、passphraseの文字は依然として重要です。別の正規化方法を使うと、復元時に異なるシードが導出されることがあります。参照実装と公開テストベクトルは、プログラムが指定どおりの手順に従っているかを確認するために役立ちます。 [1] [3] [4]

PBKDF2には、別々の二つの入力を渡します。passwordという入力に使うのは、実際のバックアップ用単語です。もう一つの入力はsaltと呼ばれる、暗号処理の追加パラメーターです。ここには文字列そのものの「mnemonic」を置き、その直後に区切り文字を入れずにpassphraseを連結します。バックアップ用単語そのものを、ここにもう一度入れるわけではありません。両方の入力をNFKDで正規化し、UTF-8で符号化します。BIP39で指定されているのは、HMAC-SHA512、反復回数2 048回、512ビット、つまり64バイトの出力です。Passphraseを使わない場合もsaltは「mnemonic」のままで、空になるのはpassphraseだけです。この計算は単語の復号ではなく、新たな独立したランダム性も生みません。そのため、単語が漏れた後は、反復処理だけで推測しやすいpassphraseを守ることはできません。 [1] [10]

BIP39の処理は、64バイトのシードを生成したところで終わります。次の標準であるBIP32では通常、このシードから、固定の鍵「Bitcoin seed」を使ったHMAC-SHA512によって、マスター秘密鍵と32バイトのchain codeを導出します。chain codeは、鍵と組み合わせて次の鍵を導出するための追加データです。この二つの値を出発点として、鍵の木構造が作られます。BIP44、BIP49、BIP84、BIP86などの規則は、異なる導出パスとスクリプトの種類を定めています。そのため復元時に正しい単語とpassphraseを入力しても、プログラムが別のアカウント、別の枝、別のアドレス形式を探していれば、残高がゼロに見えることがあります。検索中に未使用のアドレスが連続していくつ見つかるまで調べ続けるかを定めるgap limitも重要です。元のウォレット名、アカウント情報、導出パス、Output Descriptorなどは、単語だけには含まれない情報を補います。 [5] [6] [7] [8] [9] [14]

Passphraseは、シードの導出に加える秘密の入力です。機器のPINではなく、BIP39は誤ったpassphraseを入力したと知らせることもできません。別の値でも計算結果を出します。正規化後の入力が変わる入力ミスは、通常は別のウォレットにつながり、そこには自分の資金が表示されません。一方、NFKDの結果が同じになる異なる表記からは、同じシードが導出されます。バックアップ用単語と、目的のウォレットかどうかを判別できる情報を入手した人は、passphraseの候補をオフラインで試せます。Passphraseを使うなら、十分な強度、信頼できる入力方法、独立した確実なバックアップが必要です。別々に保管する目的は、両方が一緒に盗まれる危険を減らすことです。自分がいなくなったら永遠に失われる秘密にしてしまうことではありません。 [1] [13]

チェックサムは入力ミスの検出に役立ちますが、バックアップの持ち主や、安全に生成されたことを証明するものではありません。12語の場合は4ビット、24語の場合は8ビットです。そのため、対象のリストから一様ランダムに選んだ単語列が検査に通る確率は、それぞれ1/16と1/256です。多くの誤りは検出できますが、すべてではありません。また、チェックサム自体が誤りを修正することもありません。攻撃者は、有効なチェックサムを持つ別のバックアップを作れます。仕様は不一致の場合に警告することを求め、単語の検査とシードの導出そのものを区別しています。無効なチェックサムが出たら、元のウォレットとその形式に沿って対処してください。実際のバックアップをインターネット上の検査ツールに入力してはいけません。 [1]

例 · BIP39

単語、チェックサム、シード

BIP39は128ビットのエントロピーに4ビットのチェックサムを加えます。合計132ビットを11ビットずつ12組に分け、それぞれがリストから単語を選びます。そのバックアップ用単語をPBKDF2-HMAC-SHA512のpassword入力に使います。Saltは文字列そのものの接頭辞「mnemonic」と、使用する場合はpassphraseから作ります。NFKD正規化とUTF-8符号化の後、2 048回の反復で512ビットのシードを導出します。チェックサムはランダム性を加えません。

理解を深めるには、この項目とあわせて次もお読みください Seed Phrase, HD Wallet, BIP39 passphrase, Trezor, Bitcoin, BIP39 checksum. 次の項目からも参照されています Seed Phrase, HD Wallet, Cold Storage, BIP (Bitcoin Improvement Proposal).

01BIP 39はBitcoinのコンセンサスの一部ですか?

いいえ。ランダムなデータの表記とシードの導出について、ウォレット間で使われる取り決めです。Bitcoinのノードは、鍵がBIP 39で作られたかどうかを知らなくても、取引とブロックを検証できます。

0212語や24語のフレーズなら、すべてBIP 39互換ですか?

いいえ。単語数だけでは足りません。単語リストと順序、チェックサム、NFKD正規化、シードの導出方法が一致する必要があります。元のウォレットを復元するには、使用していた場合は正しいpassphraseに加え、対応する導出パスとスクリプトの種類も必要です。

DOC · 001BIP 39 — Mnemonic code for generating deterministic keys仕様 DOC · 002BIP 39 official wordlists仕様 DOC · 003Trezor python-mnemonic reference implementation一次資料 DOC · 004BIP 39 official test vectors一次資料 DOC · 005BIP 32 — Hierarchical deterministic wallets仕様 DOC · 006BIP 44 — Multi-account hierarchy仕様 DOC · 007BIP 84 — Native SegWit derivation仕様 DOC · 008BIP 86 — Single-key Taproot derivation仕様 DOC · 009BIP 380 — Output script descriptors仕様 DOC · 010RFC 8018 — PBKDF2仕様 DOC · 011Electrum documentation — seed version system文書 DOC · 012SLIP 39 — Shamir's Secret-Sharing for Mnemonic Codes仕様 DOC · 013Trezor — passphrases and hidden wallets文書 DOC · 014Bitcoin Core — Output descriptors文書
改訂日: 一次資料を優先 · 投資助言ではありません