一个DID的例子(did:web)

W3C DID标准 是关于DID的规范,这里DID是指去中心化标识符(英文 Decentralized Identifier)。 这个标准位于自主身份社区中的底层,用来解决在去中心化/自主身份的世界,给人、机构或者物“命名”的基本问题。

一个DID的形式如下:

did:<METHOD>:<ID>

其中,<METHOD>是指用什么方法来解析(resolve)这个标识符,而<ID>的规范由<METHOD>来定义。我这里给一个今天做出来的例子:

did:web:blog.xiaofuxing.name

这个DID,是我刚刚生成的一个did,中间的 :web: 表示我用 DID WEB 方法。DID WEB方法是一个可以从Web2 的世界创建或者链接一个DID的方法,与任何区块链无关。只要你控制或授权控制一个域名下的web服务点 ,就可给自己创造一个类似的DID。在上面的例子中,因为我控制了 blog.xiaofuxing.name的域名,所以我就能创造一个那样的DID。

本文的主要内容是关于技术的,回答了两个问题:

  • 如何解析这个DID?
  • 如何创建这个DID?

在回答这两个技术问题之前,我得说说非技术的问题,好让非技术读者理解这么做的意义。 解析的目的,在于作为博客读者的你,可以获得关于这个DID的信息,尤其是公钥,为咱们(我和你)可以安全的点对点通信创造了一个可能的安全条件。 当你(DID的通信对端)解析了这个DID的文档后,实际上就知道了我(DID的创建者,或者说控制者)的相关信息,尤其是公钥信息,如果我也知道你的DID并 解析到你的DID文档,那么咱俩就有可能安全通信,而咱俩的通信信息(在理想情况下)不会被任何第3方截获。当然,DID Web并不是一个特别安全的DID方法, 尤其是它的安全性建立在目前的PKI ( DNS/CA/X509/TLS 这些技术)之上的,而自主身份设计的一大目标是替代目前的PKI。因此当目前PKI的弱点被攻击, 例如一个黑客通过域名劫持就很可能让你解析到一个虚假的DID文档,这时候你所理解的“咱俩的通信”就显然是不安全的。不过,作为概念演示和过渡方案, DID Web方法仍然有意义。

解析方法

利用一个 DID web resolver工具,解析即可。例如如下代码

const { Resolver } = require( 'did-resolver' )
const { getResolver } = require( 'web-did-resolver' )

const webResolver = getResolver()

const didResolver = new Resolver({
   ...webResolver
   //...you can flatten multiple resolver methods into the Resolver
})

didResolver.resolve('did:web:blog.xiaofuxing.name').then(doc => console.log(JSON.stringify(doc,null,2)))

创建方法

我参考了 这篇文章

第0步,准备一个开发环境:一个linux发行版。

第1步, 安装rust

第2步, 安装didkit

第3步, 生成公私钥对,命令行

$ ./target/debug/didkit key generate ed25519 > firstkey.jwk

第4步,生成一个 did:key 标识符,命令行

$ ./target/debug/didkit key-to-did  --key-path firstkey.jwk

得到输出:

did:key:z6MkuMDR7gtqicfb9eVZWrm2ou7h5bpf8tnn4hu3fYY7bBsB

第5步,解析 did:key 标识符,得到一个 did:key 的文档(did document), 命令行:

$ ./target/debug/didkit did-resolve did:key:z6MkuMDR7gtqicfb9eVZWrm2ou7h5bpf8tnn4hu3fYY7bBsB > keydid.json

第6步,修改为目标的did:web 的文档,命令行:

$ cp keydid.json webdid.json
$ sed -i -e "s/:key:/:web:/g" webdid.json
$ sed -i -e "s/z6MkuMDR7gtqicfb9eVZWrm2ou7h5bpf8tnn4hu3fYY7bBsB/blog.xiaofuxing.name/g" webdid.json
$ sed -i -e "s/#blog.xiaofuxing.name/#firstkey/g" webdid.json

第7步,将得到的 webdid.json 放到博客目录下,使得可以从这个URL: https://blog.xiaofuxing.name/.well-known/did.json 可以下载这个文件。