見出し画像

選択的開示を素人なりに理解したい

こんばんは。MORIDaisukeです。

VCやDIW界隈の注目キーワードである「選択的開示」、「アンリンカビリティ(リンク不可能性)」、「ゼロ知識証明」。
私の中では、わかっているようで絶対わかっていない技術用語ランキング、堂々の第一位です。

そろそろ少しは勉強しないと・・・という危機感がずっとありましたので、昨年7月に欧州電気通信標準化機構(ETSI)から出された以下のレポートを読みながら、素人なりに理解をしようと試みてみます。

おことわり

  • この記事は上記のETSIのレポートに基づく個人的な学習メモです。業務上知り得た秘密情報や非公開情報は含んでおりません。

  • 有用な参考情報はほかにも色々あると思うのですが、収集がつかなくなるので今回は上記のETSIレポートのみをインプットにします。

  • eIDASやEUDI Wallet特有の用語は、なるべく一般的な用語に置き換えてメモしています。

  • タイトルは願望です。理解したとは言っていません。

それではお付き合いください!

選択的開示(selective disclosure)とは

一言でいうと「ある属性証明の一部だけを提示する機能」です。
このレポートのIntroductionには「選択的開示にもレベルがあり、以下の3段階に分解して理解できる」といったようなことが書かれていました。

  • 1つの属性証明から、1つ以上の属性を選択的に開示する機能

  • 2つ以上の異なる属性証明から、それぞれ1つ以上の属性を選択的に開示する機能。この機能は「複合プレゼンテーション」と呼ばれることもある。

  • 属性そのものではなく、属性に関するステートメント(が真であること)を開示する機能。

なるほどー確かに。

リンク不可能性(unlinkability)とは

一言でいうと「2つ以上の属性証明プレゼンテーションが、同じアイデンティティの主体を示しているかどうかを、属性に基づく純粋な推測よりも無視できない確率で決定できないこと」です。
この定義では、「属性による名寄せができるかどうか」はリンク不可能性のスコープ外になりますね。すっきり理解できます。

また、リンク不可能性にも以下のような想定ケースのクライテリアがあると書かれています。

  • 単一のVerifierに対するリンク不可能性

  • 複数のVerifierの共謀に対するリンク不可能性

  • IssuerとVerifierの共謀に対するリンク不可能性

  • Issuer、Verifier、その他の当事者の共謀に対するリンク不可能性

上記の前半2つを「検証者リンク不可能(verifier unlinkable)」、後半2つを「完全リンク不可能( fully unlinkable)」と呼ぶとのことです。

選択的開示のユースケース例

Introductionでは、以下のようなユースケースの例が示されています。
(図はESTIのレポートより)

  • Issuerから、氏名、生年月日、住所、学生情報などが含まれた属性証明書の発行を受け、ウォレットに格納する。

  • ユーザーは選択的開示を用いて、例えばバーでの年齢確認では、「自身が21歳以上であること」のみを証明できる。

    • 補足:述語証明と選択的開示を組み合わせた例。生年月日を提示せずに、21歳以上であることのみを証明できる。

  • B市に車を駐車するときは、駐車料金の割引を受けるために「B市の住民であること」のみを証明できる。

    • 補足:ゼロ知識証明の例。住所や発行者の署名値を開示せずに、「B市に住んでいること」のみを証明できる。

  • 大学図書館で本を借りるときは、そのコースの文献を借りる資格があることを証明するために「大学CでコースDを受講していること」のみを証明できる。

    • 補足:これは単一の属性の選択的開示の例。

選択的開示を実現するための技術とスキーム

選択的開示を実現するための技術とスキームについては、ざっくり以下のような分類でまとめられています。(レポートの4-6章)
すべてを読み通した訳ではないのですが、斜め読みしたポイントをメモしていきます。

アトミック属性証明(Atomic (Q)EAAs)

