侧边栏壁纸
  • 累计撰写 71 篇文章
  • 累计创建 87 个标签
  • 累计收到 5 条评论

目 录CONTENT

文章目录

深入理解去中心化身份DID (Decentralized ID)

KunkkaWu
2024-04-03 / 0 评论 / 4 点赞 / 1,766 阅读 / 4,145 字 / 正在检测是否收录...

1. 什么是DID

DID 的全称是去中心化身份(Decentralized Identity)。

用户首先生成一个公私钥对,然后将公钥和其他身份信息一起打包,形成一个 DID 文档。这个文档会被存储在一个去中心化的网络(如区块链)上,并且会被赋予一个唯一的 DID。用户可以使用他们的私钥对这个 DID 进行控制,例如更新或撤销。

DID 是由 W3C(万维网联盟)提出的一种去中心化的身份标识符,它不依赖于任何中心化的实体、权威机构或第三方进行验证。DID 是一种自主、分布式、可验证和持久的身份标识符,它可以用于任何主体,包括人、组织、物品等。

WIKI百科中的介绍:

Decentralized identifiers (DIDs) are a type of globally unique identifier that enables an entity to be identified in a manner that is verifiable, persistent (as long as the DID controller desires), and does not require the use of a centralized registry.[1] DIDs enable a new model of decentralized digital identity that is often referred to as self-sovereign identity or decentralized identity.[2] They are an important component of decentralized web applications.

翻译:

去中心化标识符(DID)是一种全局唯一标识符,它使实体能够以可验证、持久(只要DID控制器希望)的方式进行识别,并且不需要使用集中式注册表。[1] DID实现了一种新的去中心化数字身份模型,通常被称为自我主权身份或去中心化身份。[2] 它们是去中心化web应用程序的重要组成部分。

2. DID有什么用

相对于传统用户身份体系,通过手机号、邮箱、微信、支付宝,谷歌、Facebook登录到某个特定的网站或者系统,用户的身份敏感信息都会被存储到目标系统内。系统的管理者实际拥有所有用户的资料,并具备查询、篡改、删除等实际的控制权。

例如:你使用微信登录到王者荣耀中,购买了大量的皮肤等道具。王者荣耀官方是可以在违反社区协议的时候封禁了你的账号。这个时候,你失去的不仅仅是王者荣耀系统的登录身份,更多的是失去了系统内购买的皮肤等个人资源。所以:你并没有真正的拥有你个人的账户身份,而只是拥有临时账户身份的使用权

因此:DID的核心思想,身份认证的控制权从中心化的机构转移到个人手中,让每个人都能拥有并控制自己的身份信息

实际上来说,登录到应用系统的本质,就是对你的身份进行识别。 换句话说: 你怎么证明你是你

DID 可以让我们在不暴露自己隐私的情况下,就可以完成身份认证。比如你去网吧上网,不再需要是刷身份证和做人脸识别了,只需要证明你满了 18 岁即可。网吧也无法收集到你的信息(姓名、身份证号、年龄等),只知道你符合上网的年龄。

3. DID 特点

相对于传统的基于PKI的身份体系,基于区块链建立的DID数字身份系统具有保证数据真实可信、保护用户隐私安全、可移植性强等特征,其优势在于:

  • 去中心化:基于区块链,避免了身份数据被单一的中心化权威机构所控制。
  • 身份自主可控:基于DPKI (分布式公钥基础设施),每个用户的身份不是由可信第三方控制,而是由其所有者控制,个人能自主管理自己的身份。
  • 可信的数据交换:身份相关数据锚定在区块链上,认证的过程不需要依赖于提供身份的应用方。

什么是PKI

Public Key Infrastructure 的缩写,翻译过来就是公钥基础设施,其主要功能是绑定证书持有者的身份和相关的密钥对(通过为公钥及相关的用户身份信息签发数字证书),为用户提供方便的证书申请、证书作废、证书获取、证书状态查询的途径,并利用数字证书及相关的各种服务(证书发布,黑名单发布,时间戳服务等)实现通信中各实体的身份认证、完整性、抗抵赖性和保密性。PKI体系的中心是CA服务器,CA服务器必须是安全的,可信任的。主要载体是X509格式的证书文件。

4. DID的规范

DID基础层 - 标识

DID 标识符其实就是一个字符串,在 W3C 的草案中,DID 参考的是 URN 的标准,格式如下:

