日本の在留カードに保存されている情報を、対応するUSB NFCリーダーで読み取るWindowsアプリ、zairyu-card-readerをオープンソースとして公開しました。
比較的小さなアプリですが、私が仕事で大切にしているいくつかの要素が詰まっています。
実際の事務作業で起きている問題を解決すること、個人情報を守ること、複雑な技術をパソコンが得意ではない職員でも使える形にすること、そしてできないことや限界を正直に説明することです。
この記事では、なぜこのアプリを開発したのか、なぜクラウドを使わずローカル環境だけで動く設計にしたのか、公開までにどのようなことを考えたのかを紹介します。
学校事務で実際に起きた問題
私は日本語学校で外国人留学生のサポートや事務業務に関わっています。
そのため、在留カードの情報は単なるデータ形式ではありません。学生の在籍管理や在留期限の確認、各種手続きに関わる日常的な情報です。
学校では、在留資格、在留期間、カード番号、住所、資格外活動許可の有無などを確認する必要があります。
2026年6月14日以降に交付された新しい形式の在留カードでは、在留期間がカード表面に印字されなくなりました。
このアプリを開発していた時点では、出入国在留管理庁の公式読取アプリでも在留期間が表示されませんでした。公式アプリについては、2026年9月頃に更新が予定されていると案内されていました。
そのため、実務上すぐに困る状況が生まれました。
在留期間の情報はICチップ内に保存されていますが、学校職員が簡単に確認する方法がありません。在留期間は、オンラインで行う在留関係の手続きでも入力を求められる場合があります。
私は最初、カードの仕組みを調べ、必要な情報を安全に読み取れるのかを確認しようとしました。
その調査が少しずつ形になり、最終的に一つのアプリになりました。
クラウド型にしなかった理由
在留カードには、非常に重要な個人情報が含まれています。
このような情報を扱うツールを設計するとき、最初に考えるべきことは次のような問いではないと思います。
> どれだけ多くの情報を集められるか。
それよりも大切なのは、次の問いです。
> 必要最低限の機能は何か。不要な情報漏えいの経路をどう減らせるか。
そのため、zairyu-card-readerは意図的にローカル完結型として設計しました。
カードを読み取るとき、このアプリは次のことを行いません。
- カード情報を外部サーバーへ送信しない
- クラウドサービスへ接続しない
- ユーザーアカウントを作成しない
- テレメトリやアクセス解析を収集しない
- カード情報を保存するデータベースを持たない
- カード情報をディスクへ書き込まない
- 顔写真やカード全体の画像を表示・保存しない
- マイナンバーやJPKIの情報へアクセスしない
アプリは、NFCリーダーが接続されたWindowsパソコン上だけで動作します。
内部で使用するローカルサーバーは、同じパソコン内からのループバック接続だけを許可します。LAN上のIPアドレスや、外部公開用のネットワークアドレスには接続できないようにしています。
つまり、一台のパソコンの前にいる、権限を持つ利用者が、一枚のカードを確認するためのアプリです。
この制限は、機能不足ではありません。
プライバシーを守るために意図して設けた設計上の境界です。
必要最低限のツールとして設計する
アプリは、パソコンに接続された対応PC/SCリーダーを検出し、カードが置かれているかを確認します。
利用者は、在留カードの表面に印字されているカード番号を入力します。
その後、アプリがカードのICチップと通信し、職員が確認するための17項目を画面に表示します。
カードの世代によって、情報の保存方法は異なります。
文字データとして保存されている項目もあれば、氏名や住所のように、画像として保存されている項目もあります。
画像として保存されている場合は、パソコン内で動作するOCRモデルを使って文字を読み取ります。外部のOCRサービスへ画像をアップロードすることはありません。
また、アプリに同梱した証明書を使い、ICチップから読み取った情報と電子署名の関係をオフラインで検証します。
ただし、電子署名の検証にも限界があります。
署名検証が成功したからといって、そのカードが現在も有効であることや、後から失効していないことまで証明できるわけではありません。
このアプリの役割は、権限を持つ利用者が情報を確認するのを支援することです。
在留資格やカードの法的な有効性を、アプリが自動的に判断するものではありません。
OCRは必ず人が確認する
ローカルOCRは、このプロジェクトの中でも難しかった部分の一つです。
在留カードの氏名には、長いローマ字表記、複数の言語や文字体系、特殊な空白などが含まれる場合があります。
住所についても、複雑な地名、漢字、改行、文字配置があり、OCRが正しく区切れないことがあります。
テストでは、次のような問題を確認しました。
- 氏名の誤った位置に空白が入る
- 長い氏名の一部が欠ける
- 一部の文字が読み取れない、または誤認識される
- 住所の区切り方を誤る
- 複雑な地名の漢字を誤認識する
- 最後の住所行が欠ける、または誤って認識される
そのため、OCRによって表示された項目は、必ず手元の在留カードと見比べる必要があります。
アプリは、OCRが完全であるかのようには見せません。
読み取れなかった場合は、推測した文字列を表示するのではなく、「読み取れませんでした」と表示します。
不確実な結果は、不確実なまま利用者に伝える。
これは、このアプリ全体で大切にした設計方針です。
個人情報を公開せずにテストする
自動テストでは、すべて架空の情報を使用しています。
本物の氏名、住所、カード番号、顔写真、ICチップのダンプ、証明書、署名データを、公開リポジトリやテストデータに含めるべきではありません。
自動テストとは別に、実際のカードを使用した動作確認も行いました。
新しい世代の在留カード60枚以上、古い世代のカード約10枚を使い、Sony FeliCa RC-S300リーダーと、Windows 10、Windows 11、Windows Server 2016の環境でテストしました。
テストした範囲では、ICチップ内の構造化データと電子署名の検証は正常に動作しました。
ただし、すべてのカード、リーダー、ドライバー、Windows環境、OCR環境で必ず動作するという意味ではありません。
カードの世代や状態、リーダーの機種、ドライバー、OS、OCR環境によって結果が変わる可能性があります。
そのため、公開ドキュメントでは、確認できたことだけでなく、まだ保証できないことについても説明しています。
個人用のツールを公開プロジェクトにする
一つの職場で内部的に使うツールと、責任を持って公開するオープンソースプロジェクトは同じではありません。
公開準備では、単にソースコードをGitHubへアップロードしただけではありません。
次のような内容を整備しました。
- 英語と日本語のドキュメント
- インストールガイド
- トラブルシューティング
- プライバシーとセキュリティに関する説明
- 脆弱性を非公開で報告するための手順
- リリースチェックリスト
- 依存関係とサードパーティーライセンスの一覧
- オフライン署名検証で使用する証明書の説明
- 再現可能な依存関係ファイル
- 自動テストとリリース前チェック
- PythonをインストールしていないWindowsでも使える配布パッケージ
また、プロジェクトのプライバシー方針に合わなくなった機能も削除しました。
たとえば、アプリには一般的なクリップボードへのコピー機能を設けていません。
このアプリの目的は、情報を画面で確認することです。個人情報を簡単にコピーし、管理されていない場所へ貼り付ける新しい経路を作ることではありません。
機能は少なくなりますが、その分、アプリの目的とプライバシー方針が明確になります。
オープンソースとして公開した理由
このプロジェクトを公開した理由はいくつかあります。
一つ目は、この問題が一つの学校だけの問題ではないからです。
日本語学校、教育機関、外国人を雇用する企業、支援団体、そして在留カードを持つ本人も、同じような問題に直面する可能性があります。
二つ目は、個人情報を扱うソフトウェアでは透明性が重要だからです。
ソースコードを公開することで、他の開発者が情報の扱い方を確認し、問題があれば報告できます。
三つ目は、アプリの限界も公開したかったからです。
オープンソースであることは、大きな効果や完璧な互換性を主張することではありません。
利用者は、何ができるのかだけでなく、何ができないのかも理解する必要があります。
このプロジェクトは、出入国在留管理庁または法務省が開発、承認、推奨、認定したものではありません。
カードを読み取る場合は、カード所持者の同意を得るか、業務上または法令上、確認する権限がある場合に限る必要があります。
このプロジェクトから学んだこと
このプロジェクトで最も興味深かったのは、NFC通信だけではありません。
次のような異なる要素を、一つの小さなアプリの中で組み合わせることでした。
- 実際の学校事務の流れを理解する
- 在留カードの技術的な構造を調査する
- 物理的なカードリーダーと通信する
- 電子署名を検証する
- OCRをローカル環境で実行する
- Pythonアプリを一般職員向けのWindowsアプリとして配布する
- 重要な個人情報を必要以上に扱わない
- 利用者向けと開発者向けのドキュメントを作成する
- あえて実装しない機能を判断する
学校向けのシステムを作る中で何度も感じてきたことを、このプロジェクトでも再確認しました。
便利なアプリは、すべてを自動化する必要はありません。
人が必要な情報を確認でき、技術的な限界と個人情報の境界がわかりやすい、小さく理解しやすいツールの方が適している場合もあります。
プロジェクトを見る
ソースコード、ドキュメント、インストール方法、Windows版はGitHubで公開しています。
不具合や互換性に関する報告は歓迎します。
ただし、GitHubの公開Issueには必ず架空の情報を使用し、本物の在留カード情報は絶対に投稿しないでください。