メインコンテンツまでスキップ

基本4情報とマイナンバーの検証

このページでは、Verify SDK を使用して取得した公開鍵・署名値・基本4情報・マイナンバーのデータを用いて、 基本4情報(氏名、住所、生年月日、性別)とマイナンバーのパース・検証を行う方法を説明します。

あらかじめAPI のセットアップを完了しておいてください。

シーケンス

アプリとバックエンドの連携

Verify SDK を用いて取得した公開鍵・署名値・基本4情報・マイナンバーなどの情報は、 何らかの方法でバックエンドサーバーに共有してデータのパース・検証を行ってください。

以下の実装例では、アプリとバックエンドの間での連携については省略しています。

要確認

Verify API の利用は、必ず バックエンドサーバーを経由して行ってください。 API トークンをアプリケーションに含めて配布することは Verify API の不正利用につながるため、絶対に行わないでください

実装例

クライアントライブラリのセットアップ方法は、クライアントライブラリをご参照ください。

package main

import (
"context"
"crypto/sha256"
"encoding/base64"
"fmt"
"log"
"net/http"

"buf.build/gen/go/pocketsign/apis/connectrpc/go/pocketsign/cardinfo/v1/cardinfov1connect"
cardinfov1 "buf.build/gen/go/pocketsign/apis/protocolbuffers/go/pocketsign/cardinfo/v1"
verifyv2 "buf.build/gen/go/pocketsign/apis/protocolbuffers/go/pocketsign/verify/v2"
"connectrpc.com/connect"
)

