Status: PROPOSAL (Governance Discussion)
1. 目的
本仕様は、以下を目的とする。
- マイナンバーカード保有者が 自らに紐づく行政証明書類(住民票、課税証明書等)を第三者に提示していること を機械的に検証可能な形で証明・配布可能にすること。
- 提示物を Web/A (Web Archive) 単一ファイル として完結させ、専用アプリ(Wallet)を強制せずにブラウザのみで検証可能にすること。
- ゼロ知識証明(ZKP)等の高度な暗号技術を必須とせず、現行の公開鍵暗号基盤(PKI)の延長線上で実装可能 な「Targeted Issuance(宛先限定発行)」モデルを採用し、プライバシーと相互運用性を両立する。
2. 設計原則(Privacy & Trust)
本仕様では、ZKPを用いずに名寄せ防止(Unlinkability)を実現するため、「1回の提示につき、1つの固有なWeb/Aを発行する(Targeted Issuance)」 モデルを基本とする。
- Identity Anchor: 本人性は JPKI(署名用電子証明書) で確立する。
- Device Binding: 継続的な利用・提示意思は FIDO鍵(Passkey) で担保する。
- Targeted Privacy: 証明書VCは「提示先(Audience)」ごとに固有のIDで発行し、横断的な追跡を防ぐ。
- HMP (Human-Machine Pairing): 人間用の券面(HTML)と機械用のデータ(VP)を単一ファイルに封入し、Web/A 署名 で一体性を保証する。
3. 全体ワークフロー
Phase 1: オンボーディング(Identity Binding)
初回のみ実施。端末(FIDO鍵)と本人(JPKI)を紐付ける。
- User: FIDO鍵ペア
(sk_fido, pk_fido)を生成。 - User: 「鍵所有誓約書 (KeyBindingStatement)」 を作成し、JPKIカードで署名。
- 「私(マイナンバーハッシュA)は、このFIDO公開鍵Bを管理しています」
- Issuer (自治体): JPKI署名を検証し、
pk_fidoを登録。
Phase 2: 証明書発行(Targeted Issuance)
証明書が必要になるたびに実施(コンビニ交付のデジタル版)。
- User: 発行申請を行う。
- 対象: 「住民票」
- 提示先 (Audience): "株式会社〇〇銀行"(またはドメイン
bank.example.com)
- User: リクエストに対して
sk_fidoで署名(本人意思の確認)。 - Issuer: 提示先限定VC を発行。
- VC内に
audience: "bank.example.com"を明記。 - ここでの識別子は「提示先ごとのペアワイズID」とする(名寄せ防止)。
- VC内に
- Issuer: VCとHTMLテンプレートを結合し、Web/A ファイルを生成・署名してダウンロードさせる。
Phase 3: 提示・検証 (Presentation)
- User: Web/A ファイルを提出(メール、アップロード等)。
- Verifier: ブラウザで Web/A を開く。
- System Integrity: 発行者署名の検証。
- Audience Check: 自分が指定された
audienceか確認。 - Holder Binding: (オプション)VP署名を検証。
4. データ構造定義
4.1 FIDO鍵紐付け証明 (KeyBindingStatement)
JPKIを用いて「このFIDO鍵は私のもの」と宣言するデータ。オンボーディング時に作成。
{
"type": "FidoKeyBindingStatement",
"issuer": "jpki:subject-hash",
"issuedAt": "2025-01-01T00:00:00Z",
"credentialSubject": {
"fido_public_key": {
"kty": "EC",
"crv": "P-256",
"x": "...",
"y": "..."
}
},
"proof": {
"type": "JpkiSignature",
"verificationMethod": "urn:jpki:cert:...",
"jws": "..."
}
}
4.2 行政証明書VC (Targeted VC)
発行者が「特定の提示先」に向けて発行したVC。
Holder Binding を実現するため、対象者のFIDO公開鍵ハッシュ等を cnf (Confirmation) クレームに含める。これにより、IDがランダムであっても「同一の鍵を持つ人物」であることを証明できる。
{
"@context": ["https://www.w3.org/2018/credentials/v1"],
"type": ["VerifiableCredential", "JuminhyoCertificate"],
"issuer": "did:web:city.example.jp",
"issuanceDate": "2025-04-01T10:00:00Z",
"expirationDate": "2025-07-01T10:00:00Z",
"credentialSubject": {
"credentialSubject": {
// 提示先ごとに異なるランダムなID (Pairwise ID)
"id": "did:folio:uuid:12345-random-for-bank-a",
"audience": "bank.example.com",
"juminhyoData": { ... },
// 【重要】同一人物性の担保(Holder Binding)
// このVCは、以下の鍵を持つ者だけが正当に行使できる
"cnf": {
"jwk": { ...FIDO_Public_Key... }
}
},
"proof": { ... } // 発行者(自治体)の署名
}
法的制約 (Legal Requirement):
発行者(自治体)は、juminhyoData の生成において、住民基本台帳法および施行令で認められた記載事項の組み合わせ(定型パターン)のみを使用しなければならない。恣意的な項目の削除や、法的に存在し得ない組み合わせの発行は禁止される。
セキュリティ要件 (Red Team Requirement): FIDO鍵によるStrong Bindingを採用するため、端末紛失時にはこの証明書へのアクセス権も永久に失われる。「この証明書はこの端末でしか開けません」等の警告UIをユーザーに提示し、理解を得ることが必須となる。
4.3 Verifiable Presentation (VP)
UserがWeb/A内で提示するデータ。
{
"type": "VerifiablePresentation",
"verifiableCredential": [
{ ... } // 上記の行政証明書VC
],
"proof": {
"type": "FidoSignature",
"verificationMethod": "#fido-key",
"challenge": "timestamp-or-nonce",
"domain": "bank.example.com"
}
}
5. Web/A ファイル構造(HTML)
生成される .html ファイルは以下の構造を持つ。
<!DOCTYPE html>
<html lang="ja">
<head>
<!--
Layer 4: Presentation
行政標準文字、レイアウト定義、レンダラ用スクリプト(WASM)
-->
<meta charset="UTF-8">
<script src="renderer.wasm.js"></script>
</head>
<body>
<!-- 人間可読な券面(デフォルトで表示) -->
<div id="visual-layer" class="a4-compliant">
<h1>住民票の写し</h1>
...
</div>
<!--
Layer 2 & 3: Data & Trust (不可視データブロック)
改ざん検知のため、body全体のハッシュ等とリンクする
-->
<script type="application/ld+json" id="vp-data">
{ /* 上記 VP データ (Signed) */ }
</script>
<script type="application/json" id="web-a-manifest">
{
"version": "1.0",
"layout_integrity": "sha256-...",
"issuer_signature": "..."
}
</script>
</body>
</html>
6. プライバシーとセキュリティに関する考察
6.1 名寄せ防止 (Unlinkability) と 鍵バインドの選択
- 課題: 証明書の持ち主を証明するために「マイナンバーカードの署名用電子証明書(JPKI公開鍵)」を直接バインド(
cnf: {jwk: JPKI_Pub}) すると、どうなるか?- JPKIの公開鍵は5年間不変であり、強力な個人識別子となる。
- A銀行向けの証明書とB不動産向けの証明書に同じJPKI公開鍵が含まれていると、両社がデータを突き合わせた際に名寄せが可能になってしまう。これは「番号法」の精神に反するプライバシーリスク(プロファイリング)である。
- 解決策: 「代理鍵としてのFIDO鍵」へのバインド。
- Web/A Folioでは、JPKI公開鍵を直接VCに焼くことはしない。
- 代わりに、ユーザーは提示先やデバイスごとに異なる FIDO鍵(または一時的な公開鍵) を生成し、VCに紐付ける。
- これにより、A銀行とB不動産に提出するデータは、IDも署名鍵も異なり、数学的に全く関係のない別人に見える(Unlinkabilityの確保)。
- 同時に、同一の受取手に対して複数の証明書を出す場合のみ、あえて同じFIDO鍵を使うことで「同一人性」を証明する。
6.2 提示意思の証明 (Replay Guard)
- 課題: Web/Aファイルが盗まれた場合、コピーして悪用される。
- 解決策: Audience Binding と FIDO署名。
- VC内に
audience: bank.example.comが焼かれているため、他社(C不動産)へ使い回すことはできない。 - Web/Aファイル自体にFIDO署名検証ロジックを組み込み、閲覧時にも(必要であれば)FIDO認証を求めることが可能(Identity Binding)。
- VC内に
7. 複数証明書の一括提示(Multi-Certificate Presentation)
「住民票」と「課税証明書」など、複数の証明書をセットで提出し、それらが同一人物のものであることを証明するケース。
7.1 検証ロジック
本仕様では、VC内のID(credentialSubject.id)はランダム化されるため、IDの一致による名寄せはできない。代わりに Cryptographic Holder Binding を用いる。
- VCの確認: 提出された全てのVC(住民票、課税証明書)の
credentialSubject.cnf.jwkが、同一のFIDO公開鍵 を指していることを確認する。 - VPの署名検証: そのFIDO秘密鍵によって VP 全体に署名がなされていることを検証する。
これにより、「IDは異なるが、両方とも同じ鍵の持ち主(=本人)に対して発行された真正な証明書である」ことが数学的に保証される。
8. 実装者向けガイドライン
7.1 Input
ツールは以下の入力を受け取る。
- Issuer Key: 自治体署名鍵 (Ed25519)
- Holder FIDO Key: ユーザーの公開鍵 (P-256)
- Certificate Data: 住民データ (JSON)
- Audience: 提示先識別子 (String)
7.2 Process
credentialSubject.idをランダム生成。audienceをペイロードに注入。- JSON-LD を正規化し、Issuer Key で署名 → VC生成。
- VC を HTML テンプレート内の
<script id="vp-data">に埋め込む。 - HTML 全体の整合性を計算し、最終署名を行う。
7.3 Output
- Output: 署名済み Web/A HTMLファイル (
juminhyo.html)
8. 補足:Folioとの関係
本仕様で生成されるWeb/Aファイルは、「Web/A Folio」 のコンテナ仕様に完全準拠する。ユーザーはこれを自分のクラウドストレージ等(Folio Vault)に保存し、必要な時にURLやファイルとして提示できる。