- Authors

- Name
- Youngju Kim
- @fjvbn20031
- はじめに — 自由なインターネットの終わりか
- 現行の年齢認証の問題
- プライバシー保存認証の核心アイデア
- ゼロ知識証明 — 秘密を明かさず証明する
- Verifiable Credentialsと選択的開示
- SD-JWT — selective disclosureの実際の構造
- mDLとmdoc — もう一つの標準の系統
- eIDAS 2.0とEUデジタルウォレット
- デバイス側検証モデル
- 開発者が知るべき設計原則
- 韓国の本人確認制度との比較
- 技術が解決できない政策問題
- おわりに — バランスの取れた結論
- 参考資料
はじめに — 自由なインターネットの終わりか
2026年6月、Mullvad VPNのブログ記事一つがHacker Newsで大きな論争を巻き起こしました。タイトルは挑発的でした。ソーシャルメディアの年齢認証義務化が、自由なインターネットの終わりの始まりだ、という内容です。GeekNewsにも素早く翻訳共有され、本人確認制度を早くから運用してきた韓国でも、なじみ深いテーマが再び話題に上りました。
論争の構図は単純ではありません。一方には未成年者保護という正当な目的があり、もう一方には匿名性とプライバシーというインターネットの根本的価値があります。そしてその間に挟まれているのが、私たち開発者が作らなければならない技術です。
本記事の問いは明確です。「あなたが18歳以上であることを証明しつつ、あなたが誰なのかは明かさない」認証は技術的に可能か?そして可能なら、それで十分か?結論を先に述べると、技術的にはかなりの部分が可能ですが、技術が政策問題を代わりに解決してくれるわけではありません。この2つを分けて見ることが本記事の目標です。
現行の年齢認証の問題
今ほとんどのサービスが使う年齢認証方式は、プライバシーの観点からひどいものです。大きく3つあります。
| 方式 | 動作 | プライバシー問題 |
|---|---|---|
| 自己申告 (生年月日入力) | ユーザーが直接入力 | 検証されず、無力 |
| 身分証アップロード | 身分証の写真を提出 | 全身元が露出、データ流出リスク |
| 顔年齢推定 | カメラで顔を分析 | 生体情報収集、推定誤差 |
| クレジットカード確認 | カードで成人確認 | 決済情報露出、カードのない成人を排除 |
自己申告は何も防げません。残りの3つは防ぎますが、防ぐ代償としてユーザーの全身元や生体情報を、サービス提供者(あるいはその下請け検証業者)に渡してしまいます。
核心的な問題は過剰収集です。サービスが知るべきことは、たった1ビットの情報、「この人は18歳以上か?」のはい/いいえだけです。ところが現行方式は、名前、住所、住民番号、顔、身分証番号までいっぺんに渡させます。1ビットを確認するために数百ビットを露出させる格好です。
ここにデータ流出リスクが加わります。年齢検証のために収集された身分証画像のデータベースは、それ自体が魅力的なハッキング標的です。実際、年齢認証義務化を導入した複数の地域で、検証業者のデータ流出事故が報告されました。守ろうとした未成年者を含むすべてのユーザーの身元が、かえってより大きなリスクに晒されるという逆説です。
プライバシー保存認証の核心アイデア
この問題を解く技術的洞察は1980年代から存在しています。核心は2つです。
原則1: データ最小化 (Data Minimization)
必要なたった一つの事実だけを証明する。
「18歳以上」の1ビットだけ、生年月日すら露出しない。
原則2: 検証と身元の分離 (Unlinkability)
発行者(国家)は私がどこで認証したか知らず、
検証者(サービス)は私が誰なのか知らない。
発行と検証が互いに追跡されない。
この2つの原則を実装する技術が、ゼロ知識証明、Verifiable Credentials、selective disclosureです。一つずつ見ていきます。
ゼロ知識証明 — 秘密を明かさず証明する
ゼロ知識証明(Zero-Knowledge Proof, ZKP)は、ある命題が真であることを、その命題が真である理由(秘密)はまったく明かさずに証明する暗号技法です。名前は難しいですが、直感は単純です。
古典的なたとえを挙げます。色覚障害のある友人に、赤いボールと緑のボールが互いに違う色だと証明したいとしましょう。友人が2つのボールを背中の後ろで入れ替えるかどうかを決めて見せると、私は入れ替わったかどうかを毎回当てられます。この過程を何度も繰り返すと、友人は「この人は2つのボールを区別できる」と確信します。ところが、どのボールが何色かは最後まで言いませんでした。これがゼロ知識の核心的直感です。能力(あるいは事実)を証明しつつ、その内容は漏らさないことです。
年齢認証に適用するとこうなります。
主張: 「私は18歳以上だ」
証明: 生年月日が記された署名済み資格証明を持っており、
その生年月日が (今日 - 18年) より前であることをZKPで証明
公開されるもの: 「真」という結果の1ビット
公開されないもの: 実際の生年月日、名前、身分証番号などすべて
数学的には範囲証明(range proof)という技法を使います。「私が持つ秘密の値xが特定の範囲内にある」をxを明かさずに証明するものです。生年月日を数字と見れば、「この数字が特定の基準日より小さい」がすなわち「18歳以上」です。
ZKPの魅力は強力ですが、実用化の障害もあります。証明生成の計算コスト、信頼設定(trusted setup)の必要性、そして何より一般ユーザーが理解しにくい点です。このため実際の標準化の流れはZKPだけでなく、より単純で検証されたselective disclosure技法とともに進みます。
Verifiable Credentialsと選択的開示
W3C Verifiable Credentials(VC)はデジタル資格証明の標準データモデルです。紙の身分証をデジタルに移したものと考えればよいです。ただし3つの主体が明確に分離されます。
+-----------+ 発行 +-----------+ 提示 +-----------+
| 発行者 |---------->| 保有者 |---------->| 検証者 |
| (Issuer) | | (Holder) | | (Verifier)|
| 例: 国家 | | 例: ユーザー| | 例: サービス|
+-----------+ +-----------+ +-----------+
|
ウォレットに保管
(スマートフォン)
核心は、発行者と検証者が直接通信しない点です。国家が発行した資格証明をユーザーが自分のウォレットに保管し、必要なときにサービスに提示します。国家は私がどのサービスにそれを提示したか知りません。これが先述のunlinkabilityの一軸です。
ここにselective disclosure(選択的開示)が組み合わさります。資格証明には名前、生年月日、住所など複数の属性が入っていますが、提示する際にはそのうち必要なものだけを選んで見せられます。年齢認証であれば「18歳以上」という派生属性一つだけを公開し、残りは隠します。
SD-JWT — selective disclosureの実際の構造
selective disclosureを実装する代表的フォーマットがSD-JWT(Selective Disclosure for JWTs)です。IETFで標準化が進行中で、デジタル身分証の実質的な基盤技術として定着しつつあります。構造をコードで見てみます。
通常のJWTはすべてのクレームがペイロードにそのまま入っているため、一つでも見せるには全部見せなければなりません。SD-JWTは各クレームをハッシュに置き換え、実際の値を別途のdisclosureに分離します。
{
"iss": "https://issuer.example.gov",
"iat": 1749686400,
"vct": "https://credentials.example/identity",
"_sd": [
"MTHmVfX6cFTW6oqYk8s3lDxgZ9c0Q1d2e3f4g5h6i7j",
"9pK2lM3nO4pQ5rS6tU7vW8xY0zA1bC2dE3fG4hI5jK6"
],
"_sd_alg": "sha-256",
"age_over_18": true
}
上のペイロードで_sd配列の各項目は、隠されたクレームのハッシュです。発行者はこれとは別に、各クレームの実際の値とソルトを含むdisclosureを一緒に渡します。
disclosureの例 (base64urlデコードした概念的な形):
["ランダムソルト値", "given_name", "ホン・ギルドン"]
["ランダムソルト値", "birthdate", "1990-03-15"]
提示の時点で、保有者は公開するdisclosureだけを選んで添付します。検証者は添付されたdisclosureをハッシュして_sdのハッシュと照合し、完全性を確認します。添付されていないクレームはハッシュだけが存在するため、検証者が原本を復元できません。
年齢認証シナリオの全体の流れはこうなります。
1. 国家がSD-JWT資格証明を発行
- age_over_18のような派生ブールクレームをあらかじめ含める
- またはbirthdateを隠したクレームとして含める
2. ユーザーがウォレットに保管
3. サービスが「18歳以上の証明」を要求
4. ウォレットはage_over_18クレームだけを公開する提示本を生成
- given_name、birthdateなどは添付しない
5. サービスは発行者署名 + 公開されたクレームだけを検証
- ユーザーの実際の年齢、名前は最後まで分からない
ここで重要な設計の選択が見えます。birthdateを隠して入れ、検証者に計算させることもできますが、それではbirthdateを公開しなければなりません。より良い方式は、発行者があらかじめage_over_18のような派生ブールクレームを作って入れることです。そうすれば検証者は生年月日を永遠に知る必要がありません。データ最小化原則の実践です。
さらに、holder binding(キーバインディング)という仕組みがあります。資格証明に保有者の公開鍵を結びつけ、提示する際に保有者が該当の秘密鍵で署名させるものです。こうすると資格証明を盗んで再利用する攻撃を防げます。
mDLとmdoc — もう一つの標準の系統
デジタル身分証の標準には2つの系統があります。一つが今見たSD-JWT系で、もう一つがISO/IEC 18013-5のmDL(mobile Driving License)とそのデータフォーマットであるmdocです。運転免許証のデジタル版を標準化したもので、すでに複数の国や米国の一部の州で採用されています。
mdocもselective disclosureをサポートします。バーで身分証を見せるときに「成人かどうか」だけ見せて住所は隠す、といった使用事例を正確に狙っています。EUのデジタル身元ウォレットは、SD-JWTとmdocの両方を受け入れる方向で設計されています。
デジタル身分証標準の地形図
ZKPベース ---+
| より強いunlinkability、複雑度が高い
|
SD-JWT ------+--- W3C VC / OpenID4VP エコシステム
| Web/OAuthフレンドリー
|
mdoc (ISO) --+--- オフライン提示、政府身分証フレンドリー
eIDAS 2.0とEUデジタルウォレット
これらの技術を実際の制度に結びつける最大の試みが、EUのeIDAS 2.0とEUDI Wallet(European Digital Identity Wallet)です。すべてのEU市民にデジタル身元ウォレットを提供し、その中に身分証や各種資格証明を入れてselective disclosureで提示させる構想です。
設計意図そのものはプライバシーフレンドリーです。データ最小化、ユーザー制御、unlinkabilityが明示的な要求事項として入っています。年齢認証はこのウォレットの核心的活用事例の一つに挙げられます。
ただし論争も大きいです。批判者は、国家が発行する単一のデジタル身元体系が、かえって追跡と統制のインフラになりうると懸念します。unlinkabilityがプロトコルレベルで保証されても、実装と運用、政策の隙間で崩れうるからです。技術設計と実際の運用の間の隔たりが核心的な争点です。
デバイス側検証モデル
AppleとGoogleが推すもう一つのアプローチがデバイス側検証です。身分証をスマートフォンのウォレット(Apple Wallet, Google Wallet)に保管し、検証のかなりの部分を端末内で処理します。
[サーバー側検証 — 従来]
ユーザーデータ --> サーバーへ送信 --> サーバーが検証 --> 結果
(データがサーバーに到達、露出リスク)
[デバイス側検証 — 新モデル]
セキュリティチップ(Secure Enclave)に資格証明を保管
|
v
要求に対して端末がselective disclosure提示本を生成
|
v
最小情報だけをサーバーへ送信 (age_over_18など)
利点は明確です。機密データが端末を離れず、ハードウェアセキュリティモジュールで保護されます。しかし欠点もあります。このモデルは本質的に、AppleとGoogleという2つのプラットフォームに信頼を集中させます。ゲートキーパー権力がより強くなるという批判、そして両社のOSを使わないユーザーが排除されうるという公平性の問題が伴います。
開発者が知るべき設計原則
年齢認証であれ他の身元検証であれ、プライバシーを保存するシステムを設計する際の原則を整理します。
1. データ最小化をデフォルトに
- 「18歳以上」のブール1ビットだけを要求する。
- 生年月日が必要なければ生年月日を受け取らない。
2. 派生クレームを発行段階で作る
- 検証者に原本で計算させないこと。
- age_over_18、age_over_21などを発行者があらかじめ入れる。
3. 検証結果を保存しない
- 検証後すぐに破棄。セッション標識だけを残す。
- 「検証済み」という事実だけを残し、検証に使ったデータは捨てる。
4. 発行-検証の非連結性を維持する
- 検証ログが発行者に流れないようにする。
5. フォールバック経路を差別なく設計する
- デジタルウォレットのないユーザーも排除されないように。
6. 標準に従う
- 独自の暗号プロトコルを作らないこと。
- SD-JWT、OpenID4VP、mdocなど検証された標準を使う。
3番目の原則が特に重要です。多くのシステムが「検証記録」を残すという名目で検証に使ったデータを保管し、流出事故を起こします。プライバシー保存の核心は、データを安全に保管することではなく、そもそも保管しないことです。
韓国の本人確認制度との比較
韓国はこの論争で独特な位置にあります。インターネット実名制と本人確認制度を早くから運用してきたからです。ゲームのシャットダウン制、成人コンテンツアクセス時の本人確認などがなじみ深いです。
韓国モデルの特徴は本人確認機関を通じた仲介検証です。通信会社や信用評価会社のような指定機関が本人確認情報を保有し、サービスはその機関を通じて確認結果(連携情報、重複加入確認情報など)を受け取ります。サービスが住民番号を直接受け取らないという点で一部のデータ最小化が適用されていますが、結局は本人確認機関という中央集中点にデータと検証履歴が蓄積されます。
これを先述の分散型モデルと比較すると、違いが明確です。
| 側面 | 韓国の本人確認機関モデル | VC/ウォレットモデル |
|---|---|---|
| データ保有 | 本人確認機関に集中 | ユーザーウォレットに分散 |
| 検証履歴 | 機関が追跡可能 | 非連結性を設計可能 |
| 選択的開示 | 限定的 (決められた項目) | クレーム単位で選択 |
| 匿名性 | 弱い | プロトコルレベルで保証可能 |
韓国の制度は安定して動作してきましたが、中央集中と検証履歴の追跡という構造的特性は、分散型プライバシー保存技術が追求する方向とは異なります。今後のデジタル身分証導入の議論で、この2つのモデルがどう収束するか衝突するかが見どころです。
技術が解決できない政策問題
ここまでが技術的に可能なことでした。ここからは正直になる番です。プライバシー保存技術が完璧に実装されても、残る問題があります。Mullvadの記事が本当に指摘したのはこの部分です。
第一に、萎縮効果(chilling effect)です。匿名でアクセスできなくなった瞬間、人々は政治的意見の表明、敏感な情報の検索、マイノリティコミュニティへの参加を自ら自制するようになります。「18歳以上」だけ証明しても、匿名が消えたという認識そのものが表現の自由を萎縮させます。ゼロ知識証明は身元を隠してくれますが、検証という行為が存在するという事実そのものは隠してくれません。
第二に、範囲拡大(scope creep)です。年齢認証のために構築した身元インフラは、他の用途へ簡単に転用されます。最初は未成年者保護でも、次はコンテンツ検閲、その次は反体制人士の追跡へと拡大しうります。技術が中立的でも、それが作ったインフラは中立的ではありません。
第三に、排除の問題です。デジタル身分証のない人、スマートフォンのない人、特定のプラットフォームを使わない人はどうなるのか?プライバシーを完璧に保存するシステムも、それを持てない人をインターネットから排除するなら、また別の差別です。
第四に、検証義務化そのものへの問いです。最も根本的な批判は「年齢認証を全員に強制することが正しいのか」です。未成年者保護という目的が正当でも、その手段として全人口の匿名アクセス権を取り上げることが比例的か?これは暗号学で解けない、社会が答えるべき問いです。
おわりに — バランスの取れた結論
整理するとこうなります。
技術は、私たちが恐れる最悪のシナリオ(身分証アップロード、顔スキャン、データ流出)をかなりの部分回避できるようにしてくれます。ゼロ知識証明、SD-JWT、Verifiable Credentials、デバイス側検証は、「1ビットだけ証明して残りを隠す」認証を実際に可能にします。開発者として年齢認証を実装しなければならないなら、身分証の写真をサーバーで受け取る方式ではなく、こうしたプライバシー保存標準を使うのが明らかに正しいです。
しかし技術が政策問題を代わりに解決してくれるわけではありません。萎縮効果、範囲拡大、排除、検証義務化の正当性は暗号プロトコルで解決されません。「プライバシーを守る年齢認証が技術的に可能だ」という命題が、「したがって年齢認証を義務化してもよい」へ自動的につながらないという点を、私たちは明確に区別しなければなりません。
開発者に残る実践的な結論は2つです。第一に、年齢認証を実装しなければならない状況なら、データ最小化を極端まで押し進め、検証された標準を使ってください。第二に、しかし技術の優雅さが政策の正当性を自動的に保証しないという点を忘れないでください。良い技術は悪い政策をより悪くないものにできるだけで、良いものにはできません。
自由なインターネットの終わりかどうかは、結局、技術ではなく、私たちがどのような政策を選ぶかにかかっています。
参考資料
- Mullvad — Age verification for social media: https://mullvad.net/en/blog/age-verification-for-social-media-the-beginning-of-the-end-for-a-free-internet
- W3C Verifiable Credentials Data Model 2.0: https://www.w3.org/TR/vc-data-model-2.0/
- IETF SD-JWT ドラフト: https://datatracker.ietf.org/doc/draft-ietf-oauth-selective-disclosure-jwt/
- EU Digital Identity (eIDAS 2.0): https://digital-strategy.ec.europa.eu/en/policies/eudi-wallet
- ISO/IEC 18013-5 (mDL): https://www.iso.org/standard/69084.html
- OpenID for Verifiable Presentations: https://openid.net/specs/openid-4-verifiable-presentations-1_0.html
- W3C Decentralized Identifiers (DID): https://www.w3.org/TR/did-core/
- ゼロ知識証明の概要 (zkproof.org): https://zkproof.org/
- Hacker News: https://news.ycombinator.com/
- GeekNews: https://news.hada.io/