去中心化的身份标识(DID)

去中心化的身份标识(DID)

前几日(2022年7月19日),w3c发布了去中心化身份标识(DID)1.0版的标准,意味着这个标准已经成熟可落地。

DID全称叫去中心化的身份标识,可以认为是类似于区块链网络帐户地址或者能唯一确定一个用户的身份(例如每一笔比特币的交易记录都可以确认到发起人的帐户公钥,也就能知道地址)。核心还是基于密码学上的非对称加解密算法,生成一对私钥和公钥的密码对,身份持有者私密的持有密钥,而需要用于身份标识验证的时候,验证方可以拿到公钥进行验证。 在之前的区块链钱包文章我们说过,椭圆曲线算法基于非对称的加密方式,提供两个方向的用途:1)公钥加密私钥解密,适用于加密通信;2)私钥签名公钥认证,适用于数据验证。理论上非对称加密的身份认证不基于区块链网络或者分布式账本技术(DLT)也能运转,但区块链或者分布式账本的存在,让DID才真正实现去中心化的可广泛使用的用途,下面我们来说说不用区块链(分布式账本)的情况下,DID存在什么问题、区块链是解决这个问题的。

公钥分发难题

我们知道,基于非对称加密算法可以产生私钥-公钥对。一般来说,私钥本身无法单独运转,需要把公钥交给对方才能发挥作用。那么当一对密钥对生成之后,持有人第一件事就是要把公钥交给他想进行合作的人。然而,这个世界大多数的网络渠道都是被核心几个大公司控制的,从应用端到云端到网络端,大多如此。假如A生成了密钥对(私钥priv,公钥pubk),接下来他选了渠道1(假设用LineApp)把pubk发送给合作者B。大致的流程是这样的:公钥先经过手机终端的Line,通过网络,发送到 Line的服务器端,Line的服务器端再通过网络,把公钥发送到B的手机终端上的Line,然后B再从Line上下载公钥保存起来,为后续合作做好准备 (这里不深究Line服务器怎么传递这个公钥的,抽象一下就好)。正常情况下,这都没啥问题。但是,万一Line被黑客劫持了,黑客是可以作恶的。比如黑客自己生成公私钥对(priv’和pubk’),在传播过程中把你的公钥替换成他的公钥pubk`,后续就有机会在中间做信息的窃取(也就是所谓的中间人攻击)。这种情况要解决也不难,公钥传播渠道和通信渠道分离就好了,渠道越分散越好,让黑客的攻击成本剧增。当然也可以通过打电话约定一个澡堂,你在澡堂把公钥交给对方,以后通信用这个公钥做加密。但这仅仅解决了公钥分发的问题,如果对方持有的公钥,一不小心泄露了,导致第三方C也拥有该公钥,那么下次有个人用这个公钥加密信息发给你,你是无法确认是不是B给你发的信息。也就是B也要生成个公私钥对,把公钥给你,别人给你发信息的时候,你要先验证一下对方是不是真的B给你发的信息,再用私钥解密。 好了,现实生活中,用非网络传输的方法,还是能解决这个问题的,但是,这不是很低效吗?那么区块链(或者分布式账本)怎么解决这个问题的?

区块链可以作为安全的公钥分发渠道
区块链具有天然的数据不可篡改性(从经济角度看的),所以天然适合做一些存证类的服务,比如IP知识产权的存证。而公钥分发本身,也是区块链网络的一大特色。我们知道在现有的加密货币区块链(比如比特币)上,每笔交易都账户的参与,每笔交易可以通过简单的计算验证其有效性,就是因为在区块链上,帐户地址本身就是公钥的哈希,而公钥本身在交易里也是可以获取的。一笔交易在提交之前,会通过utxo的拥有者使用私钥签名,以此来证明这些交易确实是这个帐户本身发起的。而交易一旦提交到挖矿节点上,节点上就可以通过该帐户的公钥来验证签名的有效性,从而确定一笔交易的有效性(无效就直接丢弃)。鉴于此,区块链(特指去中心化的公链)完全可以作为公钥的分发渠道,而且这个渠道分发的信息是安全可信的。一种方式是和加密货币本身共用一套密钥机制,那么只要帐户上曾经有过交易,就能找到公钥以及公钥的来源地址;另一种是通过发布交易的方式,在交易里增加备注内容,该内容可以发布其他使用方的公钥的内容以及公钥的有效期,实现公钥的生命周期管理(这种场景下,使用方的椭圆曲线可以选择和公链不一样的,现在已被证明是安全的椭圆曲线还挺多的,各个应用可以选择自己的曲线来和公链的曲线做区分)。在DID技术标准的定义中,有一块就是关于DID解析器的。DID解析器就是要解析一个DID,获取他对应的did文档。根据不同的DID方法(method)获取文档的方式不尽相同。其中基于分布式账本的,大多数还是通过区块链的方式来获取,通过区块链的交易数据或者地址信息都能解析到对应的内容。(像比特币区块链的交易备注塞不下这么大一个文档怎么办?可以放文档的hash值,然后通过hash link的方式从第三方找到该文档。当然比特币并不是通过这种方式,比特币的did是关联到交易的,他通过从交易中解析公钥信息,认证方式则属于业界公开的共识,所以他的DID文档是根据一些数据推导出来的,而不是直接的静态文档。)

用DID实现登陆的一般数据和验证流程
从目前现有大多数应用来看,基本上都会涉及从前端到后端的数据流转和校验过程。其中前端可以通过借助一些现有app(例如一些加密货币(软硬件)钱包,如metamask、Trezor等等)实现快捷获取账户名称和签名认证能力,后端则通过解析did对应的did document,然后从document中获取公钥和认证方式,往前端发送challenge,前端通过钱包的私钥对challenge进行签名后提交给后端,后端通过did document里定义的公钥进行verify,依次判断是否成功。 具体可以看下图

DID文档解析流程

1)用户在app侧发起登陆,会呼起钱包等密码保存器
2)密码保存器列出已存储的账号,供用户选择
3)用户选择一个did,发给后端
4)后端通过DID解析器解析DID文档
5)DID解析器返回DID文档(文档中包含详细的验证方式、公钥等信息),当然这里可以根据不同did 方法的属性,做一下缓存机制
6)后端生成一个挑战给用户前端(一般来说挑战都是随机的,就跟我们的一次性密码或者验证码类似,除了随机,还需要有时间戳,防止重放攻击)
7)前端拿到挑战之后,发给密码保存器进行签名
8)密码保存器返回签名给前端
9)前端把签名和挑战信息都发还给后端
10)后端通过DID文档里定义的方式进行签名校验,并把结果返回给前端结束流程。

DID存在的行业机会
1)天然的匿名性,因为DID认证不需要你的手机号、邮箱等等 (匿名性不代表对抗审查,可能有些情况下需要监管当局认证DID,匿名对抗的是中间平台或者因平台泄露数据导致的隐私泄露)
2)无密码化,减少密码泄露风险(其实是有密码,只不过钱包帮你搞定了密码管理的事情,你自己千万不能记住密码)
3)以个人为中心的浏览器可能是一波机会。(目前的浏览器是以服务器为中心的,而DID文档中,是可以定义service的,也就是完全可以从个人的角度出发来使用他每个did下的服务。把DID比作个人域名,那么DID解析过程就是DNS解析过程)
4)和加密货币交易无缝集成
5)可以做加密通信(用户匿名性是针对监管者的,和对方聊天还是知根知底比较好)
6)和物联网终端结合(但这类的不建议走公链,私链也能满足需求),升级物联网终端的安全性。
7)证书颁发关联(比如学校把你的毕业证书放到链上声明你的DID,如果企业要确认你的证书的时候不需要找学校,从区块链就能确认)
8)医疗数据隐私(医疗数据不关联到你个人身份,而关联到did上,起到对个人隐私的保护)
9)居民身份证ID、公共机构身份凭证

还有很多的应用案例,可以从这个链接里找到。

DID应用场景

DID目前存在一些问题
1)密码保存器涉及安全策略比较多,目前还没有特别流行的爆款应用产生。传统的USBKEY、加密货币的硬件钱包在使用上还是体验上的问题的,当然安全问题和用户体验问题的权衡是个永恒的话题。
2)有很多帐户根据公私钥来管理,私钥变化会导致公钥变化,从而导致DID可能发生变化,也就意味着DID和私钥是一体的,当私钥变更后,就存在原来的DID帐户归属问题,如果把旧帐户的所有权变更为新帐户的所有权是一个挑战。(当然这块目前也有一些解决方案。)
3)私钥一旦确立就无法变更,DID的控制人一般也是个体,没有一个中间节点来保障你的DID,也就是你私钥丢失或者被盗,那么你就完全丧失了对DID帐户的管辖权,而且永远无法通过类似「找回密码」、「找回帐户」的方式来找回。如果是政府、公共部门颁布的DID还好说,理论上还是有一个中间人背书;如果用于各种匿名登陆系统,这就没法子做了。
4)签名操作的安全问题:签名是个很高权限的操作,如果一些应用或服务恶意呼起签名,而用户端无法识别签名内容的必要性,可能会导致资产被盗取。例如基于比特币的签名,如果用的签名算法和比特币交易签名算法一致,恶意的服务方构建一些转账的utxo给用户去签名,如果用户签名了,可能就导致自己帐户被盗取了。这类安全意思需要长期的教育和业界共识防范。千万注意,非必要不签名。

1 条评论

Protected by WP Anti Spam

昵称

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  1. 路人甲

    DID有点意思