var (
// APIエンドポイントを指定します。この値は環境によって異なります。
baseUrl = "https://verify.mock.p8n.app"

// Verify APIのトークンです。ご自身のトークンに置き換えてください。
token = "<YOUR_API_TOKEN>"

// チャレンジとして送信したNonceです。
nonce = []byte{0xCA, 0xFE, 0xBA, 0xBE}

// Verify SDKによって券面事項入力補助APから読み出されたデータです。これらの値は、アプリ上で作成したものを何らかの方法で予め受け取っておいてください。
rawVerificationPublicKey = "fyGCAjNfToIBKTEwMDAwMDAIBTAwMQAAAAAyODgyMzUxCAUwMDEAAAAAkAMBAAGRggEAnD8jF2D0INc6BZk9ph1Ntg+dsV6bv3lc5qnemSrRI5c2o/igyPoBNiGgMQCBkTcsh09R6D7XV4I+j3JMI7SCRF/HZhKrxjKOsb1f3hpYalypBLv+3jgZLUKK7GZPB6BZvFpORCtMJ2r6CpnjMzcO7KQhYCejX/4VXX5X/fSd1g/lcmwtzELC7tk8vvOriOH4U/NEJsxsTxg3Ld8fCLqkVCs833SUxT9ezzE59klIoYlWlTW+8VCfHrgmDs5Wp8KEM1pMJot8oP3McenuEf2MW3tjtdjvG4SeVvGBpUKbJ2ZCTDVYwYbgwUOqFbU+uccL+X4E9LDrO+9t8NcVl8H5dV83ggEAfj36VSDgOS/qdhfXQplhOh4+VDGJIspMeCC179MlZ41T+C2iFOxmMf9SCOmK7faFdPsuL/Cc/FsoJZH71beBMGxkRnO8H244stimWndNBORFIbaFQmT0DbiacyElCwtL20Ole4zgYsDUkZvIWVnECIn9dpiwVZ9xDpI18OgMgqhnxaMbl+rL/EZZcjHiV9A8cUSf80whaEzHzfgkhqLklaU+9oCnT9gJop8jZfxxmwfmtMCK24zRuNQdX2LR+/r4msL1Y3pE2WDXrzCnKmiLpkRe7rkCPT/lj+JJ2/c6Jo3jHGNud8+muafiU7/0zv7WfIpWJB7kL6lpSXLIJ2WGmQ=="
rawAuthenticationPublicKey = "/1CCAhPfUYIBCZADAQABkYIBAJxbEExsLZfSdDTQ3O+cKeS94KfYL5MMeKfX7mO30CPYix2kMHvF0Mu33BaNmWP/ouPzPz0Z5z40A+/sg/D2BCTtnVo2J7ahUxLPbg9nGnVh5SH1z1Fk2nlNc1ZglS8jFQiPKUdNNhbEwnal1xg72cYxQ6KdaNagzw4ezkiB1ZWLiK5lRf+dxfv9CnZo8q8TbsuoUFnlSyFG5AopUTeifMr+S+2Z8LBHlMiDYnfLuALQ+xZv3hxdoC4OlYegHG2ACZEUR7/iR8fCaVWgLh4eFOgZFtXulL+RYnxGNH4/Lo76Mn9joF/pCAs/8LgQs2uVjcyHv561vvPZS8FRtPZYRnvfUoIBAJShMb2eyHSk8+3fRFcNs9AcH0O+j91QpiHJMmZQTgT0cxK2/pgTZDv6XZ+8JJ1GcmtP42dj5N3ZjdG8x6I9Ie6sg4j8o0wWOeyKfl1lpyRnI+bD7YQU2SBFwvrNNNW1idvJN6faz8r8sj+Cfdxtb+p+RGSs8Z/LT0Yk9u0mZfSApRrHG2qXSy3qYWz/vDvoVT5Q6i6Vr3PXe787fk11hk8HFf+X+B2kRkK5BSEq9AyPQEPlJxAoqqnCDBFIUsuUbPc5yV5BpYLTX3NCXEd0y4c3LbTA6hSYSN06LId/uebKgsSeAuJLMH8E8zvz2tBGV5BBK7S4TDHUWsWu48csh4Y="
rawContentSignature = "/zCCAUvfMSCNgEX4wk98two2Wz2DvHFfI2HflRxnBqhMLdDE3YArx98yID3TaWmw3tOn+Loco2D1a7qTZSEgvHwfzcXqHQfAM4Hm3zOCAQAhVRB6P1VO19pXvl76z8RPqan3KT+9y4ZZ+eQ+GTycxtl7b2E0zbcVLytho9PsIVGfn/hKWo2KGy6InSmXs6eIwtOUsJF+J207YazL7FV/7zXicrmZZ28yhR0Jv0Wquox4G8WSQGkvckLsB48XV3XP2bab9IMTFprYdmnCwMbsRSQzPypGClf4i7ET/Jg8geSAbiq7WZbcgeIvaSbUaXAoQk9K0FmadnhQfBW9g+JXmZRjkjmqRkArRm0VirdqMczfv3CmnYc2w+UDbH/24dqmmXnb9Ep26vp4FYt1RcgrDzfDzjUuftxTkxZ9pYYissk/37BS7yl7fbj9nEFlVy91"
rawAuthenticationSignaure = "UKbj+R55oaZRQtQViyUNcjWro+I+X9Fw/R02wC8SuXoBwVGyIt8EfWO+Aou3NiTNcJcETpoDjbdbBOjIL9371T3CvgkAfiVk4HyflGtt96f0I2v6/KWWlKnkUSIiGbySRh5G+UGCMsAdiCehsgMWISnat2MU5lKscyzpgKzVOB9w5rASh6JOq1hM9tamdEWVgJjGwHGPzs/1Fqb7trKtD1g6pwufKRrIzMwgAUYJ5Wxr5uLKmzh/1r6DJlFWLvjO3q2ooebS2VV65gs+xyemScceWVHynSdIQmdICOSjlbWngSrQVR8o8rSbsCwP8G0XDBzoaXbhr2Lpx1CtdvCsPw=="
rawPersonalInfo = "/yCCAGXfIQgAEAAiAFsAZt8iD+WuruW0juOAgOWEquiho98jNuiMqOWfjuecjOihjOaWueW4gumdkuayvO+8ke+8ku+8lu+8kOeVqu+8me+8me+8me+8meWPt98kCDE5ODUwNTI23yUBMg=="
rawMyNumber = "/xAMNjY2NjY2NTYzOTEx//8="
)

