Verifiable Credentials × ゼロ知識証明 

# Verifiable Credentials × ゼロ知識証明 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485870/fb469328-6927-9025-f8bd-0843737e681d.png)

Verifiable Credentials（検証可能なクレデンシャル）とは、運転免許証や学歴証明書、資格証明書、その他の機密データなどの物理的に存在する個人の属性を表す情報をデジタル化し、オンライン上で検証可能にした証明書である。

ユーザーはアプリケーションの様々なサービスを利用する際、Verifiable Credentialsを提示し、アプリケーション側は条件を満たすかどうかを検証し、ユーザーに対して利用の許可を与えることができます。一般にこのユーザーの属性を証明するVerifiable Credentialsの発行は大学、銀行、政府などの法人が役割を果たすことが多く、検証者側は発行者を信頼する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485870/e333c486-aabe-aee8-61c5-2ca0d9866987.png)


このVerifiable CredentialをVerifiable Presentationという形で表し、検証者に提出します。

Verifiable Presentationとは、一つ以上のVerifiable Credentialからのデータを含み、検証可能なデータとして検証者に共有されます。

しかし、Verifiable Credentialsの保有者は相手に情報の内容までは知られたくないが、条件を満たしていることを証明したいケースが考えられます。

例えば、政府機関から生年月日、名前、住所などを含む国民IDを受け取り、ユーザーは20歳以上のみが利用できるサービスに登録したいとします。ユーザーは単に政府機関から受け取った国民IDを提示することでそのサービスを利用することができるが、個人情報を含む住所や名前は実際には不要なデータであり、生年月日自体も教える必要はありません。ユーザーは国民IDから20歳以上であることだけを証明するデータを送ってあげれば条件を満たすことができます。

このように、条件を満たす情報を持っていることのみを相手に知らせたい場合にゼロ知識証明(ZKP)を使って実現します。ゼロ知識証明により、提示する情報が条件を満たすことと、この情報が信頼できる政府によって発行されたクレデンシャルであることを検証できます。

Verifiable Credentialにゼロ知識証明を加えることで、どのくらい情報を共有するかをユーザー自身が選択し、プライバシー保護したVerifiable Presentations作成することができます。

Verifiable PresentationsはVerifiable Credentialsからの任意の情報を含み、情報全体は暗号化されており、そこからは内容を知ることができないことを可能にしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485870/d0737127-18a0-1ee0-5b04-e32c00da5e5f.png)


このゼロ知識証明にはBBS署名などが使われています。BBS署名とは2004年にBoneh、Boyen、Shachamによって定義された署名方法で、あるグループのメンバーがメッセージ対して署名した証明書を、検証者はそれがそのグループ内の誰が署名したかを知ることができないようなグループ署名である。BBS署名の安全性は双線形写像を持つ群におけるSDH仮定に基づいて構成されている。

このグループ署名は以下のような性質を持ちます

- 正確性-誠実に生成された署名の検証は必ず正しく行われる
- 健全性-偽である署名は高い確率でそれが偽であることがわかる
- 偽造不可能-グループのメンバー以外のものは正しく署名することができない
- 匿名性-誰が署名したかを知ることができない
- 追跡可能性-グループの管理者のみが秘密鍵で署名者を明らかにすることができる
- リンク不可能-2つ以上の署名されたメッセージが同一人物によるものかどうかの判定ができない

このような性質に基づき、Verifiable Credentialに含まれる検証者に個人情報などの見せたくない情報を秘匿化し、それをVerifiable Presentationとして検証者に共有することで、検証者はそこから秘匿された情報を知ることなく、検証することができます。

実際のデータがどのように秘匿化せれているかを、永住者カードのクレデンシャル例にしてみてみます。

例）生年月日、名前、性別等を含むVerifiable Credencital

```javascript

{
  ...
  "credentialSubject": {
    "id": "did:example:b34ca6cd37bbf23",
    "type": ["PermanentResident", "Person"],
    "givenName": "JOHN",
    "familyName": "SMITH",
    "gender": "Male",
    "image": "data:image/png;base64,iVBORw0KGgokJggg==",
    "residentSince": "2015-01-01",
    "lprCategory": "C09",
    "lprNumber": "999-999-999",
    "commuterClassification": "C1",
    "birthCountry": "Bahamas",
    "birthDate": "1958-07-17"
  },
  "proof": {
    "type": "BbsBlsSignature2020",
    "created": "2020-04-26T04:21:07Z",
    "verificationMethod": "did:example:489398593#test",
    "proofPurpose": "assertionMethod",
    "proofValue": "jx2VhjyZqUT91e2OhzweJA7G2u2UvmiDtIfmr+wUWNHWno+UOAh0FaNpM8Br+5j2JBkH981/nO1I7/9PFaRrng6NXu7vzDroKtuyj6nHGkMmGq4OMmBzIqRnG3ybin/Sxmu5YwqOxPMRsWH3H+2wSA=="
  }
}
```

