DID系列12--可验证表达VP--一般性说明

本文通过具体的毕业证书示例说明VC、VP的一般用法。

1 可验证凭证/可验证声明

(Verifiable Claims 或 Verifiable Credentials,本文接下去都简称VC)是一个 DID 给另一个 DID 的某些属性做背书而发出的描述性声明,并附加自己的数字签名,用以证明这些属性的真实性,可以认为是一种数字证书。
当公安机关给我颁发了身份证,在DID中,这个身份证就是VC。一个VC也是一个JSON字符串,里面包含如下信息:
   
VC元数据,主要就是发行人、发行日期、声明的类型等信息。
  • 声明,一个或者多个关于主体的说明。比如身份证作为公安机关颁发给我的VC,在声明中会包含:姓名、性别、出生日期、民族、住址等信息。
  • 证明,通常就是颁发者的数字签名,保证了本VC能够被验证,防止VC内容被篡改以及验证VC的颁发者。
颁发毕业证VC,学校根据小明的学习情况(入学时间、毕业时间、专业、是否结业等信息)以及小明提交的自己的DID,生成VC如下:
{
   // VC内容所遵循的JSON-LD标准
   "@context" : [
   ],
   // 本VC的唯一标识,也就是证书ID
   "id" :  "uestc/alumni/12345" ,
   // VC内容的格式
   "type" : [ "VerifiableCredential" ,  "AlumniCredential" ],
   // 本VC的发行人
   "issuer" :  "did:cedu:uestc" ,
   // 本VC的发行时间
   "issuanceDate" :  "2010-07-01T19:73:24Z" ,
   // VC声明的具体内容
   "credentialSubject" : {
     // 被声明的人的DID
     "id" :  "did:cid:511112200001010015" ,
     // 声明内容:毕业院校、专业、学位等
     "name" : "小明" ,
     "alumniOf" : {
       "id" :  "did:cedu:uestc" ,
       "name" : [{
         "value" :  "电子科技大学" ,
         "lang" :  "cn"
       }]
     },
     "degree" : "硕士研究生" ,
     "degreeType" : "工科" ,
     "college" : "计算机学院"
   },
   // 对本VC的证明
   "proof" : {
     "creator" :  "did:cedu:uestc#keys-1" ,
     "type" :  "Secp256k1" ,
     "signatureValue" :  "3044022051757c2de7032a0c887c3fcef02ca3812fede7ca748254771b9513d8e2bb"
   }
}
这里最主要的就是credentialSubject证书的内容和proof颁发学校给出的证明。这个VC生成后会传给小明,小明可以选择将这个内容存储到自己的手机APP中,也可以选择存储到云上,以后需要使用时再读取。

2 可验证表达:

Verifiable presentation简称VP,可验证表达是VC持有者向验证者表名自己身份的数据。一般情况下,我们直接出示VC全文即可,但是在某些情况下,出于隐私保护的需要,我们并不需要出示完整的VC内容,只希望选择性披露某些属性,或者不披露任何属性,只需要证明某个断言即可。

比如一个求职者要进入某写字楼面试,写字楼的保安要求登记身份证号码和姓名,但是我们的VC中还包含了民族、住址等信息,我们的求职者不希望将自己的住址暴露给保安,所以他提供给保安的VP中应该只选择性的披露的身份证号码和姓名,其他信息都不披露。
再比如我们规定必须年满18岁才有资格购买香烟,所以一个消费者在购买香烟时必须证明自己已经年满18岁,但是直接出示身份证给收银员又会暴露太多隐私信息,就算选择性披露生日属性,也会让收银员知道了消费者具体的年龄和生日日期,这种情况下消费者只希望在VP中证明自己大于18岁,其他什么信息都不能暴露。
VP的格式为:
  • VP元数据,主要包含了版本,本JSON对象的类型等信息
  • VC列表,要对外展示的VC的内容,如果是选择性披露或者隐私保护的情形,可能就不包含任何VC。
  • 证明,主要就是持有者对本VP的签名信息
