DID系列1--去中心化数字身份DID简介_did vc

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
资料来源
去中心化数字身份(Decentralized IdentityDID)是基于区块链技术建立起来的一种数字身份系统。它可以保证身份数据真实可信同时也能保护身份用户相关的隐私确保跟个人身份相关的数据归属于个人所有。很吻合2021年11月开始实施的《中国个人信息保护法》。

1 身份认证的演进过程

V1.0 传统的身份认证用户在每个网站上都重复注册账号使用账号+密码的方式登录每个网站各自掌握着用户的身份信息如图1(a)所示。
缺点重复注册账号用户会时常不记得账号密码而且多个网站都有用户的信息也导致信息泄露。
V2.0 以单点登录代表的身份认证用户在一个网站上注册的账号可以授权登录到其他网站比如在支付宝、微信、facebook、google等网站注册号账号后授权登录到其他网站如图1(b)所示。
缺点用户的信息都掌握在几个大网站内会有”店大欺客“的成分存在也容易出现信息泄露的情况如facebook的用户信息泄露问题。
V3.0 去中心化的身份认证用户保管自己的身份信息在必要的时候以最小化的方式出示给各个网站确认即可如图1(c)所示。
算缺点么需要区块链作为底层技术支撑将区块链作为一个可信任的第三方来保证身份信息的完整性和正确性。

 

图1.身份认证的演进过程

2 DID 身份认证的原理

Decentralized IDentity去中心化身份简称DID相对于传统的基于PKI的身份体系基于区块链建立的DID数字身份系统具有保证数据真实可信、保护用户隐私安全、可移植性强等特征其优势在于
去中心化基于区块链避免了身份数据被单一的中心化权威机构所控制。
身份自主可控基于DPKI 分布式公钥基础设施每个用户的身份不是由可信第三方控制而是由其所有者控制个人能自主管理自己的身份。
可信的数据交换身份相关数据锚定在区块链上认证的过程不需要依赖于提供身份的应用方。

2.1 DID长什么样

                            图2.DID标识
前缀did: 固定的表示它是一个did标识。 
中间的example被称为DID方法用来表示是用哪一套方案方法来进行定义和操作的。可以自定义比如腾讯旗下FISCO BCOS的DID标识为 tdidHyperledger Indy的标识为 indy更多的请参考W3C的网站 https://w3c.github.io/did-spec-registries/#did-methods
后面的字符串是在该DID方法下的唯一标识字符串。
比如我们做了一个DID系统我们把方法就起名叫cid吧想把中国公民的身份证信息都DID化那么我的DID标识就是 did:cid:5111**************5 这里我们就使用身份证号码作为cid这个DID方法下的唯一标识。

2.2 DID document --> DID的详细说明

    DID 文档是对DID的详细说明是一对一的关系可以看作由两部分组成DID metadata以及 DID public key如图4(a)其中public key是关键用于数字签名或加密操作等。
    一般 DID 由用户自己保存而将DID document 保存在区块链上(可以DID为 key 做索引)以保证DID document 的正确性。
    当用户在区块链上注册 DID 时可以根据智能合约生成DID 及相关的document并由智能合约负责 DID在链上的读取和更新等。

 

  图4. DID文档, VC, VP 的格式

个人觉得DID文档中最重要的就是公钥信息。
2.3 可验证声明 VC(Verifiable Claims)
      可验证凭据  VC(Verifiable Credential)
VC是一个 DID 给另一个 DID 的某些属性做背书而发出的描述性声明并附加自己的数字签名用以证明这些属性的真实性可以认为是一种数字证书。 传统的PKI数字证书体系需要CA来颁发而在DID中也是分为颁发者、持有者、验证者、DID注册系统也就是区块链具体关系如图

  • 颁发者Issuer就是证书的颁发机构比如身份证就是公安机关作为颁发者毕业证书就是大学作为颁发者。
  • 持有者Holder就是证书的持有人就是我们这些普通人。
  • 验证者Verifier就是在我们使用证书时查看我们证书的人或者机构。比如我们入住酒店前台要验证我们的身份证那么酒店前台就是验证者再比如我们入职新公司时需要提供大学毕业证书新公司HR就是验证者。
  • DID注册系统Verifiable Data Registry就是我们存储了DID标识和DID文档的地方通过DID标识可以查询到对应的DID文档。
当公安机关给我颁发了身份证在DID中这个身份证就是VC。一个VC也是一个JSON字符串里面包含如下信息
  • VC元数据主要就是发行人、发行日期、声明的类型等信息。
  • 声明一个或者多个关于主体的说明。比如身份证作为公安机关颁发给我的VC在声明中会包含姓名、性别、出生日期、民族、住址等信息。
  • 证明通常就是颁发者的数字签名保证了本VC能够被验证防止VC内容被篡改以及验证VC的颁发者。
