見出し画像

【中瀬のDID/VC探訪】SD-JWTによる選択的開示

こんにちは!Recept代表の中瀬です。

本日はproovyでも用いられる、VC(Verifiable Credentials)の形式の一つであるSD-JWTについてアウトプットしてみようと思います。


VCとは何ぞや

noteを読んでくれる方が私の友人や出会った人が多いこともあるので一応VCがどのようなもので、何のためのものなのかを整理しておきます。

VCは「検証可能な資格情報」と訳されます。

VCは「第3者がそのデータの真証性」を検証できるように設計されたデータの規格となります。

これが何が良いか、というところですが、VCを利用すると例えば私が東京大学出身の証明書を見せたときに、その証明書が改ざんされていないかを検証することができるのです。

Web3やブロックチェーン、Web3ウォレットの普及によってインターネット情報の信頼性や透明性に関する技術や規格に再度注目が集まっています。


SD-JWTとは

SD-JWTとはそのVCの規格のうちの1つです。

ややこしいですねすみません。

VCがどのようなデータのフォーマットにするかという設計は各標準団体が議論をし、発表しています。

それはW3Cとかになります。
その定められている規格のうち、eIDAS2.0などのプロジェクトで対応必須とされているVCのフォーマットがSD-JWTとなります。

つまり、黎明期のVCの議論において、有力候補がSD-JWTとなります。


SD-JWTについて詳しく

SD-JWTとは対象となるVCのデータ(JSON)をbase64URLエンコードしたものになります。

具体的には、署名方式などを記すヘッダー部分、VCの資格情報となるようなデータを入れるペイロード部分、そしてデータの署名と3つの部分をピリオド区切りで連結した文字列になっています。

例)

eyJraWQiOiIxZTlnZGs3IiwiYWxnIjoiUlMyNTYifQ.ewogImlzcyI6ICJodHRwOi8vc2VydmVyLmV4YW1wbGUuY29tIiwKICJzdWIiOiAiMjQ4Mjg5NzYxMDAxIiwKICJhdWQiOiAiczZCaGRSa3F0MyIsCiAibm9uY2UiOiAibi0wUzZfV3pBMk1qIiwKICJleHAiOiAxMzExMjgxOTcwLAogImlhdCI6IDEzMTEyODA5NzAsCiAibmFtZSI6ICJKYW5lIERvZSIsCiAiZ2l2ZW5fbmFtZSI6ICJKYW5lIiwKICJmYW1pbHlfbmFtZSI6ICJEb2UiLAogImdlbmRlciI6ICJmZW1hbGUiLAogImJpcnRoZGF0ZSI6ICIwMDAwLTEwLTMxIiwKICJlbWFpbCI6ICJqYW5lZG9lQGV4YW1wbGUuY29tIiwKICJwaWN0dXJlIjogImh0dHA6Ly9leGFtcGxlLmNvbS9qYW5lZG9lL21lLmpwZyIKfQ.rHQjEmBqn9Jre0OLykYNnspA10Qql2rvx4FsD00jwlB0Sym4NzpgvPKsDjn_wMkHxcp6CilPcoKrWHcipR2iAjzLvDNAReF97zoJqq880ZD1bwY82JDauCXELVR9O6_B0w3K-E7yM2macAAgNCUwtik6SjoSUZRcf-O5lygIyLENx882p6MtmwaL1hd6qn5RZOQ0TLrOYu0532g9Exxcm-ChymrB4xLykpDj3lUivJt63eEGGN6DH5K6o33TcxkIjNrCD4XB1CKKumZvCedgHHF3IAK4dVEDSUoGlH9z4pP_eWYNXvqQOjGs-rDaQzUHl6cQQWNiDpWOl_lxXjQEvQ

参考
https://idmlab.eidentity.jp/2024/01/verifiable-credentialssd-jwt.html


選択的開示に対応したい

SD-JWTでは「この項目は見せたいけど、この項目は見せたくない」というような選択的開示に対応しています。

これの何がすごいかというと、

基本的にそのデータの真証性(本当に改ざんされていないデータか?)は、データを本人しか持ちえない秘密鍵による署名を行い、公開鍵によって第3者が検証することで証明することができます。

しかし、これをすると選択的開示が難しくなってきます。

なぜならば、与えられたVCには住所の項目が入っているのに、第3者に提出するときは住所の項目を抜いてしまうことになるので、その時点でデータが改ざんされることになるからです。


SD-JWTの選択的開示の仕組み

SD-JWTでは与えられた項目に対して、ソルトという任意の文字列を与えて、ソルト, キー名, 値の1連のセットを作ります。

このセットをbase64urlでエンコードし(このエンコードしたものがディスクロージャーと呼ばれる)、ハッシュ化します。

この時にハッシュ関数から得られるダイジェストをVCの中に、各項目の代わりに入れます。

この時のプロパティ名は_sdとなり、値は配列です。

保持者が検証者に渡すVCはこの、隠したい要素が_sdとなっているものを渡します。

ユーザーは与えたくない情報があれば、そのダイジェストを渡さなければ第3者は検証ができないので項目が見れないという仕組みになっています。

以上の検証プロセスにおいてどのようなデータが誰から誰に渡されるかを図を用いてまとめると以下のようになります。


まとめ

選択的開示をできるだけシンプルに実現している一方で、色々と処理はめんどくさいなという感想をもっています。

画面上どのようなUIにするかの設計など、実際のUXに落とし込むうえでの設計も色々ややこしくなりそうだなと思っています。

https://medium.com/mattr-global/jwt-vs-linked-data-proofs-comparing-vc-assertion-formats-a2a4e6671d57


いいなと思ったら応援しよう!