鍵透明性(Key Transparency)
エンドツーエンド暗号化の相手の公開鍵が本物か、サーバーの言い分を信じずに検証できる。追記専用ログとマークル木で「なりすまし鍵」を全員が監視できる鍵透明性の原理を押さえられます。
- 1.鍵透明性は、ユーザーの公開鍵配布を Certificate Transparency と同じ発想で検証可能にする仕組み。鍵を追記専用のマークル木ログに載せ、署名付きの根(signed tree head)で全体を固定するため、サーバーが特定ユーザーだけに偽の鍵を差し込むと監査で露見する。
- 2.包含証明で「自分の鍵はこの版のログに正しく入っている」、不在証明で「このユーザーにこれ以外の鍵はない」、一貫性証明で「新しい根は古い根に追記しただけ」を検証する。VRF でユーザー名を隠しつつ索引を一意化し、gossip で全員が同じ根を見ていること(split-view 検出)を担保する。
- 3.CONIKS が原型を作り、Google Key Transparency・WhatsApp・Apple の iMessage Contact Key Verification が実装。IETF KEYTRANS で標準化が進む。鍵の入れ替わりを検知して警告する monitor 役が中核で、TOFU より強い保証をユーザー体験を壊さずに与える。
鍵透明性が解く問題:公開鍵配布の信頼
エンドツーエンド暗号化(E2EE)の安全性は「相手の公開鍵が本当に相手のものか」に完全に依存します。Signal や WhatsApp、iMessage では、メッセージを暗号化する前に相手の公開鍵をサーバー(鍵ディレクトリ)から取得します。ところがこのサーバーが悪意を持つ、あるいは侵害された場合、特定のユーザーにだけ攻撃者の公開鍵を返すことができます。すると攻撃者は中間者としてメッセージを復号でき、E2EE は名ばかりになります。従来の防御は QR コードによる「安全番号(safety number)」の対面照合ですが、実際にこれを行うユーザーはごく一部で、鍵が変わるたびに再照合する運用は現実的ではありません。
鍵透明性(Key Transparency, KT) は、この鍵配布を 検証可能(verifiable) にします。核心は、サーバーが誰にどの公開鍵を配ったかを 追記専用ログ(append-only log)に記録し、その内容を暗号学的に検証可能にすることです。サーバーは嘘をつけますが、嘘は必ずログに刻まれるため、後から誰でも検出できる。この「サーバーを無条件には信じず、その主張を証明で裏取りする」構図は、TLS 証明書に対する X.509 チェーン検証と Certificate Transparency と同じ設計思想の、ユーザー公開鍵版です。
土台:追記専用ログと signed tree head
KT の基盤は、鍵の割り当てを葉に持つ マークル木(Merkle 木) です。木の構造・包含証明・一貫性証明の数理は Merkle 木と認証データ構造 が詳しいので、ここでは KT に必要な三つの証明を整理します。
| 証明の種類 | KT で示すこと | 防ぐ攻撃 |
|---|---|---|
| 包含証明(inclusion) | 自分の (username, key) はこの版のログに確かに入っている | サーバーが登録を握りつぶす/別の鍵に差し替える |
| 不在証明(absence) | このユーザー名に対し、これ以外の鍵は登録されていない | 本人に隠れて余分な鍵をこっそり足す |
| 一貫性証明(consistency) | 新しい根は古い根に葉を追記しただけで、過去を書き換えていない | 過去の鍵割り当てを遡って改ざんする |
サーバーは一定間隔(エポック)ごとに木全体の根(root hash)に署名し、これを signed tree head(STH) として公開します。STH はエポック番号・根ハッシュ・タイムスタンプを含み、サーバーの署名鍵で署名されます(署名方式は デジタル署名スキーム を参照)。STH さえ正しければ、木の中身は包含・不在・一貫性の各証明で O(log N) サイズで検証できます。KT が Certificate Transparency と決定的に違うのは、不在証明を必須とする点です。CT は「載っていること」を監視すれば足りますが、KT では「載っているべきでない鍵が載っていないこと」まで示さないと、隠れた第2の鍵を検出できません。
索引の秘匿と一意化:VRF
不在証明を作るには、鍵をユーザー名で索引できる木、すなわちキーでソートまたはトライ構造にした木が要ります。しかしユーザー名をそのまま葉のキーにすると、ログを見た第三者に 全ユーザーの一覧が漏れます。かといってユーザー名を普通のハッシュにすると、サーバーが同じユーザー名に対しエポックごとに異なるハッシュを主張し、証明を出し分ける余地が残ります。
CONIKS が導入した解法が VRF(検証可能疑似ランダム関数, Verifiable Random Function) です。VRF はサーバーの秘密鍵で「ユーザー名 → 木の中の位置(index)」を決定的に写像しつつ、その写像が正しいことの証明を出せます。
index, proof = VRF_Prove(sk_server, username)
# 検証者は公開鍵で確認できる:
VRF_Verify(pk_server, username, index, proof) == true
VRF の二つの性質が効きます。第一に 一意性(uniqueness):あるユーザー名に対する index はサーバー鍵のもとで一意に定まり、サーバーは「別の位置」を主張できません。これがなければ、サーバーは同一ユーザーに対し複数の位置を使い分けて不在証明を偽装できます。第二に 疑似ランダム性:VRF 出力は秘密鍵を持たない者には予測不能なため、ログの位置からユーザー名を逆算・列挙できません。こうしてプライバシー(列挙耐性)と検証可能性(位置の一意固定)を同時に満たします。VRF の詳細は 検証可能疑似ランダム関数 を参照してください。
split-view 攻撃と gossip
STH に署名があっても、それだけでは足りません。サーバーは 人によって異なる木を見せる ことができるからです。攻撃対象の被害者には「偽の鍵を含む木」の STH を、他の全員には「正規の木」の STH を配れば、一貫性証明は各系列の中では整合してしまい、被害者は自分だけ別の履歴を見せられていることに気づけません。これを split-view 攻撃(分岐ビュー/fork 攻撃)と呼びます。
STH の署名は「この根はサーバーが確かに主張した」ことしか保証しません。サーバーが二つの矛盾する木を並行して維持し、それぞれに正しく署名すれば、署名検証も一貫性証明も系列内では通ります。したがって KT の安全性は、全ユーザーが同一の STH 系列を見ていることを外部から保証する仕組みに依存します。ここを欠くと、鍵透明性は「サーバーが正直なときだけ機能する透明性」に退化します。
対策は gossip(うわさ話) です。ユーザーや監視者が観測した STH を互いに、あるいは第三者の監査者に共有し、同じエポックに対し異なる根が存在しないことを突き合わせます。矛盾する二つの STH が見つかれば、それがサーバーの二枚舌の動かぬ証拠(cryptographic proof of misbehavior)になります。実装では、独立した auditor(一貫性だけを検証し STH 系列の単一性を保証)と、後述の monitor が役割分担します。この「単一の根に全員を合意させる」問題は、Certificate Transparency における SCT の gossip や、中間者攻撃と証明書ピンニング が扱う信頼の固定と同根の課題です。
monitor:なりすまし鍵を検知する主体
KT で最も重要かつ見落とされがちなのが monitor(監視者) の役割です。包含・不在・一貫性の各証明は「その瞬間のログの正しさ」を検証するだけで、自分のアカウントに勝手に鍵が追加されたこと自体は、誰かが継続的に見張らなければ気づけません。
monitor は、エポックごとに更新される STH を追跡し、特定のユーザー名(典型的には自分自身)に紐づく鍵集合の変化を監視します。ある版で「鍵は A のみ」だったのが次の版で「A と B」に増えていれば、B は本人が登録した覚えのない なりすまし鍵かもしれない、と警告できます。この監視は本人のデバイスがバックグラウンドで行うのが理想ですが、常時オンラインとは限らないため、信頼できる第三者 monitor に委任する設計もあります。
Signal の安全番号は本質的に TOFU(Trust On First Use)+変更時の手動再照合です。鍵が変わったら警告は出ますが、その変更が正当(機種変更)か攻撃かはユーザーが判断できず、大半は無視されます。KT は、鍵の履歴が 追記専用ログに公開され誰でも監査できることで、「サーバーがこっそり鍵を差し込む」余地そのものを狭めます。ユーザーが毎回照合しなくても、monitor が変化を機械的に検出し、ログの改ざんは一貫性証明で塞がれる――人手の照合に頼らずに保証を底上げする点が本質的な進歩です。
CONIKS から Key Transparency 実装へ
系譜を押さえると全体像が締まります。
- CONIKS(2015):KT の学術的原型。VRF による名前の秘匿と一意化、ユーザー自身が自分のキー履歴を監視する monitor モデル、split-view 検出のための STH gossip という主要部品を提示しました。
- Google Key Transparency:CONIKS を実装・一般化したオープンソース基盤で、Trillian(CT と共通の追記専用ログ実装)の上に鍵ディレクトリを構築します。
- WhatsApp Key Transparency(2023):数十億ユーザー規模で稼働する初の大規模実装の一つ。安全番号照合を KT による自動検証で裏打ちします。
- Apple iMessage Contact Key Verification(2023):連絡先の鍵を KT ログで検証し、鍵が食い違えばユーザーに警告します。iMessage の E2EE 鍵配布(FIDO2/WebAuthn と同じく公開鍵ベースの本人性)に監査可能性を足す位置づけです。
- IETF KEYTRANS ワーキンググループ:これらの相互運用可能な標準化を進めており、ログ構造・証明形式・gossip の共通仕様を定義しつつあります。
- 鍵透明性=ユーザー公開鍵配布を追記専用マークル木ログで検証可能にし、STH(signed tree head)で全体を固定する。CT のユーザー鍵版で、不在証明を必須とするのが違い。
- 三つの証明:包含(自分の鍵が入る)/不在(余分な鍵がない)/一貫性(過去を改ざんしていない追記のみ)。
- VRF でユーザー名の列挙を防ぎつつ木の位置を一意固定。gossip/auditor で split-view(分岐ビュー)を検出。
- monitor が自分の鍵集合の変化を継続監視して「なりすまし鍵」を検知。CONIKS が原型、WhatsApp/iMessage が実装、IETF KEYTRANS が標準化。
まとめ
鍵透明性は、E2EE の最後の急所である「公開鍵配布時のサーバー信頼」を、暗号学的な検証で置き換える仕組みです。鍵の割り当てを追記専用のマークル木ログに載せ、署名付きの根で固定し、包含・不在・一貫性の証明で中身を裏取りします。ユーザー名は VRF で秘匿しつつ位置を一意化し、gossip で全員が同一の根を見ていること(split-view の不在)を担保し、monitor が自分の鍵に混入したなりすまし鍵を継続監視します。CONIKS の原理を WhatsApp や iMessage が実運用に落とし込み、IETF KEYTRANS が標準化を進める今、鍵透明性は「サーバーが正直でなくても E2EE が安全である」ことを、ユーザーに追加の手間を課さずに近づける中核技術になりつつあります。
セキュリティ Article
鍵透明性(Key Transparency)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
鍵透明性
比較で見る軸
難易度: advanced / カテゴリ: セキュリティ / タグ数: 6
導入後に効く点
包含証明で「自分の鍵はこの版のログに正しく入っている」、不在証明で「このユーザーにこれ以外の鍵はない」、一貫性証明で「新しい根は古い根に追記しただけ」を検証する。VRF でユーザー名を隠しつつ索引を一意化し、gossip で全員が同じ根を見ていること(split-view 検出)を担保する。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- セキュリティ
- タグ数
- 6
判断チェックリスト
- 自社の用途が「鍵透明性 / Key Transparency」に近いか確認する。
- 強みである「鍵透明性は、ユーザーの公開鍵配布を Certificate Transparency と同じ発想で検証可能にする仕組み。鍵を追記専用のマークル木ログに載せ、署名付きの根(signed tree head)で全体を固定するため、サーバーが特定ユーザーだけに偽の鍵を差し込むと監査で露見する。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。