Upgrade to Pro — share decks privately, control downloads, hide ads and more …

マイナンバーカードの暗号技術とセキュリティ

Mako
September 11, 2023

 マイナンバーカードの暗号技術とセキュリティ

セキュリティ・ミニキャンプ新潟2023のスライド資料です。
マイナンバー制度とマイナンバーカードの仕組み(演習あり)とデジタル本人確認の方法について説明しています。

Mako

September 11, 2023
Tweet

More Decks by Mako

Other Decks in Technology

Transcript

  1. 自己紹介 • @tex2e • 得意分野 ◦ 暗号技術、プロトコル、セキュリティ • 活動 ◦

    セキュリティ・キャンプ2018 TLS 1.3/暗号ゼミ(参加者) ◦ セキュリティ・キャンプ2019〜2021(チュータ) ◦ セキュリティ・キャンプ2022〜2023(講師) ◦ Hardening Project 2021〜2022(競技者)
  2. マイナンバー制度の目的 • 行政を効率化する ◦ 情報照会・転記・入力に要する時間を削減する • 国民の利便性を高める ◦ 行政手続きに必要な添付書類を削減する ◦

    行政機関からのお知らせを受け取る • 公平・公正な社会を実現する ◦ 所得や他の行政サービスの受給状況を把握し、 脱税や不正受給を防止する
  3. ICチップ内のアプリ構成 • 公的個人認証 (JPKI) AP ◦ 2種類の電子証明書とその秘密鍵を扱う • 券面AP ◦

    券面記載事項(顔写真含む)を扱う • 券面事項入力補助AP ◦ 基本4情報(氏名、住所、生年月日、性別)を扱う • 住基AP ◦ 住民票コードを扱う
  4. 署名と認証 • オンライン手続きにおける脅威 ◦ なりすまし(他人のフリをして申請される) ◦ 改ざん(申請後に申請内容を変更される) ◦ 否認(実際には申請済みなのに、その事実を否認される) •

    電子署名 ◦ 署名を検証することで電子データの作成者を認証する ◦ なりすまし、改ざん、否認の全ての対策になる • 認証 ◦ なりすましに対する対策になる
  5. 【演習1】証明書と秘密鍵 • ICカード内には認証用と署名用の証明書(公開鍵)と秘密鍵がある • 【演習】 ◦ opensslコマンドで自己署名証明書を作ろう $ openssl genrsa

    -out private.key $ openssl req -new -key private.key -out server.csr -subj "/C=JP/ST=Niigata/L=Niigata/O=SecurityMiniCamp/CN=example.com" $ openssl x509 -req -days 365 -signkey private.key -in server.csr -out server.crt $ openssl rsa -in private.key -text $ openssl req -in server.csr -text $ openssl x509 -in server.crt -text
  6. 【演習3】証明書と秘密鍵 • ICカード内には秘密鍵で署名する機能がある • 【演習】 ◦ opensslで秘密鍵でmsg.txtを署名しよう ◦ opensslで公開鍵でmsg.txt.sigを検証しよう $

    openssl dgst -sha256 -sign private.key msg.txt > msg.txt.sig $ openssl dgst -sha256 -verify server.pub -signature msg.txt.sig msg.txt Verified OKと出力されたら検証成功
  7. 証明書の失効確認 • 署名用電子証明書は異動(氏名や住所の変更)時などに失効する • 一般的な失効確認方法: ◦ 証明書失効リスト(CRL; Certificate Revocation List)

    ◦ OCSP(Online Certificate Status Protocol) ◦ OCSP Stapling • 実際は公的個人認証サービス(J-LIS)などと通信して確認する
  8. 【演習4】証明書の失効確認 • 証明書の失効状態を確認してから、その公開鍵を利用すること • 【演習】 ◦ opensslコマンドでOCSPによる証明書検証をしよう $ openssl s_client

    -connect google.com:443 -showcerts -servername google.com < /dev/null $ # 証明書チェーンの0番目をTARGET.crt(サーバ証明書)に保存 $ # 証明書チェーンの1番目をINTERMEDIATE.crt(中間証明書)に保存 $ openssl x509 -in TARGET.crt -text -noout | grep OCSP $ # OCSPリクエストの送信先URLを確認 $ openssl ocsp -issuer INTERMEDIATE.crt -cert TARGET.crt -url URL -text $ # Response verify OKと表示されたら検証成功
  9. ICカードの論理データ構造 MF DF EF IEF DF 専用ファイル 基礎ファイル 内部基礎ファイル (鍵情報)

    マスターファイル ※カードを起動した直後は  MFがカレントになる
  10. マイナンバーカードのデータ構造 • AID(アプリケーションID)で識別 DF AID 公的個人認証AP D3 92 F0 00

    26 01 00 00 00 01 券面入力補助AP D3 92 10 00 31 00 01 01 04 08 MF 公的個人認証AP 券面AP 券面入力補助AP 住基AP
  11. マイナンバーカードのデータ構造 IEF001B 署名用PIN MF 公的個人認証AP 券面AP 券面入力補助AP 住基AP IEF001A 署名用鍵

    EF0001 署名証明書 EF000A 認証証明書 EF0002 署名用CA EF000B 認証用CA IEF0017 認証用鍵 IEF0018 認証用PIN EF0002 基本4情報 IEF0011 入力補助用PIN EF0001 個人番号 (1) 暗証番号入力 (2) アクセス
  12. APDUプロトコル APDU (Application Protocol Data Unit) プロトコル (Smart Card Guy)

    https://smartcardguy.hatenablog.jp/entry/2018/08/11 /153334 コマンド構造 コマンド例 Case 1 CLA INS P1 P2 — Case 2 CLA INS P1 P2 Le READ BINARY Case 3 CLA INS P1 P2 Lc data SELECT FILE Case 4 CLA INS P1 P2 Lc data Le COMPUTE DIGITAL SIGNATURE Le : 期待する返信データ長 Lc : 送信するデータ長 data : 送信するデータ data : 返信データ
  13. APDUプロトコル • SELECT FILE ◦ APを選択したり、証明書やロック解除用の PINにアクセスする • パラメータ ◦

    命令クラス : 00、命令コード : A4 ◦ 引数1 : 04 (DF名で選択) または 02 (現在のDF直下のEF名で選択) ◦ 引数2 : 00 (最初のレコード) ◦ ファイル名:00 1B > 00 A4 02 0C 02 00 1B < 90 00
  14. APDUプロトコル • VERIFY ◦ 入力した暗証番号と比較して、内部のステータスを更新する > 00 20 00 80

    04 31 32 33 34 < 90 00 • パラメータ ◦ 命令クラス : 00、命令コード : 20 ◦ 引数1 : 00 ◦ 引数2 : 80 (特定のDF/EFのパスワード) ◦ パスワード:31 32 33 34
  15. APDUプロトコル • READ BINARY ◦ 選択したファイルのバイナリデータを読み取る • パラメータ ◦ 命令クラス

    : 00、命令コード : B0 ◦ 引数1〜2 : オフセット値(先頭から読み取るときは00 00を指定) ◦ Leフィールド : 読み取るバイト数 > 00 B0 00 00 04 < 30 82 06 1F 90 00
  16. APDUプロトコル • COMPUTE DIGITAL SIGNATURE ◦ ハッシュ値を入力して、署名を生成する • パラメータ ◦

    命令クラス : 80、命令コード : 2A、引数1〜2 : 00 80 ◦ Lcフィールド : 署名対象データ長、Data : 署名対象データ ◦ Leフィールド : 署名結果データ長(00は無制限?) > 80 2A 00 80 33 ...対象データ... 00 < ...署名結果... 90 00
  17. APDUプロトコル通信例 > 00 A4 04 0C 0A D3 92 F0

    00 26 01 00 00 00 01 # SELECT FILE: 公的個人認証AP < 90 00 > 00 A4 02 0C 02 00 18 # SELECT FILE: 認証用PIN < 90 00 > 00 20 00 80 04 31 32 33 34 # VERIFY: 暗証番号入力 < 90 00 > 00 A4 02 0C 02 00 17 # SELECT FILE: 認証用秘密鍵 < 90 00 > 80 2A 00 80 33 ...対象データ... 00 # COMPUTE DIGITAL SIGNATURE < ...署名結果... 90 00
  18. 【演習5】カードとお話ししよう • 【演習】 ◦ マイナンバーカードから証明書を取り出してみよう ◦ 発展:証明書に記載されている内容を確認しよう $ cd secminicamp2023-mynumber

    $ cp secrets.sample.conf secrets.conf $ vi secrets.conf [secrets] password1=4桁の数字 password2=6桁以上の英数字 $ # __main__のcardreader.get_cert()のコメントアウトを外して実行 $ python mynumber.py
  19. 署名対象データ(DigestInfo) • RFC 2315とRFC 5280をまとめると DigestInfo ::= SEQUENCE { SEQUENCE

    { algorithm OBJECT IDENTIFIER, parameters ANY DEFINED BY algorithm OPTIONAL } digest OCTET STRING }
  20. ASN.1とSHA256 OID • algorithm:SHA256ハッシュ関数のObject ID(RFC 5754) DigestInfo ::= SEQUENCE {

    SEQUENCE { algorithm OBJECT IDENTIFIER, parameters ANY DEFINED BY algorithm OPTIONAL } digest OCTET STRING } • OID:数字とドットだけで世の中にある物事を識別するための符号
  21. ASN.1とSHA256 OID • parameters:ハッシュ関数のパラメータ。一般的にはNULL DigestInfo ::= SEQUENCE { SEQUENCE {

    algorithm OBJECT IDENTIFIER, parameters ANY DEFINED BY algorithm OPTIONAL } digest OCTET STRING } 05 00 ⇐ タグがNULL(0x05)、長さが0x00、データはなし(ASN.1参照)
  22. ASN.1とSHA256 OID • digest:文書(ファイル)のハッシュ値 DigestInfo ::= SEQUENCE { SEQUENCE {

    algorithm OBJECT IDENTIFIER, parameters ANY DEFINED BY algorithm OPTIONAL } digest OCTET STRING } digest ← SHA256(input file)
  23. DERエンコード • DERエンコードしたDigestInfo: 30 31 30 0B 06 09 60

    86 48 01 65 03 04 02 01 05 00 04 20 22 D6 28 B5 3B C6 B3 56 F5 91 3E 98 C5 A3 BC 8A E1 A5 BE 91 C2 91 68 02 35 8E 0E C2 BC FE 71 E7 30 31 30 0B 06 09 608648016503040201 05 00 04 20 22D628B53BC6B356F5913E98C5A3BC8AE1A5BE91C2916802… • 読みやすさ重視: [ASN.1 タグ早見表] 0x30 : SEQUENCE型 0x06 : OID型 0x05 : NULL型 0x04 : OCTET STRING型
  24. 【演習6】カードとお話ししよう • 【演習】 ◦ マイナンバーカードで署名データを作成しよう ◦ 発展:署名データを検証して正しいことを確認しよう $ cd secminicamp2023-mynumber

    $ cp secrets.sample.conf secrets.conf $ vi secrets.conf [secrets] password1=4桁の数字 password2=6桁以上の英数字 $ # __main__のcardreader.get_sign()のコメントアウトを外して実行 $ python mynumber.py
  25. 理解度チェック • 2種類の証明書はどう使い分けるか? ◦ 利用者証明用電子証明書 ◦ 署名用電子証明書 • 基本4情報の取得方法はどう使い分けるか? ◦

    公的個人認証APで取得できる署名用電子証明書の基本 4情報 ◦ 券面事項入力補助APで取得できる基本4情報
  26. Know Your Customer • KYC ◦ 顧客を知る(反社チェック。サービスが犯罪に使われないように) ◦ 本人確認をするための方法の1つ ◦

    行政手続き、金融機関、携帯電話の手続きなど • eKYC ◦ electronic KYC ◦ オンラインによるKYC(便利だが不正を防ぐための技術が必要)
  27. 犯罪収益移転防止法(犯収法) • マネーロンダリング(資金洗浄) ◦ 犯罪による収益の出所や帰属を隠そうとする行為 • 2018年の改正 ◦ 今までリモートの時は本人確認書類の郵送が必要だったが、 ◦

    eKYCの手法が認められた (ソフトウェアを使った本人確認ができるようになった) ◦ 特定事業者と特定取引で、本人特定事項などの 取引時確認が必要 ◦ ⇒ 犯罪による収益の移転を防ぐ
  28. 犯罪収益移転防止法(犯収法) • 犯収法規則 6条1項1号 ◦ イ、ロ、ハ、ニ、...、ワ、カ までの14種類の本人確認方法が規定 • 犯収法規則 6条1項1号ワ方式

    ◦ マイナンバーカードのICチップに保存された基本4情報が記載された電子 証明書と、電子署名された申請情報を利用者が送信する。 ⇒ 対面相当の最高の保証レベルの身元確認が可能
  29. 犯罪収益移転防止法(犯収法) • 犯収法規則 6条1項1号ホ方式 ◦ 顔写真付き本人確認書類の画像+容貌の撮影(顔写真) ⇒ 写真撮影の手間がかかる & 不正防止チェックに時間がかかる

    • 犯収法規則 6条1項1号ヘ方式 ◦ 顔写真付き本人確認書類のICチップ読み取り+容貌の撮影 ⇒ 写真撮影の手間が少しかかる ⇒ ICチップ読み取りは券面APや券面事項入力補助APに対応
  30. 本人確認に関する法令 • 犯罪収益移転防止法 ◦ マネーロンダリングの防止 • 携帯電話不正利用防止法 ◦ 携帯電話を利用した特殊詐欺の防止 •

    古物営業法 ◦ 盗品の売買の防止 いずれも非対面でオンラインによる本人確認手法が認められている
  31. NISTガイドライン • NIST SP 800-63-3 ◦ NISTが作成した米国政府向けのユーザ認証に関するガイドライン 文書名 概要 NIST

    SP 800-63-3 デジタルサービスでのユーザ認証について NIST SP 800-63A IALに基づいて要求されるユーザ身元確認方法 NIST SP 800-63B AALに基づいて要求されるユーザ認証方法 NIST SP 800-63C FALに基づいて要求されるアカウント連携方法
  32. 身元確認の保証レベル (IAL) • 身元確認において不正を防ぐ強度 (Identity Assurance Level) • IAL1 ◦

    身元確認のない自己表明。メールアドレスなど • IAL2 ◦ リモートまたは対面での身元確認。個人の基本 4情報で身元確認 • IAL3 ◦ 対面での身元確認。電子署名の検証による身元確認
  33. 当人認証の保証レベル (AAL) • 当人認証において不正を防ぐ強度 (Authentication Assurance Level) • AAL1 ◦

    単一の認証要素。パスワードだけ • AAL2 ◦ 複数の認証要素。多要素認証 • AAL3 ◦ 耐タンパ性が確保されたハードウェアトークンも使用する
  34. リスクの評価 • 選択概要図の「デジタルサービスを提供するリスクは何ですか?」 1. 利用者に不便・苦痛を与える、機関が信頼を失う ◦ 短期的〜長期的 ◦ 当惑する〜地位や評判に影響がある 2.

    利用者に金銭的被害を与える、機関に賠償責任が生じる ◦ 軽微〜壊滅的 3. 機関の活動計画や公共の利益に対して影響を与える ◦ 若干〜深刻
  35. リスクの評価 • 選択概要図の「デジタルサービスを提供するリスクは何ですか?」 4. 利用者の個人情報が漏洩するリスク ◦ 限定的〜致命的または壊滅的な機密性損失 5. 利用者の身の安全に影響を与えるリスク ◦

    軽傷〜深刻な負傷または死亡 6. 法律に違反するリスク ◦ 法執行の対象にならない〜対象になる ⇒ 過剰対応すると負担が増えるため、リスクを適切に見極めること
  36. マイナンバーカードによる本人確認 • 電子証明書による公的個人認証を利用する方法 ◦ 保証レベルはIAL3(最も強力) ◦ 行政手続きや犯収法などの法令に定める手法として利用可 ◦ 公的個人認証サービスによる証明書の有効性検証にコストがかかる •

    券面を撮影またはICチップ内の券面情報を送信する方法 ◦ 保証レベルはIAL2相当 ◦ 自撮り写真(本人容貌撮影)と共に申請して、犯収法の法令に定める手法とし て利用可
  37. 参考文献 • NIST SP 800-63 Digital Identity Guidelines https://pages.nist.gov/800-63-3/ •

    民間事業者向けデジタル本人確認ガイドライン第1.0版 (2023) https://www.openid.or.jp/news/kyc_guideline_v1.0.pdf