第3部分 原理篇3可验证凭证(VC)(4)
3.3.5. 可验证凭证主要属性
本聪老师:下面我们通过一个例子,来详细介绍下可验证凭证中的主要属性和概念。我们看例3-,这是一个可验证凭证,证明某学生毕业于Example University的例子。
例3-11: 可验证凭证的例子
{
// 设置context, 构建下面要用的术语
// 例如 ‘issuer’ and ‘alumniOf’.
“@context”: [
“https://www.w3.org/2018/credentials/v1”,
“https://www.w3.org/2018/credentials/examples/v1”
],
// 指定credential的标识符
“id”: “http://example.edu/credentials/1872”,
// credential类型, 宣布在凭证中要包含的数据
“type”: [“VerifiableCredential”, “AlumniCredential”],
// 发行credential的实体
“issuer”: “https://example.edu/issuers/565049”,
// credential生效时间
“validFrom”: “2010-01-01T19:23:24Z”,
// 关于credential主体的claims
“credentialSubject”: {
// credential的唯一主体的标识符
“id”: “did:example:ebfeb1f712ebc6f1c276e12ec21”,
// credential的唯一主体的断言
“alumniOf”: {
“id”: “did:example:c276e12ec21ebfeb1f712ebc6f1”,
“name”: [{
“value”: “Example University”,
“lang”: “en”
}, {
“value”: “Exemple d’Université”,
“lang”: “fr”
}]
}
},
// 使凭证不被篡改的数字证明
“proof”: {
// 用于生成签名的密码学签名套件
“type”: “RsaSignature2018”,
// 签名创建的日期时间
“created”: “2017-06-18T21:19:10Z”,
// 证明的目的
“proofPurpose”: “assertionMethod”,
// 可以验证签名的公钥的标识符
“verificationMethod”: “https://example.edu/issuers/565049#key-1”,
// 数字签名值
“jws”: “eyJhbGciOiJSUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..TCYt5X
sITJX1CxPCT8yAV-TVkIEq_PbChOMqsLfRoPsnsgw5WEuts01mq-pQy7UJiN5mgRxD-WUc
X16dUEMGlv50aqzpqh4Qktb3rk-BuQy72IFLOqV0G_zS245-kronKb78cPN25DGlcTwLtj
PAYuNzVBAh4vGHSrQyHUdBBPM”
}
}
说明:例子摘自W3C《Verifiable Credentials Data ModelV1.1》。
本聪老师:大家从这个例子看出来哪些?
小天:我看到这个VC分为@context、id、type、issuer、validFrom、credentialSubject、proof这几部分。
本聪老师:好的。这些就是VC的属性概念。我们就分别介绍下这几个概念。
3.3.5.1. @context属性
本聪老师:@context称为对话的上下文(context of a conversation),用来设定软件系统对话交流的环境。可验证凭证的属性和值一般是 URI形式,对人类不太友好,因此使用@context 属性将短格式别名映射到可验证凭证所需的 URI。
小明:例子中的两行内容表示什么呢?
本聪老师:根据可验证凭证的规范,@context 属性的值是有序集,要求第一项的URI,其值必须为:https://www.w3.org/2018/credentials/v1。这个值提供的数据是一个永远不会更新的静态文档,主要是用来确定后续属性和值是关于可验证凭证的。之后的URI用来明确后续对话是关于特定特定可验证凭证的。比如例3-中第2个URI的值“https://www.w3.org/2018/credentials/examples/v1”就是关于“examples”这个可验证凭证的。
小明:嗯,了解了。
3.3.5.2. id属性
本聪老师:接下来是id 属性,用来明确这个可验证凭证指代的对象,例如人、产品或组织。 id 属性只能是一个值,也只能是URI形式。我们看例子使用了两种类型的标识符。 第一个标识符用于可验证凭证并使用基于 HTTP 的 URL。 第二个标识符用于可验证凭证的主体(声明所涉及的内容),并使用去中心化标识符,即 DID。
3.3.5.3. type属性
本聪老师:type属性是必须的,属性的值可以一个或多个URI。如果值是“VerifiableCredential”表明这是一个可验证凭证,如果值为“VerifiablePresentation”表明这是一个由过个可验证凭证组成的可验证表述。另外后面还必须跟一个具体的值,用来制定特定凭证或者表述,例如例子中的 UniversityDegreeCredential,以便软件系统可以处理这些附加信息。
3.3.5.4. issuer 属性和validFrom 属性
小明:接下来的”issuer”应该是指发证方,”validFrom”是有效时间。
本聪老师:对。issuer 属性的值可以是URI形式或 ID(例如DID,“did:example:abfe13f712120431c276e12ecab”)。
本聪老师:另外还需要说明,从VC-DATA-MODEL V2.0版本开始废弃原来的issuanceDate属性,改为validFrom属性,后者明确了该属性是凭证的生效时间,生效实现也可以是未来的时间。另外还增加一个validUntil属性,用来表示凭证失效的时间。
小明:感觉升级之后凭证的时间管理更灵活了。
本聪老师:对。下面我们来看credentialSubject 属性。
3.3.5.5. credentialSubject 属性
本聪老师:我们刚才提到声明(claim),但没有细说。credentialSubject 属性就是表达关于一个或多个主体的声明。credentialSubject 属性的值定义为一组对象,这些对象包含一个或多个属性,每个属性都与可验证凭证的主体相关。可以在可验证凭证中表达与两个或者多个主体相关的信息。下面的例3-指定了两个作为配偶的主体。
例3-12: 在可验证凭证中指定两个具有配偶关系的主体
{
“@context”: [
“https://www.w3.org/2018/credentials/v1”,
“https://www.w3.org/2018/credentials/examples/v1”
],
“id”: “http://example.edu/credentials/3732”,
“type”: [“VerifiableCredential”, “RelationshipCredential”],
“issuer”: “https://example.com/issuer/123”,
“issuanceDate”: “2010-01-01T00:00:00Z”,
“credentialSubject”: [{
“id”: “did:example:ebfeb1f712ebc6f1c276e12ec21”,
“name”: “Jayden Doe”,
“spouse”: “did:example:c276e12ec21ebfeb1f712ebc6f1”
}, {
“id”: “did:example:c276e12ec21ebfeb1f712ebc6f1”,
“name”: “Morgan Doe”,
“spouse”: “did:example:ebfeb1f712ebc6f1c276e12ec21”
}]
}
3.3.5.6. proof属性
本聪老师:proof属性主要内容是加密机制,用于证明可验证凭证或可验证表述中的信息未被篡改。可验证凭证有两类证明机制:外部证明(external proof)和嵌入式证明(embedded proof)。 外部证明是包装此数据模型表达式的证明,例如 JSON Web Token。 嵌入式证明是一种将证明包含在数据中的机制,例如数据签名,嵌入证明时,必须使用proof属性。
小天:我觉得应该是证明属性实现了可验证凭证中的“可验证”能力?
本聪老师:对。这里的proof属性使用一种或多种加密证明,用于检测和验证凭证或表述的作者身份。
本聪老师:proof属性一般是name-value对的形式,其中type的name-value是必须的,负责指定证明方法。证明方法因语言和技术不同,最常见的是数字签名,proof属性中包括签名、对签名实体的引用和签名日期的表示。比如下面例3-13中的Ed25519数字签名。
例3-13 proof属性
“proof”: {
“type”: “Ed25519Signature2020”,
“created”: “2021-11-13T18:19:39Z”,
“verificationMethod”: “https://example.edu/issuers/14#key-1”,
“proofPurpose”: “assertionMethod”,
“proofValue”: “z58DAdFfa9SkqZMVPxAQpic7ndSayn1PzZs6ZjWp1CktyGesjuTSwRdo
WhAfGFCF5bppETSTojQCrfFPP2oumHKtz”
3.3.5.7. credentialStatus 属性
本聪老师:还有credentialStatus 属性,它主要用于发现有关可验证凭证的当前状态的信息,例如它是暂停还是已撤销。
3.3.5.8. Data Schema属性
本聪老师:credentialSchema 属性为验证方提供足够的信息来确定提供的数据是否符合提供的模式。每个credentialSchema 必须指定其type(例如,JsonSchemaValidator2018)和一个 id 属性,该属性必须是标识模式文件的 URI。在例3-14,中,发证方指定credentialSchema属性指向一个 [[JSON-SCHEMA-2018]] 文件,验证方可以使用该文件来确定可验证凭证的格式是否正确。
例 3-14: credentialSchema 属性例子
Credential
{
“@context”: [
“https://www.w3.org/2018/credentials/v1”,
“https://www.w3.org/2018/credentials/examples/v1”
],
“id”: “http://example.edu/credentials/3732”,
“type”: [“VerifiableCredential”, “UniversityDegreeCredential”],
“issuer”: “https://example.edu/issuers/14”,
“validFrom”: “2010-01-01T19:23:24Z”,
“credentialSubject”: {
“id”: “did:example:ebfeb1f712ebc6f1c276e12ec21”,
“degree”: {
“type”: “BachelorDegree”,
“name”: “Bachelor of Science and Arts”
}
},
“credentialSchema”: {
“id”: “https://example.org/examples/degree.json”,
“type”: “JsonSchemaValidator2018”
}
}
3.3.5.9. refreshService 属性
本聪老师:大家还记得我们之前提到过如何设置可验证凭证的失效日期?
小天:两个属性与有效期相关,一个是”validFrom”属性,设置生效时间。另一个”validUntil”属性,用来设置失效时间。
本聪老师:对。我们要学习的refreshService 属性,就是用于手动或自动刷新过期的可验证凭证。当然这个属性只是在凭证已过期失效,或发证方未发布凭证状态信息时,才会使用。发证方可以把refreshService 属性用在可验证凭证中,这样持证方或者验证方就可以在将来时刻刷新可验证凭证有效期。refreshService 属性还可以用在可验证表述中,持证方就能够在创建可验证表述共享给验证方之前,刷新可验证凭证有效期。
本聪老师:每个refreshService值必须指定其类型(例如 ManualRefreshService2018)及其 id,即服务的 URI。参见例3-15,发证方指定了一个手动刷新服务,可以通过将持证方或验证方引导到 https://example.edu/refresh/3732 来使用该服务。
例3-15: 发证方对 refreshService 属性的使用
{
“@context”: [
“https://www.w3.org/2018/credentials/v1”,
“https://www.w3.org/2018/credentials/examples/v1”
],
“id”: “http://example.edu/credentials/3732”,
“type”: [“VerifiableCredential”, “UniversityDegreeCredential”],
“issuer”: “https://example.edu/issuers/14”,
“validFrom”: “2010-01-01T19:23:24Z”,
“credentialSubject”: {
……
}
},
“refreshService”: {
“id”: “https://example.edu/refresh/3732”,
“type”: “ManualRefreshService2018”
}
}
3.3.5.10. termsOfUse
本聪老师:termsOfUse 属性可以被发证方放入可验证凭证中,也可以被持证方放入可验证表述中。这个属性规定了凭证或者表述的发行条款,它的值会指定一个或多个使用条款策略,创建者根据这些策略发布凭证或表述。 如果接收方(持证方或验证方)不愿意遵守指定的使用条款,那么他们将自行承担责任,如果他们违反规定的使用条款,可能会承担法律责任。
小明:这个类似软件使用前需要勾选的使用条款。
本聪老师:对,可以通过这个属性表明法律主张,例3-16是持证方在可验证表述中使用termsOfUse 属性的例子,持证方(转让人assigner),也是主体,表达了一个使用条款,禁止验证方(受让人assignee,https://wineonline.example.org)使用提供的信息来关联持证方或主体使用第三方服务。如果验证方使用第三方服务进行关联,他们将违反持证方创建表述的条款。
例3-16: 持证方对 termsOfUse 属性的使用
{
“@context”: [
“https://www.w3.org/2018/credentials/v1”,
“https://www.w3.org/2018/credentials/examples/v1”,
{
“@protected”: true,
“VerifiablePresentationTermsOfUseExtension”: {
“@id”: “https://www.w3.org/2018/credentials/examples#VerifiablePresentationExtension”,
“@context”: {
“@protected”: true,
“termsOfUse”: {
“@id”: “https://www.w3.org/2018/credentials#termsOfUse”,
“@type”: “@id”
}
}
}
}
],
“id”: “did:example:ebfeb1f712ebc6f1c276e12ec21”,
“type”: [“VerifiablePresentation”, “VerifiablePresentationTermsOfUseExtension”],
“verifiableCredential”: [{
“@context”: [
“https://www.w3.org/2018/credentials/v1”,
“https://www.w3.org/2018/credentials/examples/v1”
],
“id”: “http://example.edu/credentials/3732”,
“type”:[“VerifiableCredential”, “UniversityDegreeCredential”],
“issuer”: “https://example.edu/issuers/14”,
“validFrom”: “2010-01-01T19:23:24Z”,
“credentialSubject”: {
……
}
},
“proof”: { }
}],
“termsOfUse”: [{
“type”: “HolderPolicy”,
“id”: “http://example.com/policies/credential/6”,
“profile”: “http://example.com/profiles/credential”,
“prohibition”: [{
“assigner”: “did:example:ebfeb1f712ebc6f1c276e12ec21”,
“assignee”: “https://wineonline.example.org/”,
“target”: “http://example.edu/credentials/3732”,
“action”: [“3rdPartyCorrelation”]
}]
}],
“proof”: [ … ]
}
本聪老师:关于可验证凭证的属性我们就学习这些。下面我们开始学习可验证凭证的发行、展示、验证及删除,也就是生命周期管理。
本文内容摘自《对话去中心化数字身份》。作者:乔布施。首发平台:https://ytm.app
欢迎转载,请注明出处及作者。