認証と署名は何が違う？ ～マイナンバーカードを例に～

### 最初に
　IDの認証と電子署名は良く混同されることも多く、特に[マイナンバーカード](https://www.soumu.go.jp/kojinbango_card/kojinninshou-01.html)には、認証用の利用者証明用電子証明書と、署名用の署名用電子証明書の、2つの電子証明書が同じように入っているのでそれぞれの**違い**であったり**使い方**であったりと言う辺りは特に混乱しているように見えます。もちろん認証では認証要素（Authenticator）としてICカード以外にも色々使えますし、署名においてもICカード以外に各種証明書ストアであったりUSBトークンであったりと色々な提供形式があります。しかしながら**マイナンバーカードでは技術的には全く同じ形式で利用者証明用電子証明書＋秘密鍵と署名用電子証明書＋秘密鍵が格納されている**ので「同じじゃ無いの？**何が違うの？**」と言う方もいらっしゃるのではないでしょうか。結論を先に申し上げると「**目的と手順が異なる**」と言うことになります。では詳しく見て行きましょう。

### そもそも認証と署名の目的は何が違う？
　認証と署名の定義についてはJNSA電子署名WGで公開した[**電子署名保証レベル要約版**](https://www.jnsa.org/result/e-signature/2022/index.html)（是非一読を！）にてまとめましたので、ここではシンプルに説明してみましょう。目的としては以下となります。なお以下は基本的なものであり時には別の目的で認証や署名を使う場合もあります。

**○ 認証の目的とは？**
　認証は現在操作をしている**端末の前**にいるエンドエンティティ（人）が事前に身元確認済みの当人であるかどうかを**リアルタイム**に確認することを目的とします。

**○ 署名の目的とは？**
　署名は**提示されたデータ**（情報）が事前に身元確認済みの当人により認められたものか確認することを**過去に遡って**検証することを目的とします。なお署名では要件として**データの非改ざん性**も必要となります。

　認証は直接エンドエンティティを確認しているのに対して署名は提示されたデータ経由でエンドエンティティを確認している点が違うのと、署名では要件として非改ざん性も要求される点は異なりますが、どちらも「**事前に身元確認済みの当人であることを確認**」している点は同じと言えます。ここが両者が混同されるポイントでは無いかと考えています。これを図にすると認証はリアルタイムなので1プロセスで完了するが署名は署名と検証の2プロセスになりその間に時間差が通常あることになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867320/5e86ab77-ee89-23f0-e985-6d594b91f43c.png)

### デジタル署名とは？
　デジタル署名（Digital Signature）は暗号を使った署名技術の名称です。一方で電子署名（Electronic Signature）は目的用途や法的な用語です。この両者は欧州のeIDAS等では厳密に区別されています。デジタル署名技術は認証目的でも署名目的でも使われます。もちろん認証も署名も様々な技術を使いますが、今回はデジタル署名だけに絞って解説することで認証と署名の違いを明確化してみます。
　デジタル署名は一般には、公開鍵暗号（RSAやECDSA等）の秘密鍵（署名鍵）を使って対象となるデータの署名値を生成します。生成された署名値は秘密鍵とペアになった公開鍵で確認することで非改ざんを証明できる仕組みになっています。秘密鍵は所有者が管理しておりコピー等がされていないことが厳密には求められます。マイナンバーカードのようなICカードにはコピーできないような仕組みで秘密鍵が格納されているので厳密な秘密鍵の管理が可能となります。コピーは出来ませんが貸し借りしたり盗難されたりと言うリスクはあります。

**○ 認証にデジタル署名を使う場合**
　認証をおこなうサービスは任意のデータ（一般には乱数を使ったチャレンジ＆レスポンスのデータ）を生成してそのデータをユーザーに提示してデジタル署名を要求します。ユーザーは秘密鍵で署名値を計算して返し、サービス側（検証者）は署名値とデータを証明書等から取得した公開鍵で検証することで秘密鍵の所有証明として当人であることを確認します。署名対象はサービスから提示された一時データでありデータ自体は重要ではありません。
　なお自分が生成したデータに対してデジタル署名することを許すとコピーしておいて利用する等の抜け道が出来てしまうので認証側でデータを用意する必要があります。

**○ 署名にデジタル署名を使う場合**
　署名対象となるデータ（申請データ等）に対してユーザーが内容確認をおこなった上で秘密鍵で署名値を計算して対象データと共に検証者に提供します。検証者は署名値を証明書等から取得した公開鍵で検証することで秘密鍵の所有証明として当人であることを確認しデータに対し当人が内容の確認済み（否認防止や証明）であることを確認します。署名対象はユーザーが内容確認したデータであり否認防止や証明の意味から確認するステップはとても重要です。

### マイナンバーカードの2つの電子証明書の使い方

　マイナンバーカードの機能には、(1)署名用電子証明書の表示と秘密鍵によるデジタル署名・(2)利用者証明用電子証明書の表示と秘密鍵によるデジタル署名・(3)券面事項入力補助機能・(4)住民基本台帳機能、の4つがありますが、(4)は通常使うものでは無いので主な機能は(1)～(3)の3つと言えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867320/93859e2a-a7a3-4bac-e134-c2904982982a.png)
　ここまでの解説である程度ご理解頂けたかと思いますがマイナンバーカードの2つの電子証明書の利用目的は以下となります。また時々見られる不適切な利用についても解説します。

