最近在研究DID分布式数字身份,先整理一部分相关的概念介绍,后续逐渐分享相关笔记。
## 一、行业现状
分布式数字身份诞生之前,人们的身份信息已或多或少进行数字化,但数字化并不意味着网络化、可信任,以及可以便捷且合法合规的互联互通。
### 1.1 现有数字身份痛点
互联网应用的数字身份以用户名密码为主,并结合KYC完成实名认证。用户要重复注册账号密码。
互联网业务在应用层并不互联互通,仅有部分应用打通跨应用的快速认证,但实质上并不完全互联互通。
互联网巨头依靠垄断用户数据,产生了大量价值,但用户无法掌控利用自己的价值数据。
综上现有数字身份存在的问题:
重复认证的问题:
多身份体系在浪费存储资源的同时,也存在诸多数据共享与使用上的障碍,数据孤岛的现象显著,无法综合利用。
身份数据隐私与安全问题:
用户身份信息散落在各个企业级的身份认证者手中,基于企业产品或企业的生命周期而波动,多方认证难免会引起数据泄露,产生木桶短板效应问题。
中心化认证效率和容错性问题:
传统的PKI系统中数字证书是认证的核心,由权威的CA机构签发的中心结构可能存在性能问题,另一方面,单中心的结构容易使其成为攻击的目标,一旦上级CA机构被攻破,则与之相关联的下级CA也会受牵连。
### 1.2 分布式数字身份整体架构
分布式数字身份,它用分布式基础设施改变应用厂商控制数字身份的模式,让用户控制和管理数字身份。区块链技术用哈希链的数据结构改变了电子数据易被篡改的属性,用“区块+共识算法”解决分布式系统的数据一致性问题,拜占庭容错能力保证跨实体运行的系统不受少数节点作恶行为的影响。
分布式数字身份一般采用多层框架,如下图是一种典型的分布式数字身份三层架构。

## 二、W3C DID协议与规范
万维网联盟(W3C)推动中的分布式标识符(DID)和可验证凭证规范(Verifiable Credential),DID规范和可验证凭证规范分别定义了代表实体的身份标识符及与之关联的属性生命,其共同支撑了分布式数据身份基础模型,可验证凭证模型的有效运转。
### 2.1 DID
分布式标识符(DID)的两个用途:
- 用标识符来标识DID主体(人员,组织,设备,密钥,服务和一般事务)的特定实例。
- 促进实体之间创建持久加密的专用通道,无需任何中心化注册机制。它们可以用于诸如凭证交换和认证。
[即:通用性,一账户通行相关所有相关业务,完全意义上的快捷认证、快捷登录]

### 2.2 DID相关技术概念
- DID : 具有以下形式 : "did":<did - method> + ":" <method 特定的标识符>
- DID解析器 : 允许将DID作为输入,并返回DID Doc的相关元数据,该元数据遵循诸如JSON
- DID Doc : 是一个通用数据结构,它包含与DID 验证相关的密钥信息和验证方法,提供了一组使DID控制者能够证明对其DID控制的机制。基于W3C规范定义:
- 统一资源标识符(URI),用于标识允许各方阅读DID文档的术语和协议
- 标识DID文档身份主体的DID
- 用于认证,授权和通信机制的一组公共密钥
- 用于DID的一组身份验证方法,以向其他实体证明DID的所有权
- 针对DID的一组授权和委派方法,以允许另一个实体代表他们进行操作
- 创建文档的时间戳记
- 文档上次更新的时间戳
- 服务端点集,以描述在何处以及如何与DID身份主体进行交互
- 完整性的密码证明(如数字签名)
### 2.3 可验证凭证(Verifiable Credential)
可验证凭证是一个DID给另一个DID的某些属性做背书而发出的描述性声明,并附加自己的数字签名,用以证明这些属性的真实性,可以认为是一种类型的数字证书。
比如:当公安机关给我们颁发了身份证,在DID中,这个身份证就是VC。这个VC本质上是一个JSON格式字符串,里面包含如下信息:
- VC元数据,主要就是发行人、发行日期、声明的类型等信息。
- 声明,一个或者多个关于主题的说明。比如身份证作为公安机关颁发给我的VC,在声明中会包含:姓名、性别、出生日期、民族、住址等信息。
- 证明,通常就是颁发者的数字签名,保证了该VC能够被验证,防止VC内容被篡改以及验证VC的颁发者。
以毕业证为例子,根据小明的学习情况(入学时间、毕业时间、专业、是否结业等信息)以及小明提交自己的DID,生成VC如下:
```
{
// VC内容所遵循的JSON-LD标准
"@context" : [
" https://www.w3.org/2018/credentials/v1 " ,
" https://www.w3.org/2018/credentials/examples/v1 "
],
// 本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学校颁发给出的证明。可以选择将这个内容存入手机中或存储云上,以后需要时再读取使用。
### 2.4 可验证表达(Verifiable Presentation)
可验证表达是VC持有者向验证者表明自己身份的数据。一般情况下,直接出示VC全文即可,但是在需要隐私保护的情况中,我们不想出示完整的VC内容,只希望选择性披露某些属性,或者不披露任何属性,只需要证明某个断言即可。
比如,一个求职者要进入某写字楼面试,写字楼的保安要求登记身份证号码和姓名,但我们的VC中还包含了民族、住址等信息,我们求职者不希望自己的住址暴露给保安,所以他提供给保安的VP中应该只选择性的披露身份证号码和姓名,其他信息选择不披露。又比如,在某种特殊情况下,我们不希望这次求职暴露任何的身份信息,除了目标公司本身,我们可以不披露任何属性,仅证明我们是访客身份即可。
VP的格式为:
- VP元数据,主要包含了版本,本JSON对象的类型等信息
- VC列表,要对外展示的VC的内容,如果是选择性披露或者隐私保护的情形,可能就不包含任何VC。
- 证明,主要就是持有者对本VP的签名信息
小明到新公司入职,入职当天需要提交学历证明给公司HR,小明就可以基于上文中的VC再封装成VP,VP内容如下:
```
{
"@context": [
" https://www.w3.org/2018/credentials/v1 ",
" https://www.w3.org/2018/credentials/examples/v1 "
],
"type": "VerifiablePresentation",
// 本VP包含的VC的内容
"verifiableCredential": [{
"@context": [
" https://www.w3.org/2018/credentials/v1 ",
" https://www.w3.org/2018/credentials/examples/v1 "
],
"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是这个用户亲自出具的。