単一の属性のみをクレームに含む属性証明を組み合わせてVerifierに提示する方法です。

  • このアトミック属性証明書をオンデマンドで取得することで、Verifierへの提示のたびに異なる署名値をもつ属性証明を提示することになり、リンク不可能な証明書を実現できるとされています。
    (ただしVerifierリンク不可能性であり、完全リンク不可能性ではない。)

  • データフォーマットには、W3C VCのほか、X.509 属性証明書も利用可能とされています。

  • プレゼンテーションのためのプロトコルとしては、X.509 属性証明書のPKIを使った方法のほかに、アトミック属性証明用のVC-FIDOというものがあるらしいです。詳細は割愛しますが、ここでFIDOが出てくることに驚き。

マルチメッセージ署名(Multi-Message Signature)

マルチメッセージ署名とは、署名された大元のメッセージの中から、任意の属性のサブセットを選択的に開示できる署名です。
(以下の図はBBS+署名の例です。)

  • 具体技術としては、BBS/BBS+署名、CL署名、PS-MS(Pointcheval-Sanders Multi-Signatures)が説明されています。すみません、個々の技術の詳細は割愛します。

  • データフォーマットとしては、ZKPを使用したW3C VCDM、BBS暗号スイートを使用したW3C VC Data Integrity、ECDSAを使用したW3C VC Data Integrity、hyperledger AnonCredsが利用できるようです。

  • プレゼンテーションプロトコルは、TPMで使用されるHyperledger AnonCredsとDirect Anonymous Attestation(DAA)が挙げられています。(馴染みがない…)

  • いずれも標準化は道半ばのようですが、ISO/IECではBBS+署名とPS-MSの標準化に率先して取り組まれているようです。関連する標準としては、以下が挙げられていました。

    • ISO/IEC 20008 - Anonymous digital signatures

    • ISO/IEC PWI 24843 - Privacy-preserving attribute-based credentials

    • ISO/IEC CD 27565 - Guidelines on privacy preservation based on ZKP

ソルト付き属性ハッシュ(Salted Attribute Hash)

各属性にソルトを付けハッシュ化した値をリスト化しておき、Verifierに対しては開示したい属性と対応するソルトのみを提示することで、Verifierは提示された属性のみを検証できる仕組みです。
Verifier側は、提示されなかった属性については「ソルト付与後のハッシュ値」しか得られないので、属性値もわからなければ検証もできない、ということになります。なんだか暗号のような印象を受けます。

  • 具体技術としては、HashWires、Authentic Chained Data Containers、Gordian Enveloveが説明されています。

  • データフォーマットは、IETF SD-JWT、ISO/IEC 18013-5 MSO(Mobile Security Object)です。

  • ソルト付き属性ハッシュは選択的開示は実現できますが、リンク不可能性はデフォルトでは実現できません。署名値またはソルト値によって簡単にリンクできてしまうためです。

    • ※レポートには回避策も示されていましたが、いまいち理解できなかったので今後の宿題にします。

  • プレゼンテーションプロトコルとしては、SO/IEC 18013-5、ISO/IEC 18013-7、ISO/IEC 23220-4、OID4VPが挙げられています。

ゼロ知識証明(プログラマブルZKPs)

ZKPです。レポートでは「算術回路の証明」と書かれています。
要は、あらゆるステートメントは算術回路に変換できるので、算術回路の証明により任意のステートメントについてのZKPを構築できるという仕組みになります。
わかります。テフをオフチョベットするんですよね。

  • 具体技術としては、このレポートは「zk-SNARKsにフォーカスする」と書かれています。

  • すみません、やはりちゃんと理解できませんでした。基本的にはBSS+署名などと組み合わせて用いられるのだと理解していますが、技術や仕組みの詳細は省きます。

まとめ

いかがでしたでしょうか。
わかったようでわからない、ちょっとわかった感じでしょうか。
私はもう何もわからなくなりました。

やはりこのテーマは難しかったです。途中までは結構いける?と思って読み進められたのですが、前提知識が色々と足りていませんね。

それでも、昨年7月にレポートが公開されたときはほとんど理解できなかったので、進歩はあったはずです。こうして地道に何度も読み直しながら理解を深めていくしかなさそうです。

それでは、最後までお付き合いいただき、ありがとうございました!


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