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

マイナンバーカードに2日で対応、4日でリリースした記録 / Supported to the Japanese Individual Number Card in 2 days, released in 4 days

マイナンバーカードに2日で対応、4日でリリースした記録 / Supported to the Japanese Individual Number Card in 2 days, released in 4 days

マイナンバーカードに2日で対応、4日でリリースした記録
@treastrain | @JapanNFCReader

NEW DEBUG!! ~転職してプログラマーになったら一切エラーがでないんだが~ @ CASPUR 2020/05/17 22:00~

More Decks by treastrain / Tanaka Ryoga

Other Decks in Programming

Transcript

  1. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    マイナンバーカードに2日で対応、
    4日でリリースした記録
    @treastrain | @JapanNFCReader
    1
    NEW DEBUG!! ~転職してプログラマーになったら一切エラーがでないんだが~ @ CASPUR May 17, 2020

    View Slide

  2. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. 2
    自己紹介 @treastrain / Tanaka Ryoga
    https://treastrain.jp
    高専卒 → 大学学部4年 → 21新卒予定
    Swift (iOS, watchOS), Core NFC
    2019年9月22日 iOS・watchOS App
    「Japan NFC Reader」リリース

    View Slide

  3. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    Japan NFC Reader
    iOS 13.0 以降の iPhone で
    電子マネーの残高・利用履歴の読み取り
    iPhone で読み取った履歴を
    iCloud 経由で他のデバイスから確認できる
    https://japannfcreader.tret.jp/
    Twitter @JapanNFCReader
    3
    iOS App

    View Slide

  4. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    treastrain/TRETJapanNFCReader
    https://github.com/treastrain/TRETJapanNFCReader
    Japan NFC Reader のコア部分を OSS 化したライブラリ MIT Licence
    Initial commit: 2019年6月19日 265 Stars
    2020年5月16日時点
    (複数の企業の社内 Wiki? or Slack? からのアクセスログも…)
    4
    OSS Library

    View Slide

  5. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    TRETJapanNFCReader の対応カード 2020年5月16日時点
    NFC-F (FeliCa®)
    ● 交通系IC(10カード + それと同仕様のもの)
    ● 地方交通系IC(りゅーと)
    ● 楽天Edy、nanaco、WAON
    ● OKICA
    ● 大学生協ICプリペイド
    ● 八達通 - Octopus
    5

    View Slide

  6. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    TRETJapanNFCReader の対応カード
    ● ICカード運転免許証
    ○ 運転免許証の券面+本籍を読み取れる
    (氏名、住所、生年月日、免許の年月日、写真…)
    ○ 読み取りには交付時に自分で設定した暗証番号が必要
    ○ 日常生活で読み取りを必要とする場面はほとんどない
    ○ 仕様は警察庁交通局から公開されている
    ○ ISO/IEC 14443 Type B (JIS X 6301) に準拠
    ⇒ NFC-B
    6

    View Slide

  7. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    本題
    7

    View Slide

  8. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved. 8

    View Slide

  9. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    マイナンバーカードの
    パスワードが分からない
    9

    View Slide

  10. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    個人番号カード(マイナンバーカード)
    ● 「パスワードは忘れてはいけない」……けど
    ● マイナンバーカードには4つのアプリが入っている ことになっている
    10

    View Slide

  11. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    マイナンバーカード 4つのアプリ
    ● 署名用電子証明書(公的個人認証 署名用)
    ● 利用者証明電子証明書(公的個人認証 利用者証明用)
    ● 券面事項入力補助用
    ● 個人番号カード用(住民基本台帳事務用)
    11

    View Slide

  12. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    ● 署名用電子証明書(公的個人認証 署名用)
    ○ 6〜16字、英大文字と数字を組み合わせる 5回試行可能
    ● 利用者証明電子証明書(公的個人認証 利用者証明用)
    ○ 4桁の数字 3回試行可能
    ● 券面事項入力補助用
    ○ 4桁の数字 3回試行可能
    ● 個人番号カード用(住民基本台帳事務用)
    ○ 4桁の数字 3回試行可能
    マイナンバーカード 4つのアプリ パスワード
    12
    同じでもOK

    View Slide

  13. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    ● 署名用電子証明書(公的個人認証 署名用)
    ○ 6〜16字、英大文字と数字を組み合わせる 5回試行可能
    ● 利用者証明電子証明書(公的個人認証 利用者証明用)
    ○ 4桁の数字 3回試行可能
    ● 券面事項入力補助用
    ○ 4桁の数字 3回試行可能
    ● 個人番号カード用(住民基本台帳事務用)
    ○ 4桁の数字 3回試行可能
    マイナンバーカード 4つのアプリ パスワード
    13
    同じでもOK

    今回
    求められて
    いるもの

    View Slide

  14. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    ● 署名用電子証明書(公的個人認証 署名用)
    ○ 6〜16字、英大文字と数字を組み合わせる 5回試行可能
    ● 利用者証明電子証明書(公的個人認証 利用者証明用)
    ○ 4桁の数字 3回試行可能
    ● 券面事項入力補助用
    ○ 4桁の数字 3回試行可能
    ● 個人番号カード用(住民基本台帳事務用)
    ○ 4桁の数字 3回試行可能
    マイナンバーカード 4つのアプリ パスワード
    14

    今回
    求められて
    いるもの

    同じでもOK

    View Slide

  15. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    試行回数をオーバーするとロックされる
    (役所に行ってロック解除しないといけない)
    15

    View Slide

  16. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    せめて残りの
    試行回数だけでも
    分かれば…
    16

    View Slide

  17. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    @GOROman さんのツイート
    17
    GOROman
    @GOROman
    マイナンバーカードは対応してなかったけど、非常に参考になりました。
    --
    日本の NFC、FeliCa カード向けリーダーライブラリ(iOS 13.0 以降)
    https://github.com/treastrain/TRETJapanNFCReader
    午前3:29・2020年5月9日・Twitter Web App

    View Slide

  18. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    ライブラリが紹介されている…
    ● マイナンバーカードはICカード運転免許証と同じ NFC-B
    ● NFC 通信のコマンドは同じ ISO/IEC 7816-4
    ● 私が持っていないので対応作業をしていなかった
    ● @GOROman さんがマイナンバーカードで遊んでいる…
    ● 楽しそう……
    ⇒ 祖母からマイナンバーカードを借りて、
    ライブラリだけでも対応しよう…!
    18

    View Slide

  19. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    TRETJapanNFCReader の
    マイナンバーカード対応
    19

    View Slide

  20. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    ISO/IEC 7816-4 データの構造
    ● MF - Master File - 主ファイル
    ○ ルートのようなイメージ
    ● DF - Dedicated File - 専用ファイル
    ○ ディレクトリのようなイメージ
    ● EF - Elementary File - 基礎ファイル
    ○ ファイルのようなイメージ
    20

    View Slide

  21. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    処理のイメージ
    21
    MF を指定 DF を指定 EF を指定 処理

    View Slide

  22. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    パスワード残り試行回数取得のイメージ
    22
    DF を指定 EF を指定 処理
    アプリの個数分(4回)繰り返す

    View Slide

  23. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    NFCISO7816Tag
    .sendCommand(apdu:completionHandler:)
    ● Core NFC - iOS 13.0 以降
    ● ISO 7816 タグにコマンドを送るときに使う
    ● apdu に Application Protocol Data Unit を指定
    ● 完了後、completionHandler が呼ばれる 非同期
    ○ 何度も繰り返すとなるとコールバック・ネスト地獄に陥る
    23

    View Slide

  24. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    コールバック・ネスト地獄
    ● DispatchSemaphore で
    同期処理に変えてしまうのがいい
    ● システムによるアラートが表示されているので、
    ユーザーはキャンセル以外の操作ができない
    24

    View Slide

  25. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    treastrain/TRETJapanNFCReader の場合
    毎度 NFCISO7816APDU を書かなくていいように
    各コマンドを作っておく
    25

    View Slide

  26. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    verify の pin には何も入れない
    verify(tag: detectedTag,
    pin: [], /// 何も入れない
    // ... )
    26
    ● VERIFY コマンドのデータ部
    (= APDUのデータ部)には
    空の [UInt8] を指定
    ● 残り試行回数が
    分かるようになる

    View Slide

  27. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    状態バイト(SW1-SW2)
    ● SW1
    ○ 0x90(正常終了)
    ○ 0x63(警告)
    ● 0x63 のときの SW2
    ○ 0xCX(X に残り回数)
    ● verify で pin を指定しないと SW1
    は 0x63 になる
    ● SW2 に残り回数の情報が
    含まれる
    ○ 0xC3 ⇒ 残り3回
    let remaining = Int(sw2 & 0x0F)
    27

    View Slide

  28. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    マイナンバーカード(一部の機能)に対応!
    28
    treastrain / Tanaka Ryoga
    @treastrain
    TRETJapanNFCReader のマイナンバーカード対応を行いました。
    今のところはマイナンバーの取得のみとなっていて、master には上がっていま
    すが内部処理の破壊的変更が行われる可能性は大きいです。
    https://github.com/treastrain/TRETJapanNFCReader
    午後6:13・2020年5月11日・TweetDeck

    View Slide

  29. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    @GOROman さんのツイート
    29
    GOROman
    @GOROman
    ストア版のアプリにこの機能が付いたら助かる人増えそうですね。
    午前3:29・2020年5月12日・Twitter for iPhone

    View Slide

  30. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    GO サインが出た
    30

    View Slide

  31. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    App の方にも実装
    ● ライブラリに対応する作業
    ● 注意事項や各パスワードの説明を書いた
    ● 5/13 1:00 完成 そのときのツイート
    ● 2:43 App Store Connect に提出
    ● 2:48 Waiting for Review
    ● 5:57 In Review
    ● 8:53 Pending Developer Release
    ● 10:12 Ver 1.0.5 Approved for the App Store
    31

    View Slide

  32. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    リリース!
    32
    Japan NFC Reader - iPhone で電子マネーの残高チェック
    @JapanNFCReader
    【Ver 1.0.5 アップデート】
    App Store にて Ver 1.0.5 のアップデートが配信開始されました。
    運転免許証の暗証番号1、マイナンバーカードのパスワードの残り試行回数を確
    認できるようになりました。
    詳しくは添付の画像およびこのツイートに続くスレッドをご確認ください。
    午後0:01・2020年5月13日・TweetDeck

    View Slide

  33. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    総括
    ● みんなもマイナンバーカードで遊ぼう
    ● 対応済みのICカード運転免許証のコードを流用できた
    ○ 公的書類に関するリリースは少し怖いが、
    検証済みのコードがあったから早めの対応ができた
    ○ キャッチアップ・アウトプットは大事
    ● Swift → Java/Kotlin に
    翻訳できる方、Android 版をお待ちしています
    33

    View Slide

  34. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    おまけ
    ● App・OSSライブラリ 使ってください ください
    https://japannfcreader.tret.jp/
    https://github.com/treastrain/TRETJapanNFCReader
    ● ライブラリの使い方(パスワード残り試行回数取得方法)について
    Qrunch で公開しています ください
    マイナンバーカードのパスワード残り試行回数を調べる | Qrunch(クランチ)
    34

    View Slide

  35. Copyright © 2020 treastrain / Tanaka Ryoga All rights reserved.
    謝辞
    ● JIS X 6320-4:2017(ISO/IEC 7816-4:2013)
    ○ 日本産業標準調査会:データベース にて閲覧
    ● treastrain/TRETJapanNFCReader の README
    ● Special Thanks
    ○ @GOROman さん - 機会の提供・モチベーション
    ○ @k_katsumi さん - SwiftPM に関する情報&プルリク
    ○ App のユーザーのみなさん、ライブラリの Stargazers
    35

    View Slide