Web3.0 是去中心化的互联网,它的身份系统也必须是去中心的。那么什么是去中心化的身份?为啥 Web3.0 的身份系统必须是去中心化的?去中心化数字身份的工作原理又是什么呢?本节我们会以 W3C 的 DID 标准为例来介绍去中心化身份。但是实际中去中心化的身份还有其他的解决方案,例如 Handshake ,我们会在后续章节中介绍到。
从中心化身份到去中心化身份
深入技术细节之前,咱们需要先来把”身份“这个概念定义清楚。看看“中心化身份”和”去中心化身份“的区别,再来看看”身份“和“身份标识符”的区别。
先来给”身份“一个明确的定义。Web3.0 语境一下,一个人的”身份“( identity ,简称 ID )指的是所有跟这个人紧密相关的数据,例如这个人说过什么,做过什么等等所有这些在互联网上留下的数字痕迹都可以归为这个人的”身份“数据。所以说一个人的”身份“可能是一个很大的数据,例如几百 G 甚至更多。但是有时候我们说,我在某某网站的 ID 是 happypeter 。那么这里的 happypeter
并不是”身份“,而是”身份标识“( Identifier )。身份,可以认为是数字空间中的一个“虚拟的我”,身份标识,可以认为是”虚拟的我“的名字,通常是比较简短的一个字符串。
传统的 ID 系统都是中心化的,或者说是基于可信第三方的。我的淘宝 ID 是属于淘宝所有的,其中包含我的 ID 标识,也就是用户名,也包含其他的我的个人数据。所有的数据都是保存在人家公司的数据库中,我们可以把这种身份叫做”平台数据库身份“。这个身份是基于信任的,平台可以证明:第一,我是我,也就是我的身份标识是有效的,是和其他身份数据绑定的,第二,身份数据是有效的,证明我在什么时间,什么地点,干了什么事,比如对应淘宝的情况,淘宝作为可信第三方,可以证明,我在什么时间,在哪个店铺中,评论了什么内容。
中心化的基于可信第三方的身份系统不局限于”平台数据库身份“这一种,还包括”CA 身份“和"DNS 身份”等。“平台数据库身份”是在一个 App 内使用的身份。如果涉及到两个陌生服务器之间进行加密通信,就需要证书来证明通信双方的身份,这时候的可信第三方是发证机构(简称 CA )。此外,DNS 系统也是一个身份系统,基于 ICANN 公司,这个可信第三方来运行。另外,我们使用的身份证,是基于对政府信任的。总之,传统的身份系统基本都是中心化的,基于某个可信第三方的。
身份当然也可以去中心化条件下去确认。例如在一个原始村落里面,我之所以是我,不需要任何可信第三方权威证明,我是我,因为老王,老李,老赵都认识我,都可以证明我是我。PGP 软件的 Web Of Trust ,也就是“信任网络”技术,就是这种类似原始村落的去中心化的身份系统。
Web3.0 采用的基于区块链的身份系统,延续了 Web Of Trust 的思想,是去中心化的 ID 系统。去中心化的 ID 不被任何其他人拥有,用户是它唯一的主人。它是用户自己生成的,自己拥有的,标识是全球唯一且保存在区块链之上的。去中心化身份的第一个特点是可以被称为”自持有身份“,完全由用户自己持有。去中心化身份的另外一个特点是,不需要为每个 App 分别注册一个身份,而是全网使用同一个身份。
这就是中心化身份和去中心化身份的区别了。
DID 的原理
去中心化身份的基本思想已经阐述清楚了。W3C 基于这个思想,提出了一套去中心化身份的标准,名叫 DID 。DID 的全称是 Decentralized Identifier ,翻译过来是”去中心化的身份标识“。下面来聊聊 DID 的工作原理。DID 背后有一个去中心化身份基金会( DIF )来推进基础设施建设和标准制定。DIF 的成员有微软,IBM ,Mastercard ,微众银行,以及一些区块链项目,例如以太坊,比原链和 Blockstack 等。
下面是一个真正的 DID 的例子:
did:example:123456789abcdefghi
冒号隔开成了三部分,最后一部分是一个随机字符串,用来在全球独一无二的定位这个 DID 。example
一项要替换为实际使用的 DID 方法,可以在 DID Method Registry [1] 页面上找到可能的选项,每一项都会基于一条链或一个项目,可以通过这里看到都有哪些项目正在开发 DID 。这里可以看到,有些项目是直接把 DID 写到比特币区块链上的。
实际中被写到区块链上的是一个 JSON ,里面除了 DID 号码之外有很多项内容:
{
"@context": "https://www.w3.org/ns/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 的所有人了。
先来看看作为 ID 标识,所要满足的基本条件。第一,要可以供别人查看,同时防篡改。例如身份证是我们日常使用的身份标识,是能给几乎任何人展示的,同时不能被篡改的,因为伪造身份证是有难度的,DID 保存到区块链这样的一个公共的存储媒介上,这一点是满足的。第二,要可以验证拥有人。身份证上印着我们的照片,年龄等跟肉身相关的信息,所以看到的人对比一下,就能验证这个是不是我的身份证了。DID 采用私钥签名来进行证明。
还有三点内容需要补充:第一,ID 的标识符写到了链上,那么主体的 ID 数据保存到哪里呢?答案是在链下,由用户自己加密后保存。第二,比特币的账户是不是 DID 呢?不是,但是比特币账户跟 DID 有不少相似点,首先都是注册在公链上,都是有公钥的,其次都可以用私钥来证明拥有者身份,进行各种操作。第三,DID 本身不绑定肉身,这有其合理性,联系之前我们介绍过的独立数字空间建设思路。通常肉身的我,就是通过我持有私钥来证明我是 DID 的主人。如果必要条件下要实现肉身和 DID 的绑定,也是可以做到的,这里不展开。
这些就是 DID 的基本原理了。
基于 DID 构建可信系统
但是 DID 使用中最关键的肯定是如何在去中心化,用户自己持有身份的前提下,依然保证实现中心化 ID 系统的各项功能。
首先是认证。中心化 ID 是通过用户名密码登录进系统,进行认证的。所谓认证,就是证明一下我是我,这样我就可以享有我的各项权利了。而在 DID 条件下,不需要进行登录,因为 App 本身没有保存用户的密码等信息,所以也无所谓登录。认证,是通过用私钥去生成数字签名来证明我是我的,大家都可以拿到我的公钥,这样验证签名,大家就可以认可我是我了,这样我执行的各项操作,例如,更新了我自己的一篇文章,也会被 App 的各个成员接受。
其次,DID 要依然保证身份数据可信。之前提过了,可信第三方能够不仅证明我是我,而且也证明我在什么时间地点干了什么事情。证明我是我,是用私钥签名,比较简单。中心化条件下,由于平台被认为是可信的,所以有淘宝在,就可以保证我的确在 3 年前的某天发出了某某评论到某个店铺内。但是如果把评论从淘宝数据库中拿出来,让用户自己存储,那么怎么才能用数学方法,在不基于信任的条件下证明这条评论的各个属性呢?这是一个非常值得思考的问题,因为如果评论不能证明自己的各个属性,那么评论也就没有意义了。关于这个问题,后续章节中会专门展开。
另外,DID 的所有人可以用自己的私钥去签署一些授权,例如承认一个文件,或者授权对方使用自己的数据,相关的技术是 Verifiable Claims 可验证声明,零知识证明等等。W3C 认为前面的 DID 是基础,而把可验证声明视作是第二层,并认为这一层才是建立 DID 整个体系的意义所在。
结论
总之,去中心化身份,就是用户真正自己持有的身份,是全网唯一的身份。去中心化身份是 Web3.0 去中心化的核心,Web3.0 是把数据产权还给个人的互联网,但是如果每个人的 ID 标识还被平台公司所控制,那么数据确权也就没有办法真的实现了。DID 是 W3C 的一套去中心化的身份标识标准,用户可以通过私钥签名的形式,向全 App 的用户证明自己是谁,享有哪些权利,已经承认了哪些事情等等。
参考
- [1] DID 项目组. DID Method Registry. https://w3c-ccg.github.io/did-method-registry/