こんにちは!令和トラベルのiOSエンジニアの高橋です。
弊社では簡単に海外旅行を予約できるアプリ「NEWT(ニュート)」を提供しています。
海外旅行を予約する上で必ず必要になるのがフライト予約です。海外旅行のフライト予約には必ずパスポートの情報が必要で、アプリ上で入力してもらう必要があります。その中でより正確に読み取るための手段としてパスポートNFCを検討しました。この記事ではパスポートに埋め込まれたICチップがどのように通信されているか、NFCリーダーで読み取る際の通信技術についてお伝えできればと思います。
近年のICチップ導入について
みなさんが普段利用するものでICチップが埋め込まれているものはたくさんあります。交通系ICカード、電子マネーカード、運転免許証、マイナンバーカード….などなど。海外にはほとんどの決済をICチップ利用にするなど急速な電子化が進んでいます。
そして、本題であるパスポートには偽造・変造、成りすまし等の不正利用対策の強化のため2006年に旅券法の改正を行い、IC旅券(ePassport)の導入が行われることになりました。
また、ePassportにはNFC(Near Field Communication, 近距離無線通信)が用いられており、デバイスとICチップを近づけることで双方向通信を実現し、パスポートの情報を取得できるようになっています。
パスポートNFCの規格
パスポートNFCの規格については国際民間航空機関(ICAO, International Civil Aviation Organization)によって定められており、全世界で同じ形式のパスポートとなっています。
そしてePassportの導入を世界的に推進しています。
パスポートNFCのタイプにはType-Bで最もセキュリティ性能が高い規格を用いています。個人情報を扱うため当然ですが、前述の運転免許証やマイナンバーカードも同様です。
認証について
パスポートにおけるNFCの認証技術は以下のようになっています。
- SAC (Supplemental Access Control):SAC自体がアクセス制御なのではなくBACとPACEの両方に対応していることを表す言葉。
- BAC (Basic Access Control):パスポート内の情報(パスポート番号+生年月日+パスポート有効期限)をkeyとして認証するアクセス制御。
- PACE (Password Authenticated Connection Establishment):BACにおける弱点を克服したアクセス制御。非対称な暗号化を用いられている。
- EAC (Extended Access Control):パスポートに含まれる生体認証データの保護に用いられるアクセス制御。各国によって認可されたシステムでなければ認証できない。
これらの説明から一般的にパスポートにおけるNFCでアクセスできるのは「指紋、虹彩など生体認証以外の個人データ」ということになります。
つまりパスポートに明記されている情報のみが取得できます。
情報を読み取る以外にも、真正性検証や改ざん防止・検知のための認証としてPassive/Active Authenticationも用いられています。
ファイル構造
NFCはタグと呼ばれるバイト列をセッションでやりとりし、認証や情報取得を行います。
パスポートが持つ情報は基本的なファイルシステムと似ており、特定のフォルダ内のファイルがタグとして流れてきます。
上記の図はLDS(Logical Data Structure)が構成されている図です。
Master Fileをルートとしてその下にLDSが構築されています。パスポートの個人データについてはeMRTDと言われるLDSに論理ファイルとして保存されています。
eMRTDには図の通りファイルシステムに似た構造で論理ファイルが構成されます。
- COM:LDS、Unicodeのバージョン、タグリストなど共通データが含まれる
- SOD:認証のための署名値などが含まれる
- DG1~DG16:MRZの情報や顔写真、国によっては住所などパスポートが持つ情報が含まれる
具体的に読み取る手法
iOSにはAppleが標準で提供している
CoreNFC
が存在します。NFCは3種類(Type-A,B,F)があり、CoreNFCはそれらに対応して読み込むことができます。今回は基本的に必要な部分を抜粋して流れをご紹介します。
[1] Info.plistを編集する
以下は必須項目で最初に設定します。
- NFC利用のCapabilitiesの設定が必要
- NFC利用目的として
NFCReaderUsageDescription
の追加が必要
- NFCのうちType-A,BはISO7816でICカードの規格が定められており、アクセスにはApplicationID(AID)が必要
[2] NFCTagReaderSessionでpollingを開始
まずは
NFCReaderSession.readingAvailable
でNFCに対応した端末かどうかの確認が必要です。そして、パスポートはType-BでありiSO7816に準拠している
iso14443
を指定した上でNFCを読み取るためのpollingを開始します。[3] NFCTagReaderSessionDelegateを利用し、読み込んだタグを解析する
前述のpollingを開始したときに
NFCTagReaderSessionDelegate
の設定を行なっています。このdelegateを利用することで読み込み中のタグや失敗を検知することができます。
delegateの種類はいたってシンプルで上記の3つです。
③にあたる、タグが読み込まれた時にパスポートNFCに対するアクセス制御、情報読み込みが可能となります。
CoreNFCでパスポートを読み込むライブラリ
CoreNFCで読み込めるライブラリ NFCPassportReader がOSSで公開されており、PACE/BAC認証→タグ読み込み→パスポート情報へのモデル変換まで行ってくれます。
仕組みの理解から自前で実装するのが少し難解です。OSSの中を覗いてみると特に認証周りは自作するには大変だなという印象だったのでこちらを利用したり、参考にして実装するのが良いと思います。
最後に
ここまでご覧いただき、ありがとうございました!パスポートNFCについて調べてみて便利な反面、個人情報がゆえにやや難解な部分もあることがわかるかと思います。
ご紹介したのはパスポートだけですが、免許証やマイナンバーカードにもICチップは利用されているので身分証明などにぜひ利用してみてください。
また、弊社がNFCを検討した過程なども含めてiOSDC Japan 2023にて発表させていただくのでこちらもぜひよろしくお願いします 💪
- 9/2(土) day1 TrackB 13:55 ~
令和トラベルでは一緒に働く仲間を募集しています
ぜひこの記事を読んで会社やプロダクトについて興味を持ってくれた方はご連絡お待ちしています!お気軽にお問い合わせください!
フランクに話だけでも聞きたいという方は、カジュアル面談も実施できますので、お気軽にお声がけください。
さらに、9月はpotatotipsも主催させていただきます!ご興味のある方はぜひご参加いただき、いろいろと情報交換させていただけると嬉しいです。(またこれを機にconnpass にてメンバー登録もぜひ!)
それでは次回のブログもお楽しみに!