本文通过具体的毕业证书示例说明VC、VP的一般用法。
1 可验证凭证/可验证声明
(Verifiable Claims 或 Verifiable Credentials,本文接下去都简称VC)是一个 DID 给另一个 DID 的某些属性做背书而发出的描述性声明,并附加自己的数字签名,用以证明这些属性的真实性,可以认为是一种数字证书。
当公安机关给我颁发了身份证,在DID中,这个身份证就是VC。一个VC也是一个JSON字符串,里面包含如下信息:
![](https://i-blog.csdnimg.cn/blog_migrate/554bf2168ac0f5d077eb41d8b21df8a6.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2a90d16852ea8340ff8efb73e4d34bb8.png)
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,就可以认为是正规的高校。