func run() error {
// Base64をデコードしてバイト列にします。
verificationPublickey, err := base64.StdEncoding.DecodeString(rawVerificationPublicKey)
if err != nil {
return err
}
authenticationPublickey, err := base64.StdEncoding.DecodeString(rawAuthenticationPublicKey)
if err != nil {
return err
}
contentSignature, err := base64.StdEncoding.DecodeString(rawContentSignature)
if err != nil {
return err
}
authenticationSignature, err := base64.StdEncoding.DecodeString(rawAuthenticationSignaure)
if err != nil {
return err
}
personalInfo, err := base64.StdEncoding.DecodeString(rawPersonalInfo)
if err != nil {
return err
}
myNumber, err := base64.StdEncoding.DecodeString(rawMyNumber)
if err != nil {
return err
}

// Nonceのハッシュ値を計算します。
digest := sha256.Sum256(nonce)

// 基本4情報パースリクエストを作成します。
request := connect.NewRequest(&cardinfov1.ParseContentRequest{
// 券面事項入力補助APから読み出されたデータを設定します。
VerificationPublickey: verificationPublickey,
AuthenticationPublickey: authenticationPublickey,
ContentSignature: contentSignature,
AuthenticationSignature: authenticationSignature,
PersonalInfo: personalInfo,
MyNumber: myNumber,
// 作成したハッシュ値を送信します。
// もし、内部認証で署名されている値が異なっていた場合はハッシュ値が一致しないため、検証に失敗します。
Digest: digest[:],
HashAlgorithm: verifyv2.Verification_HASH_ALGORITHM_SHA256,
})

// リクエストにAPIトークンを設定します。
request.Header().Set("Authorization", "Bearer "+token)

// APIクライアントを作成します。
client := cardinfov1connect.NewInputSupportServiceClient(http.DefaultClient, baseUrl)

// 基本4情報のパースリクエストを送信します。
response, err := client.ParseContent(context.Background(), request)
if err != nil {
return err
}

// 結果を表示します。
fmt.Println("基本4情報(氏名、住所、生年月日、性別)")
fmt.Printf("CommonName: %s\n", response.Msg.GetPersonalInfo().GetCommonName())
fmt.Printf("Address: %s\n", response.Msg.GetPersonalInfo().GetAddress())
fmt.Printf("DateOfBirth: %s\n", response.Msg.GetPersonalInfo().GetDateOfBirth())
fmt.Printf("Gender: %s\n", response.Msg.GetPersonalInfo().GetGender())
fmt.Println("マイナンバー")
fmt.Printf("MyNumber: %s\n", response.Msg.GetMyNumber().GetMyNumber())
return nil
}

func main() {
if err := run(); err != nil {
log.Fatalln(err)
}
}
要確認

マイナンバー法(行政手続における特定の個人を識別するための番号の利用等に関する法律)に規定があるものを除き、 マイナンバーを含む個人情報を収集したり、保管したりすることは禁止されています。

マイナンバーが不要な場面では、ParseContentRequest のプロパティ MyNumber に値を設定せずに API リクエストを送信してください。

パース・検証に成功すると、以下のように結果が表示されます。

取得した基本4情報(氏名、住所、生年月日、性別)は、オンライン等における氏名・住所情報の入力などに利用できます。 出力された基本4情報のフォーマットに関しては本番環境をご参照ください。

基本4情報(氏名、住所、生年月日、性別)
CommonName: 宮崎 優衣
Address: 茨城県行方市青沼1260番9999号
DateOfBirth: 19850526
Gender: 2
マイナンバー
MyNumber: 666666563911

次のステップ

その他、API の詳しい使い方やエラーの詳細等については、API リファレンスをご覧ください。