**○ 利用者証明用電子証明書の利用目的**
　認証の為に利用します。つまり認証サーバー側から提供されたチャレンジデータにデジタル署名して返す為に利用します。これにより認証サーバー側はマイナンバーカードの所有を確認できます。

**○ 署名用電子証明書の利用目的**
　署名の為に利用します。つまりデータの内容に同意をした証としてデータにデジタル署名を付与して提供します。時間が経っても内容の保証が可能となっています。

なお署名用電子証明書には基本4情報（氏名・性別・生年月日・住所）が含まれますが、利用者証明用電子証明書には基本4情報は含まれません。ただ本来あるべき姿としては基本4情報は券面事項入力補助機能から取得することになります。基本4情報を署名用証明書から取得しようとすると不適切な利用方法となります。

>**※ 不適切な署名用電子証明書の利用**
　署名用電子証明書を認証の為に利用する。つまり認証サーバー側から提供されたチャレンジデータにデジタル署名して返す為に利用する。認証サーバーは署名用電子証明書から基本4情報を取得します。
　このように**何のデータにデジタル署名を付与しているのか分からないような目的の為に署名用電子証明書を利用するのは間違っている**と言えます。技術としてはこのような利用も可能であるのでマイナンバーカードを利用するサービスを検討する段階でしっかりと検討して不適切な利用目的に使わないようにする必要がありますのでご注意ください。

　まあ更に本来と言う意味であるべき姿は電子証明書に個人識別番号（例：マイナンバー）が記載されており、その個人識別番号を利用してサービスのAPIから基本4情報を取得するようなシステムだと思います。日本では個人情報保護の名目でマイナンバーの利用が制限されていますが本来はマイナンバーはデジタル社会において最もベースとなるべきIDでありこれがあるか無いかでサービスのレベルが変わるのではと考えているのですが…マイナンバーが悪用される恐れが出た場合には再発行するようなクレジットカードの番号と同じような運用があれば良いのでは無いかと個人的には考えていますが…どう思われますか？

### マイナンバーカードを使った電子申請の手順

　最後にマイナンバーカードを使った電子申請を、認証（利用者証明用電子証明書を使う）で行う場合と、署名（署名用電子証明書を使う）で行う場合、に分けて考えてみます。なおこれは一例であって実際には他にも色々な手順があります。ここでは申請内容は申請サービス側で入力するケースを考えています。

**○ 認証により電子申請する手順**
　まず申請開始時にデジタル署名を利用した認証を行い申請者の当人確認をした上で申請操作を行う手順です。申請セッションを維持してその間は当人であることを保証します。なおこの時に認証時の情報や申請ボタンクリック他の操作ログを証拠として残しておき改ざんされないようにしておくことで簡易な電子署名的な要件も満たすことが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867320/dd4745b1-5b82-9267-83fa-244d11b3a133.png)
**○ 署名により電子申請する手順**
　申請内容を入力する段階では当人確認はまだ行う必要が無い手順です。最初に申請内容を入力してその内容を署名対象として申請者に内容確認の為に提示します。申請者は内容に問題が無ければデジタル署名を行って申請を実行します。申請サービス側では受け取った署名値で署名対象が検証出来ることを確認することで申請意志を確認します。申請内容は申請サービスを利用せずに申請者自身で用意しても構いません。最終的に署名済みの申請データを申請サービスに送ることで電子申請を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/867320/73662813-c02e-53f1-4038-bc281505b674.png)

### まとめ
　マイナンバーカードには認証用と署名用の2つの電子証明書＋秘密鍵がほぼ同じ技術仕様で格納されています。しかしながら本記事で解説したように本来は異なる使い方や署名対象データを用意する必要があります。これにより利用者に見せるべき画面の内容も異なります。同じ技術仕様であるが為に誤用しているケースもあるようですので用法目的を意識してマイナンバーカードを正しく使いましょう！
　う～んカレンダーの他の人たちとの記事とは随分毛色が違う内容になってしまいました。ごめんなさいm(_ _)m ま…まあこういうのもアリと言うこでw