マイナンバー読み取る、AndroidAppコード理解
ETHGlobalTokyo 2023 にてマイナンバーからAccountAbstractionするデモがあり
とてもおもしろかったので、そこで使われている技術要素を理解していきます。
この記事では、Mynumberから公開鍵を読み取る部分の理解を深めます。
まず、下記の公開されているでもアプリでAndoroidAppからMynumberの情報を読み取ることができます。
RSA pubkey 読み込み部分
MynumberからRSA pubkey をよみとるのは下記のコード
下記のあたりです。
class JpkiAP(private val reader: Reader) {
fun lookupAuthPin(): Int {
reader.selectEF("0018".hexToByteArray()) // JPKI認証用PIN
return reader.lookupPin()
}
fun verifyAuthPin(pin: String): Boolean {
reader.selectEF("0018".hexToByteArray())
return reader.verify(pin)
}
....
fun readAuthCertificate(): X509Certificate {
return readCertificate("000A".hexToByteArray())
}
...
fun authSignature(nonce: ByteArray): ByteArray {
reader.selectEF("0017".hexToByteArray()) // JPKI認証用秘密鍵
return reader.signature(nonce)
}
}
この"0018"とか"000A"とか、気になりますよね。
これはそもそもマイナンバーカードにどんな情報が入っているのかの理解が必要です。
下記でとても丁寧に解説してくれています。
直感的に理解するのが難しいですが2種類の証明書がはいっていて、上記の作者のかたの説明を引用すると下記のように使い分けるようです。(目的は同じだけど、形式が違うっていう理解です)
公的個人認証APには従来の住基カードに含まれていた署名用証明書に加え、新たに認証用証明書が格納されています。
署名用証明書は銀行口座の開設など、これまで免許証で本人確認していたビジネスシーンで名前や住所を証明する為に利用できます。
一方、認証用証明書はWebサイトなどにログインする用途で利用する事が想定されていますが、今回の様にSSHやPAM、PGP、Windowsログオン、無線LANの認証(WPA-EAP-TLS)で利用することもできるでしょう。
今回Walletにつかうには認証用証明書 EF000Aを読めばよいということですね!
OpenSC
上記解説資料を作ってくれている人が、OpenSC(Open source smart card tools and middleware)という
世界で進んでいる各国電子ID用のスマートカードミドルウェアにPullReqを送って、日本のマイナンバーの普及を応援しているというのも知りました。 素晴らしい活動ですね。
下記にもマジックナンバーしっかり定義されていました
#define JPKI_AUTH_KEY "0017"
#define JPKI_AUTH_PIN "0018"
#define JPKI_SIGN_KEY "001A"
#define JPKI_SIGN_PIN "001B
今後もAccountAbstractionと各国政府や大きな団体のお墨付きのスマートカード+それらと連携したスマホアプリ は 多様な使われ方が想定されます。 世界のなかでのデジタル民主主義 推進のながれと、ビジネスの流れどちらの面からも基本となるところなので勉強できてよかったです。
Discussion