基本4情報とマイナンバーの読み出し
このページでは、PocketSign Verify SDK を使用してマイナンバーカードに搭載された券面事項入力補助 AP から、 基本4情報(氏名、住所、生年月日、性別)とマイナンバーを読み出します。
あらかじめ券面事項の読み出しに対応した SDK の準備を完了しておいてください。
シーケンス
実装例
ここでは、カードの内部認証に用いる Nonce が 0xCAFEBABE
の場合の実装例を示します。
この資料では説明の都合上省略していますが、Nonce は原則としてバックエンド側で生成する必要があります。 クライアントサイドで Nonce を生成する実装は、セキュリティ上の問題があるためご注意ください。
また、一度使用した Nonce は再利用することはできず、基本4情報の要求時には毎回新しい Nonce を生成する必要があります。
- iOS
- Android
- Web(PaSoRi)
func run(pin: String) async throws -> String {
// 券面事項入力補助APへの接続準備を行います。
let session = ReaderSession(dispatchQueue: DispatchQueue.main)
// 券面事項入力補助APを初期化します。
let ap = InputSupportAP(session: session)
// 内部認証のためのNonceを設定します。
let nonce = Data([0xCA, 0xFE, 0xBA, 0xBE])
// 券面事項入力補助APに対して基本4情報とマイナンバーの読み出しを行います。
let result = try await ap.readAllDataWithPassword(
password: pin, nonce: nonce, hashAlgorithm: .sha256)
session.close()
return "署名検証用公開鍵: \(result.verificationPublicKey?.base64EncodedString() ?? "")\n"
+ "内部認証用公開鍵: \(result.authenticationPublicKey?.base64EncodedString() ?? "")\n"
+ "内部認証の署名値: \(result.authenticationSignature?.base64EncodedString() ?? "")\n"
+ "Nonceのハッシュ値: \(result.digest?.base64EncodedString() ?? "")\n"
+ "基本4情報の署名値: \(result.contentSignature?.base64EncodedString() ?? "")\n"
+ "基本4情報: \(result.personalInfo?.base64EncodedString() ?? "")\n"
+ "マイナンバー: \(result.myNumber?.base64EncodedString() ?? "")\n"
}
suspend fun run(pin: String): String {
// 券面事項入力補助APへの接続準備を行います。
val session = ReaderSession(this, this)
// 券面事項入力補助APを初期化します。
val ap = InputSupportAP(session)
// 内部認証のためのNonceを設定します
val nonce = byteArrayOf(0xCA.toByte(), 0xFE.toByte(), 0xBA.toByte(), 0xBE.toByte())
// 券面事項入力補助APに対して基本4情報とマイナンバーの読み出しを行います。
val result = ap.readAllDataWithPassword(pin, nonce, HashAlgorithm.SHA256)
session.close()
return "署名検証用公開鍵: ${Base64.encodeToString(result.verificationPublicKey, Base64.NO_WRAP)}\n" +
"内部認証用公開鍵: ${Base64.encodeToString(result.authenticationPublicKey, Base64.NO_WRAP)}\n" +
"内部認証の署名値: ${Base64.encodeToString(result.authenticationSignature, Base64.NO_WRAP)}\n" +
"Nonceのハッシュ値: ${Base64.encodeToString(result.digest, Base64.NO_WRAP)}\n" +
"基本4情報の署名値: ${Base64.encodeToString(result.contentSignature, Base64.NO_WRAP)}\n" +
"基本4情報: ${Base64.encodeToString(result.personalInfo, Base64.NO_WRAP)}\n" +
"マイナンバー: ${Base64.encodeToString(result.myNumber, Base64.NO_WRAP)}\n"
}
const run = async (pin: string) => {
// 券面事項入力補助APへの接続準備を行います。
const session = new ReaderSession(nfcPortLib);
// 券面事項入力補助APを初期化します。
const ap = new InputSupportAP(session);
// 内部認証のためのNonceを設定します
const nonce = Uint8Array.from([0xca, 0xfe, 0xba, 0xbe]);
// 券面事項入力補助APに対して基本4情報の読み出しを行います。
const result = await ap.readAllDataWithPassword(pin, nonce, HashAlgorithm.SHA256);
await session.close();
return (
`署名検証用公開鍵: ${btoa(String.fromCharCode(...result.verificationPublicKey))}\n` +
`内部認証用公開鍵: ${btoa(String.fromCharCode(...result.authenticationPublicKey))}\n` +
`内部認証の署名値: ${btoa(String.fromCharCode(...result.authenticationSignature))}\n` +
`Nonceのハッシュ値: ${btoa(String.fromCharCode(...result.digest))}\n` +
`基本4情報の署名値: ${btoa(String.fromCharCode(...result.contentSignature))}\n` +
`基本4情報: ${btoa(String.fromCharCode(...result.personalInfo!))}\n` +
`マイナンバー: ${btoa(String.fromCharCode(...result.myNumber!))}\n`
);
};
モック環境では、FeliCa カード(交通系 IC カード 、Edy、WAON など)や、ISO/IEC 14443-4 Type-A カード(クレジットカードなど)をタッチすると、マイナンバーカードの挙動がシミュレートされます。 詳しくはSDK リファレンスをご覧ください。
マイナンバー法(行政手続における特定の個人を識別するための番号の利用等に関する法律)に規定があるものを除き、 マイナンバーを含む個人情報を収集したり、保管したりすることは禁止されています。
マイナンバーが不要な場面では、返却値にマイナンバーを含まない関数 readPersonalInfoWithPassword
をご使用ください。
実行結果
基本4情報・マイナンバーの読み出しに成功すると、以下のように Base64 エンコードされた 署名検証用公開鍵、内部認証用公開鍵、内部認証の署名値などが表示されます 。 基本4情報・マイナンバーのパース・検証時には、これらのデータを PocketSign Verify API に送信します。
次のステップ
券面事項入力補助 AP から取得したデータのパース・検証を行い、基本4情報(氏名、住所、生年月日、性別)とマイナンバーを取得しましょう。
その他、SDK の詳しい使い方やエラーの詳細等については、SDK リファレンスをご覧ください。