ユーザーはVerifiable Credentialの含まれる情報のうち、共有したくない情報を秘匿化します。

例）性別、名前以外の情報を秘匿化したVerifiable Credential

```javascript

{
	...
  "credentialSubject": {
    "id": "did:example:b34ca6cd37bbf23",
    "type": ["Person", "PermanentResident"],
    "familyName": "SMITH",
    "gender": "Male",
    "givenName": "JOHN"
  },
  "expirationDate": "2029-12-03T12:19:52Z",
  "issuanceDate": "2019-12-03T12:19:52Z",
  "issuer": "did:example:489398593",
  "proof": {
    "type": "BbsBlsSignatureProof2020",
    "created": "2020-05-25T23:07:10Z",
    "verificationMethod": "did:example:489398593#test",
    "proofPurpose": "assertionMethod",
    "proofValue": "ABgA/4N3qygQRJlX3gmQOlJRGbO1KTXKQUmaN02xl+FiNZUDmGfa5OoKtg0RJ4wxxA08t3Vut61G/pq4yN0bygaFk5EJF6j7zFXmz9Vc7EdlDAvUkXqPaKA8inSBNv97HiZ1o5hIpoRnepW89p4JXPVrFi8XbDARSZpCg18GUuUMaPQLHKU82M/9l8tqqG1lKBOs+sRAAAAAdKRrRPj6zAz5LPZgDZJ0J2rNJjQI+JNYbV4AYEVwW37sxQ99aGGvmBk3DL0sod1V/gAAAAJMLYjmrb92zV087wO8UtFLwMj7qJuqV9VkMDghdrrc3BGtJuQgKx2GTrOb4CQxI1bf+iG0USjTktcjTlKv3X5spg3+ihOnyve0HnMWWggAW22j8b78jbl7lkYGJvzIXTzrVJ5KdYp3tXMDTAX7CLEXAAAACVY8oocA9Bz1w42F8Yv7UAPHv4pSvunXqndFOet3kWtzYHYEbO5gc42wPQtLmTtmqP6kUbQv6ruxzRmANulB8fUfy2jah/QeHKvsp907YDnSfo2wofRxa/vzsZnVriw0UmZnP0sYjbhmCkhoQZkxhqel3IkOF+H80wzvCKCl6eq5biEFMYA4bXpDX6Ap5/6WS5SSFaJRWxW+hpR/9EuQE11sGtk2W2Wn4eBrQUgVqYgPLI+U/ONaUJrh+GVJ/XXx7xxbAUf/NeQ/13AkTnYNn1fUdiOJ2oKl1lGr59udFq2tBBsyC3msTtQPYJS084355GRBur5jnzPNJ2W6Gu3ZqqQeRrVyw1gzdhVDNOE8KUm9OQ3AvCuxo8PHNrqzNvc6VA==",
    "nonce": "37pdwue1a8FWLqgwCd0QJ0IJTFhp609KtxeCTWZGnfAVE+sOBDffYez+TY/bmVy+6z4="
  }
}
```

Verifiable Credentialのproofに含まれるproofValueが変更され、新しくnonceというデータが追加されます。proofを検証することで、データを秘匿にした状態にしたまま、それらが信頼されるIssuerから発行されたVerifiable Credentialであることを証明します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/485870/9f1c6c8f-998d-f005-7c43-558678d16bc6.png)


Verifiable Credentialにおける様々なソリューションを提供しているMATTR社が実験的に、Linked Data Proof  + BBS署名によりZKPへのアプローチを行っています。ZKPのプライバシー保護と強いセキュリティを持つシステムの構築を行っている。また、Digital BazaarやURSAでもBBS署名によるVerifiable Credentialのゼロ知識証明化の取り組みが行われています。

Verifiable Credentials × ゼロ知識証明はパフォーマンスが高く、サイズが小さく、暗号的に安全なため、既存の標準モデルと互換性のあるVerifiable Credentialを実現するための改善、JWT / JWTフォーマットでもゼロ知識証明可能にする相互運用性やエコシステムにおける多くの議論が今でもされています。