image

  • 前缀did: 是固定的,表示这个字符串是一个did标识字符串。
  • 中间的example: 被称为DID方法,就是用来表示这个DID标识是用哪一套方案(方法)来进行定义和操作的。这个DID方法我们可以自定义,并且注册到W3C的网站中
  • 最后面的部分: 是在该DID方法下的唯一标识字符串。

示例 1
比如我们做了一个DID系统,我们把方法就起名叫cid吧,想把中国公民的身份证信息都DID化,那么我的DID标识就是:

did:cid:5111**************5

示例 2
腾讯云基于 DID 标准开发了一个分布式身份系统 TDID,那么 TDID 服务产生的 DID标识符格式如下:

did:tdid:15:0xbd7345b2ff8d1dbf1e330a6c5dcf20c675b6c484

DID基础层 - 文档

DID的是以Key-Value的形式存储的。DID标识就是key,对应的 value 就是 DID document,具体的信息会在 document 中。document 是一个标准的 Json,其中会包括一些用户的公钥、所使用的 DID 协议以及 DID 的服务请求地址、时间戳、签名等信息。

  1. @context:这是一个必需的属性,它提供了一组定义,用于解释文档中的属性和值。通常,它的值会被设置为"https://www.w3.org/ns/did/v1",这是W3C为DID定义的标准上下文。

  2. id:这是一个必需的属性,它的值就是DID本身。这个属性唯一标识了DID文档,并可以用于在去中心化的网络中查找文档。

  3. authentication:这是一个可选的属性,它包含了一组身份验证方法。每个方法都有一个type(用于指定方法的类型,如"RsaSignatureAuthentication2018"或"EcdsaSecp256k1SignatureAuthentication2019")和一个publicKey(用于指定用于身份验证的公钥)。

  4. service:这是一个可选的属性,它包含了一组服务终端。每个服务终端都有一个id(用于唯一标识服务终端)、一个type(用于指定服务的类型,如"LinkedDataSignatureService"或"IdentityHub")和一个serviceEndpoint(用于指定服务的URL或其他终端)。

基础文档示例

{
  "@context": "https://w3id.org/did/v1",   
  "id": "did:example:123456789abcdefghi",
  "authentication": [{
    "id": "did:example:123456789abcdefghi#keys-1",
    "type": "RsaVerificationKey2018",
    "controller": "did:example:123456789abcdefghi",
    "publicKeyPem": "-----BEGIN PUBLIC KEY...END PUBLIC KEY-----\r\n"
  }],
  "service": [{
    "id":"did:example:123456789abcdefghi#vcs",
    "type": "VerifiableCredentialService",
    "serviceEndpoint": "https://example.com/vc/"
  }]
}

完整的DID document还可以定义很多其他信息:

{
  "@context": ["https://www.w3.org/ns/did/v1"],
  "id": "did:cnbn:123456789abcdefghi",
  "created": "2022-01-01T00:00:00Z",
  "updated": "2022-01-10T10:00:00Z",
  "version": "1",
  "unionId": {
    "ctid": "did:ctid:cnbn:1CFC4FE0C938F28A77A50E0D5C89FA8FBE95AF005307BEADA0F3EF007DD1EC89"
  },
  "verificationMethod": [{
    "id": "did:cnbn:123456789abcdefghi#keys-1",
    "type": "SM2VerificationKey2022",
    "controller": "did:cnbn:123456789abcdefghi",
    "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEYbBKJ5xqkUaxYOoJlKkZIb2rhoVw\nZbjmyF9BRmOiBdp5Jde3QswKjicjMccB299I2n5UgQKdU8nPAY69Qiv5/w==\n-----END PUBLIC KEY-----",
    "address": "0x2B5AD5c4795c026514f8317c7a215E218DcCD6cF"
  }],
  "authentication": [
    "did:cnbn:123456789abcdefghi#keys-1"
  ],
  "controller": ["did:cnbn:123456789abcdefghi", "did:cnbn:admin"],
  "proof": [{
    "type": "SM2Signature",
    "created": "2022-01-01T00:00:00Z",
    "proofPurpose": "assertionMethod",
    "verificationMethod": "did:cnbn:123456789abcdefghi#keys-1",
    "proofValue": "eyJhbGciOiJFUzI1NksiLCJraWQiOiJkaWQ6ZXhhbXBsZToxMjM0NTY3ODlhYmNkZWZnaGlfa2V5LTEiLCJ0eXAiOiJKV1MifQ..Q9JYDNOU0oyJkXW5NcC1hR3U4SHN6U1RiY3pvYkUzam5vY3VtY2tjZERxY3dLd1Z0a1d0Z2pUa0dWY3A0bFZJZw"
  }]
}

