学习笔记:DID 是从 ID 到公钥的解析服务
作者:Jian Shuo Wang 发表于:2022-08-30 19:25 · 未分类
我做了一些 DID 的研究,得出了一个结论:DID 是一个从 ID 解析成公钥的机制 ①。
DID 是一些字母和数字的组合,用来告诉大家你的名字,以及给定一种方法,从这个名字找到你的公钥。
和它很类似的是域名体系(DNS)。DNS 大家已经很熟悉了。比如域名 wangjianshuo.com 服务器的 IP 地址是什么?你可以想象有一张全球的大表(在管理层面是中心化的,在实现层面是去中心化的),第一列是域名,第二列是 IP 地址。一查,wangjianshuo.com 对应的是:72.47.228.92 。
同样的,对于一个 DID,它提供的也是一个解析服务,但解析的不是 IP 地址,而是这个人或个体的公钥。公钥能做的事情太多了。简单地来说,我拿这个数可以加密任何东西,只有它对应的私钥才能解开。或者我可以用它尝试解开私钥加密的文件,如果能解开就说明的确是这个人加密的。私钥当然要 DID 的拥有者自己保存,而 DID 就是一个从 ID 找到公钥的这个过程。(公钥私钥这个概念可以看这里:钱包,私钥,地址等 - 区块链技术学习笔记,用吃奶的劲试着解释加密算法的数学原理)。
W3C 其实在 DNS 的设计中已经轻车熟路了, 当然可以设计出来一个类似 DNS 的系统,我发一个 ID 到一个服务器去,然后服务器告诉我这个 ID 的公钥,就跟从域名解析出来 ID 地址那样。不过 W3C 也与时俱进了,不搞这样的中心登记的数据库了,开始用去中心化的方法了。
如果不设置一个登记中心,如何实现?我看到的方法,倒是让我惊掉了下巴。did 给出了非常多解析的方法。对于这些方法 W3C 也不管了,交给大家去定义。我随便研究了里面比较有代表性的 did🔑 和 did:web: 方法。
did:key
did🔑xxxxxxxxx 是一个合法的 did 标识符。冒号分割的第二段,就指定了 用 key 的方法解析。从 ID 解析成公钥,大家能想到的最简单直接的,就是把公钥直接写在 ID 里面不就好了?所以,就有了 key 这种解析方式。比如:
did🔑z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK
这个就是简单地把一个 ED25519(某种加密方法,大家忽略这个名字就好)的公钥,加上这个公钥的类型放在一起编码成一堆二进制数字。因为二进制数字无法传播,需要把它们用人类可以看得懂的字母和数字编码,所以再用 base58-btc 转码成如上的字符串,再加上 base58-btc 的转码类型的标记,最终就形成了如上的这个样子。
如何从这个字符串解析出拥有者的公钥?太简单了,对于这个数字直接an’z按照编码的规则解码就可以了。这期间不需要查询任何系统,或者和任何系统交互,公钥是直接写死在名字里的。
这个例子,让大家理解最简单的解析是什么样子的。也就是还可以直接写死在 did 里面,不需要借助任何系统。
did:web
再举个例子:did:web:wangjainshuo.com 也是一个合法的 DID。怎么知道这个 DID 登记的公钥呢?简单。did:web: 这个 did-method 居然就是写死了,直接拼出来一个地址:https://wangjainshuo.com/.well-known/did.json
如果是类似于 did:web:wangjianshuo.com:archives 这样的, 直接把: 替换成 /,然后后面加 did.json:
https://wangjianshuo.com/archives/did.json
我们搞 web 的都知道 index.htm 是一个约定俗成的文档位置。如果网址只给出了一个文件夹地址,而没有给出文件,服务器会寻找,如果有 index.htm 这样的缺省文件,就会返回。did:web: 方法用类似的方法,直接查找 did.json 这样的缺省文件。如果有的话,直接返回就好。而这个 did.json 文件里面就写好了这个 ID 对应的公钥。
一个典型的 did.json 文件里面的内容是这个样子的:
{ “@context”: [ “https://www.w3.org/ns/did/v1”, “https://w3id.org/security/suites/ed25519-2020/v1” ] “id”: “did:example:123456789abcdefghi”, “authentication”: [{ // used to authenticate as did:…fghi “id”: “did:example:123456789abcdefghi#keys-1”, “type”: “Ed25519VerificationKey2020”, “controller”: “did:example:123456789abcdefghi”, “publicKeyMultibase”: “zH3C2AVvLMv6gmMNam3uVAjZpfkcJCwDwnZn6z3wXmqPV” }]}
看到 publicKeyMultiase 了吗?那后面就是编码过的公钥。
其他
除了这两个最简单的,还有 100 多个实验性质的 DID 方法,比如 ethr 就是负责从以太坊公钥通过以太坊的 API 查询到对应的公钥,还有 btcr 在比特币网络上做相同的事情等等。
总之,如果把 DID 简单地看做从一个 DID 解析出来它的公钥的机制,就应该是 DID 入门的第一步。只要公钥可以从 DID 里面解析出来,如果谁拥有私钥,当然可以轻松的证明,这个 DID 是他拥有的,而这个过程不需要去问任何第三方就可以完成。
在此之上,可以构建很多有趣的应用,比如可验证凭证(Verifiable Credential),就是任何一个 DID 的拥有者都可以签名一些文档描述另外一个 DID。最终实现所有现实社会需要盖章和签名的事情都用这套体系来搞定。
注①:我这个绝对属于民科级别的理解,似乎还没有看到谁同意这个观点,所以使用请谨慎。