下面是官方给出的一个VC的具体样例
​
{
// VC内容所遵循的JSON-LD标准
"@context": [
"https://www.w3.org/2018/credentials/v1",
"https://www.w3.org/2018/credentials/examples/v1"
],
// 本VC的唯一标识也就是证书ID
"id": "http://example.edu/credentials/1872",
// VC内容的格式
"type": ["VerifiableCredential", "AlumniCredential"],
// 本VC的发行人
"issuer": "https://example.edu/issuers/565049",
// 本VC的发行时间
"issuanceDate": "2010-01-01T19:73:24Z",
// VC声明的具体内容
"credentialSubject": {
// 被声明的人的DID
"id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
// 声明的断言内容
"alumniOf": {
"id": "did:example:c276e12ec21ebfeb1f712ebc6f1",
"name": [{
"value": "Example University",
"lang": "en"
}, {
"value": "Exemple d'Université",
"lang": "fr"
}]
}
},
// 对本VC的证明
"proof": {
// 签名算法
"type": "RsaSignature2018",
// 签名创建时间
"created": "2017-06-18T21:19:10Z",
// 本证明的目的
"proofPurpose": "assertionMethod",
// 验证本签名的公钥的ID
"verificationMethod": "https://example.edu/issuers/keys/1",
// 数字签名的内容
"jws": "eyJhbGciOiJSUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..TCYt5X
sITJX1CxPCT8yAV-TVkIEq_PbChOMqsLfRoPsnsgw5WEuts01mq-pQy7UJiN5mgRxD-WUc
X16dUEMGlv50aqzpqh4Qktb3rk-BuQy72IFLOqV0G_zS245-kronKb78cPN25DGlcTwLtj
PAYuNzVBAh4vGHSrQyHUdBBPM"
}}
​
因为VC中具有用户的隐私信息所以VC一般保存在私有的存储中比如用户自己的手机中或者需要授权的网络地址中。除了前面示例中给出的数据外我们的VC还可以有失效日期比如我们的身份证一般10年有效过期后就需要重新向颁发者申请新的VC。
2.4 可验证表达 VP(Verifiable presentation)
可验证表达是VC持有者向验证者表明自己身份的数据。一般情况下我们直接出示VC全文即可但是在某些情况下出于隐私保护的需要我们并不需要出示完整的VC内容只希望选择性披露某些属性或者不披露任何属性只需要证明某个断言即可。
比如一个求职者要进入某写字楼面试写字楼的保安要求登记身份证号码和姓名但是我们的VC中还包含了民族、住址等信息我们的求职者不希望将自己的住址暴露给保安所以他提供给保安的VP中应该只选择性的披露身份证号码和姓名其他信息都不披露。 
再比如我们规定必须年满18岁才有资格购买香烟所以一个消费者在购买香烟时必须证明自己已经年满18岁但是直接出示身份证给收银员又会暴露太多隐私信息就算选择性披露生日属性也会让收银员知道了消费者具体的年龄和生日日期这种情况下消费者只希望在VP中证明自己大于18岁其他什么信息都不能暴露。
  • VP元数据主要包含了版本本JSON对象的类型等信息
  • VC列表要对外展示的VC的内容如果是选择性披露或者隐私保护的情形可能就不包含任何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": "http://example.edu/credentials/1872",
"type": ["VerifiableCredential", "AlumniCredential"],
"issuer": "https://example.edu/issuers/565049",
"issuanceDate": "2010-01-01T19:73:24Z",
"credentialSubject": {
"id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
"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/keys/1",
"jws": "eyJhbGciOiJSUzI1NiIsImI2NCI6ZmFsc2UsImNyaXQiOlsiYjY0Il19..TCYt5X
sITJX1CxPCT8yAV-TVkIEq_PbChOMqsLfRoPsnsgw5WEuts01mq-pQy7UJiN5mgRxD-WUc
X16dUEMGlv50aqzpqh4Qktb3rk-BuQy72IFLOqV0G_zS245-kronKb78cPN25DGlcTwLtj
PAYuNzVBAh4vGHSrQyHUdBBPM"
}
}],
// Holder对本VP的签名信息
"proof": {
"type": "RsaSignature2018",
"created": "2018-09-14T21:19:10Z",
"proofPurpose": "authentication",
"verificationMethod": "did:example:ebfeb1f712ebc6f1c276e12ec21#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"
}}
​
以上都是一些基本概念。

3. 如何支持多种类型的claim

    VC中的claim五花八门可能是大学毕业证书、身份证、驾驶证、结婚证等为了能正确地解析就需要提前在区块链中注册其解析方式 这就是 证书模板
    这种事情一般由Authority来完成按照业务场景分类定义不同类型数据结构的Claim结构并注册在区块链上以保证全网通用。

4. 如何支持选择性披露

     以身份证为例其完整的VC凭据包括姓名、性别、出生日期、民族、住址、照片等。在买火车票时可能只需要姓名和身份证号码上学报名时可能仅需要姓名、出生日期等确认少数民族身份时必须要明确民族信息。所以很多场景下不是全部选项都需要可能只需要其中的一两项可以仅仅披露必须项。
    但如何确认披露的这几项是正确的没有被修改过呢这里用到了经典的Merkle Tree结构如图5所示。比如在只需要披露生日的场景下就可以借用”生日“的兄弟选项”民族“以其到树根的路径<Hash1, Hash34> + MerkleRoot 来验证”生日“的正确性。

 

                             图5.Merkle Tree用于验证选择性披露项的正确性

6. 采用零知识证明ZKP方式保护隐私

    用户拥有的凭据中涉及很多私密信息比如年龄(女生最不愿意让别人知道的)、收入等这些都不能直接给别人看但很多情况下又必须要验证这些信息比如下图中的年龄范围(ageOver 18)、在学校是否获得过奖学金(degree)这些都是从原始VC中推导出来的但为了保证推导过程的正确性就必须附带零知识证明ZKP proof一同存放在VP中。

                                            图6.用ZKP保护隐私

7. DID的认证流程

    DID的认证过程涉及四方的交互证书颁发者证书持有者(可以拥有一个app保存多张证书凭据VC)验证方以及DID注册系统(比如区块链)。
    证书颁发者是一个权威机构比如某大学、公安机关等持有者会保存权威机构发布的凭据VC(比如从大学拿到的毕业证公安机关拿到的身份证等)验证者会对这些凭据的表示(VP)并结合区块链上的信息进行验证。
      DID认证的前提是权威机构、VC持有者、验证者都已经在区块链上注册了各自的ID。

8 W3C标准

Decentralized Identifiers (DIDs) v1.0

DID Specification Registries

代码库
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6