マイナンバーカードを WebAuthn 認証器にする一連の実験(Safari / Android)を進める中で、よく聞かれるのが「それって YubiKey と同じくらい安全なの?」です。結論から言うと「半分そう、半分違う」。しかもその違いは、マイナFIDOの設計の核心に関わります。整理します。
まず2つの軸を分ける
| 軸 | 中身 |
|---|---|
| A. フィッシング耐性 | origin に縛られ共有秘密が無い。パスキー全般 ≒ YubiKey で同等 |
| B. 鍵の非抽出性(耐タンパー) | 秘密鍵がハードから出ないか。種類で大きく違う |
「PCと物理的に分離して安全」という直感が効くのは主に軸Bです。そしてここが、マイナFIDOとYubiKeyで決定的に違う点です。
YubiKey と マイナFIDO の違い
- YubiKey:秘密鍵はチップ内で生成され、外に出ない・署名もチップ内。最強の耐タンパー。
- マイナFIDO(この実装):カードは「種(seed)の供給」だけ。実際の鍵導出と署名はPCやスマホのソフト側で行う。つまり署名の瞬間、鍵はメモリ上に存在する。
これは欠陥ではなく設計の結果です。カードのRSA署名を seed にして、サイトごとに別の Ed25519 / P-256 鍵をソフトで導出している。だから「RPごとに別鍵(per-RP 非連結)」「公式のJPKI鍵を晒さない」が成立する。元実装の作者も「耐タンパー性は失われた」と明言しています。
「所持で管理」は YubiKey 同等、崩れるのは1点だけ
- 所持要素(カード+PINが無いと使えない):YubiKey と同等。盗難・フィッシングに強い。日常の「持っている人だけが使える」保証は同じ。
- 崩れる条件:署名する瞬間にPC/スマホがマルウェア汚染されていた場合のみ。導出鍵がメモリにある一瞬を突かれると鍵を抜かれ、以後そのRPはカード無しで署名され得る。YubiKeyは鍵がチップから出ないのでこれが起きない。
つまり「自分の端末が普段クリーン」という前提なら、実用上はかなり YubiKey に近い。逆に”汚染端末前提”の最高機密用途では差が出ます。
なぜ「両立」できないのか
「ならカード内で署名すれば耐タンパーになるのでは?」——なります。JPKIのRSA鍵はカード内署名なので、それを直接使えば YubiKey 級。ただしカードのRSA鍵は1枚に1つ。直接使うと:
| 方式 | 署名場所 | 耐タンパー | per-RP 非連結 |
|---|---|---|---|
| ソフト派生(現方式) | ソフト | ❌ | ✅ |
| JPKI直署名(RS256) | カード内 ✅ | ✅ | ❌(全RP同一鍵で名寄せ+鍵露出) |
マイナカードのアプレットは JPKI 専用で鍵が1つだけ。「RPごとに別鍵をチップ内で派生して署名」はできません。耐タンパーとper-RPプライバシーは、カード1枚では同時に満たせない——ここが本質的なトレードオフです。
「仮想空間で分離」すれば?
署名をマルウェアから隔離する発想は正しい。ただし効果は隔離の種類次第:
- 普通のVM:ホストの方が偉い(VMメモリをスナップショット可)→ 汚染ホストには勝てない。
- TEE(SGX等で自前コードを動かす):kernel でもメモリを読めない → 本命。だが Mac では事実上使えない(SGX無/TrustZone非開放/Secure Enclave は自前コード不可)。
- Confidential VM(AMD SEV-SNP / Intel TDX):VMメモリ暗号化でホストからも読めない → host-proof。ただし対応CPU(Linux/クラウド)が要る、Mac外。
- 別の物理デバイス:結局「自前の鍵デバイスを作る」= 強いが手間。
結論:位置づけを間違えなければ強い
マイナFIDOは「YubiKey代替の金庫」ではありません。全員が持つカードで、所持+PIN による本人性とフィッシング耐性を低コストで足す層です。鍵の堅牢さで勝負しない。足りない本人性は、登録・重要操作時に OIDC(デジタル認証アプリ)で再確認する多層設計で補う。この割り切りができれば、「ハード追加ゼロでフィッシング耐性のある本人認証」という、中小企業にも現実的な選択肢になります。

コメントを残す