DID应用层 - VC

VC(Verifiable Claims 或 Verifiable Credentials)可验证声明。字面意思理解就是,这个声明是可以验证的具有一定证明效力的。 例如:去银行办信用卡,需要的工作收入证明,由工作单位开具证明,具有证明你收入水平的一份证明文件。

从上述的例子中,就可以看出这里会有3种角色: 你、工作单位 和 银行。

DID中也同样会有这三种角色:

  • 颁发者(Issuer): 证书的颁发机构。类似于上述的工作单位,具有开具收入证明的权利。
  • 持有者(Holder): 证书的持有人。上述示例中的 我,需要用到证明的使用者。
  • 验证者(Verifier):使用证明来验证效力的机构。上述示例中的银行,需要通过收入证明来验证我是否有信用卡偿还能力。

与上述示例一样的是,DID还需要一个标识符注册机构(Identifier Registry)维护DIDs的数据库:如某条区块链、分布式账本,通常情况下也是DID里的example字段

image

VC结构

在VC的内部的结构,通常包括三个部分:

  • VC元数据(Credential Metadata),主要就是发行人、发行日期、声明的类型等信息。
  • 声明(Claims),一个或者多个关于主体的说明。比如身份证作为公安机关颁发给我的VC,在声明中会包含:姓名、性别、出生日期、民族、住址等信息。
  • 证明(Proofs),通常就是颁发者的数字签名,保证了本VC能够被验证,防止VC内容被篡改以及验证VC的颁发者。

image

官方给出的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"
  }
}

DID应用层 - VP

可验证表达(Verifiable presentation简称VP)是VC持有者向验证者表名自己身份的数据。

一般情况下,我们直接出示VC全文即可。 但是大多数场景下,我们并不希望把VC中的所有数据信息都披露给验证方。例如:社区活动需要年满18岁,我们只希望提供VC中的生日属性; 交友活动需要提供性别和年级,那我们只希望提供VC中的性别和生日属性即可。

因此,VP就可以实现选择性身份信息验证。

VP结构

在VP的内部的结构,通常包括三个部分:

  • VP元数据(Presentation Metadata):包含了版本和本JSON对象的类型等信息
  • VC列表(Verifiable Credentials):VC内容列表,如果是选择性披露或者隐私保护的情况,可能包含部分或者不包含任何VC。
  • 证明(Proofs):持有者对本VP的签名信息

did_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"
  }
}

VP验证

VP的选择性披露,一般来说基于默克尔树(Merkle Tree)特性来实现。

在区块链系统中,使用默克尔树的目的是为了能够将一个区块中的所有交易形成一个短小的指纹(默克尔根,哈希值),并将这个指纹放到区块头,任何对交易的篡改都会导致指纹变化。

而VP中使用默克尔树是希望能够进行快速的简单支付验证(SPV)。

我们举个例子:来验证一下是否包含真正的生日数据,我们需要提供4个数据信息:

  1. 原始生日数据: 生日
  2. 原始生日数据索引的位置: 1(数据索引从0开始)
  3. 验证的Hash路径:[Hash1,hash34]
  4. 默克尔根:MerkleRoot

did_merkle

默克尔树验证顺序

  1. 计算生日的Hash值:Hash2
  2. 根据验证Hash路径,将Hash1和Hash2再次计算Hash12
  3. 再根据验证Hash路径,将Hash12和Hash34计算出HashRoot
  4. 比对计算出的HashRoot是否和MerkleRoot一致

上述流程,就是通过默克尔树来验证,局部信息是否正确的简单流程。

VP验证顺序

  1. 根据DID从标识符注册机构(Identifier Registry)获取DID文档,获得公钥验证VP签名合法有效
  2. 根据VC中的颁发者(issuer),从标识符注册机构(Identifier Registry)获得颁发者(issuer)的DID文档,获得公钥
  3. 根据颁发者(issuer)的公钥,验证默克尔根的签名正确
  4. 对默克尔树验证,确保披露的生日信息正确

通过上述4个步骤,验证者(Verifier)即可完成对VP的验证。

5. 参考资料

Golang实现默克尔树(merkle tree)
去中心化数字身份DID简介——三、用户属性的选择性披露

4

评论区