リカバリーフレーズの総当たりハッキング MetaMaskやハードウェアウォレットの12/24語は解読されるか?

よこのじ(@yokonoji_work)です。

圧倒的セキュリティでウォレット内の暗号資産(仮想通貨)を守るためのヒント25」で、ウォレットで暗号資産(仮想通貨)を安全に保管するためのセキュリティヒントをご紹介しました。これらのヒントでウォレットのセキュリティは格段に良くなります。

しかし、「ウォレットのリカバリーフレーズの総当たりでセキュリティを破れるのでは?」という疑問がありモヤモヤしていました。今回はこのモヤモヤを解消するための検証を行いました。

ウォレットのリカバリーフレーズとは?

まずは、リカバリーフレーズについて確認しておきます。

リカバリーフレーズは、ウォレットを復元するためのコードです。パスフレーズやニーモックフレーズ、seed(シード、種)と呼ばれたりもします。12~24の単語の組み合わせから成るものと聞けば、どういったものか思い当たるはずです。

このリカバリーフレーズはウォレットにおいて秘密鍵と同じかそれ以上に大事なものになります。それは、リカバリーフレーズを元に秘密鍵や公開鍵、アドレスを生成するからです。

リカバリーフレーズがどういったものかをより理解するために、リカバリーフレーズが誕生した経緯を見てみましょう。

初期の原始的なウォレットは「秘密鍵 -> 公開鍵 -> アドレス」のように1つの秘密鍵から1つのアドレスを生成できますが、過去の取引履歴を覗かれるなどプライバシーに問題がありました。これを解決したのが、HDウォレット:階層的決定性ウォレット(BIP-32)です。

BIP-32 HDWallet

HDウォレットは、シードを元にして複数の秘密鍵やアドレスを生成できるウォレットです。これにより1つのウォレットに複数のアドレスを持つことができるので、秘密鍵をウォレットの数だけ管理する必要がなくなりました。そのおかげで、取引の度に異なるアドレスを利用することが気軽に行えるようになりました。

BIP-32のシードとは秘密鍵などのように意味のない文字列のことでしたが、その後、BIP-39シードを人が読める単語で扱えるようになりました。これが、リカバリーフレーズの正体です。

なお、HDウォレットの基礎的な仕組みを作ったBIP-32をさらに発展させた規格がBIP-44です。BIP-44では、ビットコインとイーサリアムのような異なるコインを1つのシードで扱えるようになりました。マルチコインウォレットはこの規格に基づくものです。

BIP-32とBIP-44には互換がありません。そのため、あるウォレットでリカバリーフレーズを取得して他のウォレットで復元しようとする場合には互換の有無を確認する必要があります。下記のウォレットであればBIP-44に沿った仕様を持っていますので、ウォレット間に互換があります。

互換ウォレット

  • Mycelium Bitcoin Wallet (Android)
  • Copay
  • CoinVault
  • Samourai Wallet
  • Coinomi
  • TREZOR
  • KeepKey
  • Ledger Wallet
  • 21 Machine Wallet
  • Trust Wallet

Compatible wallets

互換があるので、例えばLedger Nano Sが破損したらTrezorで復元するといったことが可能です。その他ウォレット間で復元させる場合にはリカバリーフレーズが何語まで対応しているのか確認する必要があるかと思います(例えば、Ledgerは24語ですが、Trust Walletは12語です)。

少し話が逸れましたが、リカバリーフレーズが重要なものであること、リカバリーフレーズさえあればウォレットを簡単に復元できることを知ってもらえたかと思います。

リカバリーフレーズの解読難易度

ここまでの説明で、冒頭に挙げた「ウォレットのリカバリーフレーズの総当たりでセキュリティを破れるのでは?」という不安をご理解いただけたでしょうか?これを払拭したいので、リカバリーフレーズを総当たりで一致させる難易度を計算してみたいと思います。

リカバリーフレーズはBIP-39で定められた2048の単語の中から選ばれた単語の並びです。英語、日本語、韓国語、中国語、フランス語、イタリア語で単語リストが用意されていますが、コンピュータからするとどれも0~2047の数値として扱われますので、言語ごとにリストがあるからといって解読難易度が変わる訳ではなさそうです。

参考:BIP-39 Wordlists

今回はMetaMaskの12語、Ledger Nano Sの24語を例に計算してみます。まずは、12語と24語で何通りのリカバリーフレーズがあるのか見てみましょう。

リカバリーフレーズは2048の単語から重複ありで並べられるパターンで生成されます。よって次のように計算できます。

12語:
2048^12 = 5444517870735015415413993718908291383296(40桁)

24語:
2048^24 = 29642774844752946028434172162224104410437116074403984394101141506025761187823616(80桁)

Windows標準の電卓では桁が足りませんでしたので、keisan フリー計算をお借りしました。なんと読んだらいいのか分からないほどの桁数のリカバリーフレーズの生成パターンがあるようですね。

ちなみに、Ethereum(イーサリアム)の秘密鍵は256bit(=64文字)ですので、リカバリーフレーズ24語には劣るもののかなりのパターンが生成可能です。

2^256 = 115792089237316195423570985008687907853269984665640564039457584007913129639936(78桁)

多くのパターンのリカバリーフレーズが生成できることは分かりましたが、これらを総当たり攻撃(ブルートフォースアタック)するとどのくらいの時間がかかるのでしょうか?

こちらにパスワードの解読時間の表があります(2015年のデータ)。

解読時間

ブルートフォースアタック(総当たり攻撃)とは?そのやり方・実際にかかる時間・対策方法は?

使用できる文字数93で10桁の場合は「48,398,230,717,929,318,249(20桁)」パターンのパスワードを生成できます。これでも解読に1千万年の時間がかかります。12語の40桁、24語の80桁という莫大なパターンのリカバリーフレーズであれば、まさに天文学的数字なので○億年では足りないほど解読に時間を要するのでしょう。総当たりで突破されるということは心配ないのかもしれませんね。

 

今回の検証で「ウォレットのリカバリーフレーズの総当たりでセキュリティを破れるのでは?」というモヤモヤは晴れました。オンライン上にリカバリーフレーズを晒すことさえなければ、安全は保たれそうです。