署名・ウォレット・鍵管理
ブロックチェーンで資産を守れるかは鍵の扱いで決まる。ECDSA署名・アドレス導出・HDウォレット・シードフレーズの内部を原理から押さえ、なぜ「鍵を失う=資産喪失」なのかが腑に落ちる。
- 1.ブロックチェーンに口座はなく、秘密鍵で署名できる者が唯一の所有者。BitcoinもEthereumもsecp256k1上のECDSA署名で「本人だけが作れ、誰もが検証できる」を実現する。
- 2.アドレスは公開鍵のハッシュから一方向に導く。Bitcoinは RIPEMD160(SHA256(pubkey)) を Base58Check、Ethereumは keccak256(pubkey) の下位20バイト。逆算で公開鍵や秘密鍵は得られない。
- 3.HDウォレットは1つのシード(BIP-39ニーモニック)から鍵を階層的に無限生成する(BIP-32/44)。復元はシード語句だけで足り、その語句こそが最終的な単一障害点になる。
ブロックチェーンにおける「所有」とは鍵のことである
銀行口座は台帳上の名義で本人を識別し、パスワードを忘れても本人確認で復旧できます。ブロックチェーンにはこの発想がありません。台帳(/database/ で扱う分散ストレージの一種)に記録されているのは残高と、それを動かす条件だけです。資産を移すトランザクションは、対応する秘密鍵で署名されて初めて有効になります。つまり「所有者」とは名義人ではなく、その資産を動かす署名を作れる秘密鍵の保持者そのものです。
この設計の帰結は重い。秘密鍵を握った者は誰でも所有者として振る舞え、鍵を失えば資産は台帳上に残ったまま永久に動かせなくなります。取り消しも復旧窓口もありません。鍵管理がブロックチェーンの実務で最重要テーマになるのは、この非対称性のためです。
ブロックチェーンの鍵は原則データを暗号化しません。使うのは公開鍵暗号の署名機能だけです。秘密鍵で署名を生成し、公開鍵で検証する。トランザクションの中身(誰がいくら送るか)は台帳上で誰にでも見えており、隠すのではなく改竄・成りすましを不可能にするのが目的です。暗号化と署名の役割の違いは /security/ の暗号基礎とあわせて押さえると混乱しません。
ECDSA署名:secp256k1 の上で
BitcoinとEthereumはともにsecp256k1という楕円曲線上のECDSA(楕円曲線デジタル署名)を採用します。生成点 G、その位数 n、秘密鍵 d(1 以上 n 未満のランダムな整数)、公開鍵 Q = dG を前提に、トランザクションのハッシュ e への署名 (r, s) を次で作ります。楕円曲線の群演算そのものは /security/ のECC解説に譲り、ここでは署名の骨格に絞ります。
署名(秘密鍵 d で):
e = トランザクションのハッシュ(整数化)
k = 1 .. n-1 のランダムな秘密値(nonce, 署名ごとに新規)
R = k * G # 曲線上の点
r = R.x mod n
s = k^(-1) * (e + r*d) mod n # low-s 正規化: s > n/2 なら s = n - s
署名 = (r, s)
検証(公開鍵 Q で):
w = s^(-1) mod n
u1 = e*w mod n ; u2 = r*w mod n
P = u1*G + u2*Q
有効 ⇔ P.x mod n == r
検証が通る理由は代入で追えます。s = k^(-1)(e + r d) を k について解くと k = u1 + u2·d(mod n)。両辺に G を掛ければ kG = u1·G + u2·(dG) = P。ゆえに P = kG = R となり P.x mod n が r に一致します。ここで署名ごとの秘密乱数 k(nonce)が漏洩・再利用・偏りのいずれかを起こすと s = k^(-1)(e + r d) の式から秘密鍵 d が方程式一本で解けてしまうのは、ブロックチェーンでも同じ致命傷です。弱い乱数を積んだ初期のウォレットが k の再利用で資金を抜かれた事故は実在します。署名理論の詳細は /security/ を参照。
ECDSAは (r, s) が有効なら (r, n - s) も同じメッセージの有効な署名になります。第三者が秘密鍵なしに署名を別表現へ書き換えられるため、これに紐づくトランザクションIDが変わる問題(トランザクション・マリアビリティ)が起きました。対策としてBitcoinは s を必ず n/2 以下に正規化する low-s ルールを標準化し、SegWit では署名をトランザクションIDの計算対象から外しました。ライトニング等のレイヤ2はこの改修が前提です。
Ethereumはさらに署名に1バイトのリカバリID(v)を付けます。r と s だけでは対応する公開鍵の候補が複数出るため、どの候補かを示す v を添えることで、署名から署名者の公開鍵(=アドレス)を復元できます。これによりトランザクションに送信者アドレスを別途書く必要がなくなり、データを節約しています。
公開鍵からアドレスを導く
アドレスは公開鍵そのものではなく、公開鍵をハッシュして短くしたものです。ハッシュは一方向なので、アドレスから公開鍵は復元できません(公開鍵は、その所有者が署名するときに初めて明かされます)。二大チェーンで手順が異なります。
| 段階 | Bitcoin(P2PKH) | Ethereum |
|---|---|---|
| 公開鍵 | 圧縮33バイト(先頭 02/03 + x座標) | 非圧縮64バイト(x||y, 先頭04を除く) |
| ハッシュ | RIPEMD160(SHA256(pubkey)) → 20バイト | keccak256(pubkey) の下位20バイト |
| 前置/整形 | バージョンバイト(0x00)を先頭に付与 | 先頭に 0x を付けた16進表記 |
| チェックサム | 二重SHA256の先頭4バイトを末尾に付与しBase58Check | EIP-55(大小文字混在で誤り検出) |
BitcoinのBase58Checkは、視認しづらい文字(0・O・I・l)を除いた58文字で符号化し、末尾のチェックサム4バイトでタイプミスを検出します。1文字でも打ち間違えるとチェックサムが合わず、無効なアドレスとして弾かれる仕組みです。現在主流のSegWit系アドレス(bc1...)はBase58ではなく Bech32 を使い、より強力な誤り検出符号を備えます。
Ethereumのkeccak256は、標準化された SHA3-256 とはパディングが異なるオリジナルのKeccakである点に注意が必要です(SHA3と取り違えると値が一致しません)。アドレス自体は大小文字を区別しませんが、EIP-55は各16進文字の大小を公開鍵ハッシュのビットで決めることで、正しいアドレスなら特定の大小パターンになるようにし、チェックサムを追加データなしに埋め込みます。
アドレスを公開鍵のハッシュにする利点は3つあります。(1) 短く扱いやすい。(2) 公開鍵を使う瞬間まで隠せるため、量子計算機が離散対数を解けるようになっても、一度も送金していないアドレスはハッシュに守られ相対的に頑健。(3) チェックサム内蔵で誤送金を減らせる。逆に、公開鍵を明かした(=一度でも出金した)アドレスの再利用は、匿名性・将来の耐量子性の観点で推奨されません。
秘密鍵をどう守るか
秘密鍵はたかだか256ビットの整数ですが、その一様ランダム性がすべてを支えます。予測可能な乱数源から生成された鍵(低エントロピー、実装バグ、脆弱なRNG)は、同じ鍵を他人も生成でき、資金が即座に奪われます。生成には暗号論的に安全な乱数(CSPRNG)が必須です。保管方式は信頼境界の置き方で分類できます。
| 方式 | 鍵の所在 | 特徴とリスク |
|---|---|---|
| ホットウォレット | オンライン端末上 | 利便性が高いがマルウェア・不正送信に晒される |
| コールドウォレット | オフライン(紙・エアギャップ機) | オンライン攻撃から隔離。物理紛失・焼失が脅威 |
| ハードウェアウォレット | 専用デバイス内(鍵は外に出ない) | 署名のみ内部実行。PIN・耐タンパで保護 |
| カストディアル | 取引所など第三者が保管 | UXは楽だが『鍵を持たない=所有していない』 |
ハードウェアウォレットは秘密鍵をデバイス外へ一度も出さず、トランザクションのハッシュを内部で署名して (r, s) だけを返します。PCが乗っ取られても鍵本体は漏れません。これは /security/ で扱うHSMやセキュアエンクレーブと同じ「鍵を境界の外に出さない」思想です。「Not your keys, not your coins」という格言は、カストディアル保管では鍵をあなたが持たない以上、真の所有者は預け先だという指摘です。
さらに単一鍵に集約しない選択肢もあります。マルチシグ(例 3-of-5)は複数の秘密鍵のうち一定数の署名を要求し、1本漏れても資産を守ります。**しきい値署名(MPC/TSS)**は秘密鍵を分割したまま署名を協調生成し、完全な鍵をどこにも再構成しないため、単一障害点をさらに薄められます。
HDウォレットとシードフレーズ
鍵を送金のたびに新規生成すると、その数だけバックアップが必要になり管理が破綻します。これを解いたのが**階層的決定性ウォレット(HDウォレット, BIP-32)**です。核心は、1つの乱数シードから、決定論的な計算で鍵の木を無限に導出することです。シードさえ保管すれば、そこから同じ鍵群を何度でも再生成できます。
BIP-32の鍵導出は、親の秘密鍵とチェーンコード(追加の乱数)とインデックス i をHMAC-SHA512に通し、子の秘密鍵とチェーンコードを得ます。導出には2種類あります。
- 通常導出(normal):親の公開鍵から子の公開鍵を導出できる。これにより、秘密鍵を持たないサーバーが「拡張公開鍵(xpub)」だけで受取アドレスを次々発行できる(監視・会計に便利)。
- 強化導出(hardened):親の秘密鍵を要し、公開鍵からは子を導出できない。インデックスに
'(例44')を付けて表す。
通常導出には落とし穴があります。ある子の秘密鍵が1本漏れ、かつ親のxpub(公開鍵+チェーンコード)も知られていると、そこから親の秘密鍵と兄弟すべての秘密鍵が芋づる式に復元できます。これを防ぐのが hardened 導出で、公開鍵から子を辿る経路を断ちます。標準の派生パス m/44'/0'/0'/0/0(BIP-44 の purpose'/coin'/account'/change/index)では、アカウント階層までを hardened にし、外部に晒す末端だけ通常導出にするのが定石です。
そのシード自体を人間が扱えるようにしたのが**ニーモニック(BIP-39)**です。手順は次の通りです。
1. 128〜256ビットのエントロピー ENT を生成
2. チェックサム = SHA256(ENT) の先頭 (ENT長/32) ビット
3. (ENT || チェックサム) を11ビットずつに分割
4. 各11ビット(0..2047)を2048語の辞書に対応づけ、12〜24語のニーモニックに
5. seed = PBKDF2-HMAC-SHA512( ニーモニック, "mnemonic"+パスフレーズ, 2048回 )
6. この512ビット seed が BIP-32 のマスタ鍵の元になる
12語は128ビット、24語は256ビットのエントロピーに対応します。埋め込まれたチェックサムがあるため、単語の写し間違いや語順の誤りは高確率で検出されます。任意のパスフレーズ(第13の語, BIP-39 passphrase)を加えると、同じ12語でもまったく別のシード=別のウォレットが生成され、強奪時の否認や隠し金庫として使えます。
ニーモニックはウォレット内の全鍵の親です。これを見た者は資産を丸ごと奪え、失えば全資産を永久に失います。ゆえに——スクリーンショットやクラウド保存は禁物(オンラインに触れた瞬間ホットな標的になる)、入力を求めるサイト・アプリは原則フィッシング、物理媒体(金属プレート等)で耐火・分散保管する、が鉄則です。パスワードと違い変更も無効化もできないため、漏洩=再発行ではなく全額移動しか手当てがありません。
「アドレス→公開鍵→秘密鍵」は一方向で、アドレスから公開鍵は導けず、公開鍵から秘密鍵はECDLPで導けない。HDウォレットの復元に必要なのは個々の鍵ではなくシード(ニーモニック)のみ。hardened 導出の目的は「子鍵漏洩+xpub」からの親鍵復元の遮断。BIP-32=階層決定性、BIP-39=ニーモニック(エントロピー+チェックサム+PBKDF2)、BIP-44=用途/コイン/アカウントの派生パス、と対応づけて覚えると整理できます。
まとめ
- ブロックチェーンに口座はなく、秘密鍵で署名できる者が唯一の所有者。BitcoinもEthereumも secp256k1 上のECDSAで本人性を担保する。
- 署名
(r, s)は noncekの秘匿・非再利用が生命線で、漏れれば秘密鍵が方程式一本で解ける。Bitcoinは low-s で可鍛性を、Ethereumはvで公開鍵復元を扱う。 - アドレスは公開鍵のハッシュ。Bitcoinは RIPEMD160(SHA256(·)) を Base58Check、Ethereumは keccak256(·) 下位20バイト+EIP-55。逆算で公開鍵・秘密鍵は得られない。
- 鍵管理は信頼境界の設計。ハードウェアウォレット・マルチシグ・しきい値署名で単一障害点を薄める。
- **HDウォレット(BIP-32/39/44)**は1シードから鍵の木を決定論的に生成し、復元はニーモニックのみで足りる。そのニーモニックこそが最終的な単一障害点であり、オフライン・分散・耐火の保管が要である。
ブロックチェーン Article
署名・ウォレット・鍵管理を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
ブロックチェーン
比較で見る軸
難易度: advanced / カテゴリ: ブロックチェーン / タグ数: 6
導入後に効く点
アドレスは公開鍵のハッシュから一方向に導く。Bitcoinは RIPEMD160(SHA256(pubkey)) を Base58Check、Ethereumは keccak256(pubkey) の下位20バイト。逆算で公開鍵や秘密鍵は得られない。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- ブロックチェーン
- タグ数
- 6
判断チェックリスト
- 自社の用途が「ブロックチェーン / 署名」に近いか確認する。
- 強みである「ブロックチェーンに口座はなく、秘密鍵で署名できる者が唯一の所有者。BitcoinもEthereumもsecp256k1上のECDSA署名で「本人だけが作れ、誰もが検証できる」を実現する。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。