接下来小明来到新公司入职,入职当天需要提交学历证明给公司HR,于是小明基于上一步骤生成的VC再封装一下,生成VP,VP的内容如下:
{
  "@context": [
  ],
  "type": "VerifiablePresentation",
  // 本VP包含的VC的内容
  "verifiableCredential": [{
    "@context": [
  ],
  "id": "uestc/alumni/12345",
  "type": ["VerifiableCredential", "AlumniCredential"],
  "issuer": "did:cedu:uestc",
  "issuanceDate": "2010-07-01T19:73:24Z",
  "credentialSubject": {
    "id": "did:cid:511112200001010015",
    "name":"小明",
    "alumniOf": {
      "id": "did:cedu:uestc",
      "name": [{
        "value": "电子科技大学",
        "lang": "cn"
      }]
    },
    "degree":"硕士研究生",
    "degreeType":"工科",
    "college":"计算机学院"
  },
  "proof": {
    "creator": "did:cedu:uestc#keys-1",
    "type": "Secp256k1",
    "signatureValue": "3044022051757c2de7032a0c887c3fcef02ca3812fede7ca748254771b9513d8e2bb"
  }
  }],
  // Holder小明对本VP的签名信息
  "proof": {
    "type": "Secp256k1",
    "created": "2010-07-02T21:19:10Z",
    "proofPurpose": "authentication",
    "verificationMethod": "did:cid:511112200001010015#keys-1",
    // challenge和domain是为了防止重放攻击而设计的
    "challenge": "1f44d55f-f161-4938-a659-f8026467f126",
    "domain": "4jt78h47fh47",
    "jws": "eyJhbGciOiJSUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..kTCYt5
      XsITJX1CxPCT8yAV-TVIw5WEuts01mq-pQy7UJiN5mgREEMGlv50aqzpqh4Qq_PbChOMqs
      LfRoPsnsgxD-WUcX16dUOqV0G_zS245-kronKb78cPktb3rk-BuQy72IFLN25DYuNzVBAh
      4vGHSrQyHUGlcTwLtjPAnKb78"
  }
}
注意VP里面包含了一个完整的VC内容。 下面的proof是用户对VC的签名数据,表示该VP是这个用户亲自出具的。
3 对VP的验证流程
公司HR作为验证者在收到小明提交的VP后首先验证Proof字段,保证VP是小明提交的,而且没有被篡改。接下来提取出其中的VC内容,对VC进行验证,验证过程如下:
1. 从proof的creator中获得颁发者的DID:did:cedu:uestc
2. 通过区块链查询到该DID的文档,在文档中有其创建人和公钥列表,其中我们取keys-1对应的公钥。
3. 创建人是did:corg:moe,是可信的DID,所以它创建的DID都是可信的。
4. 我们进一步的再用did:corg:moe去区块链读取DID文档,并获得其中的公钥,使用该公钥对did:cedu:uestc对应的文档进行签名验证,确保其没有被篡改。
5. 验证通过,我们再用did:cedu:uestc的公钥对小明提交的VC进行签名验证,验证通过,则说明这个证书确实是可信的UESTC颁发的。
6. HR检查VC中提供的内容,与小明提交的履历上是否一致,检查完成,进行下一步的入职手续。
以上验证过程中我们至少需要进行三次签名验证。验证VP是小明提交的,验证VC是UESTC颁发的,验证UESTC的DID是MOE创建的,而MOE是在验证方系统可信列表中的,所以整个就保证了小明提交的证书的可信。
4 学校的DID由教育部签发
学校本身也有自己的DID,由于学校是教育系统里面颁发的DID,所以规则和小明作为中国公民的DID规则不一样,比如学校的DID标识是:
did:cedu:uestc
这个DID不是学校自己签名的,而是被教育部签名的(教育部的DID是did:corg:moe),我们在区块链中可以找到该DID对应的DID文档如下:
{
"@context": "https://w3id.org/did/v1",
"id": “did:cedu:uestc",
"version": 1,
"created": “2020-12-08T16:02:20Z",
"updated": “2020-12-08T16:02:20Z",
"publicKey": [
{
"id": “did:cedu:uestc#keys-1", "type": "Secp256k1", "publicKeyHex": "3053ba33b235d7116a3e3080168ee293053ba33b235d7116a33053ba33b235d7116a3" },
{ "id": “did:cedu:uestc#keys-2", "type": "Secp256k1", "publicKeyHex": "e293053ba3053ba33b235d7116a3263d29fe293053ba" } ],
"authentication": [“did:cedu:uestc#key-1"],
"recovery": [“did:cedu:uestc#key-2"],
"service": [
{
"id": “did:cedu:uestc#resolver", "type": "DIDResolve", "serviceEndpoint": "https://did.studyzydemo.com" } ],
"proof": {
"type": "Secp256k1", " creator": "did:corg:moe#keys-1 ", "signatureValue": "QNB13Y7Q9...1tzjn4w==" } }
所有认证过的高校的DID都是由did:corg:moe这个DID创建的,所以这相当于传统的根CA,我们只需要信任这个DID创建的DID,就可以认为是正规的高校。
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值