首页 > 其他分享 >基于DID实现第三方应用的分布式身份登录

基于DID实现第三方应用的分布式身份登录

时间:2023-12-28 18:34:11浏览次数:27  
标签:VC 登录 DID 用户 钱包 应用 分布式

在我们掌握了DID的基础知识(还没有掌握DID基础知识?请先阅读我之前的关于DID的文章),构建DID平台的时候,DID的常见应用就是基于DID实现第三方平台的登录。接下来,我们假设已经构建了一个基础的DID平台,用长安链实现了DID文档的链上管理,并提供了DID钱包托管用户的公私钥和VC证书,建设全新的第三方系统实现DID登录。

前置条件

我们已经建设了一个DID分布式身份的应用,为每个用户颁发了DID,对应的DID文档也上到了一条区块链(比如长安链)上。每个用户有自己的DID钱包(可以是浏览器插件钱包,也可以是手机APP钱包),在DID钱包中保存了用户的公私钥、DID和各种颁发的证书VC信息。

场景1:DID登录

需求

现在我们要建一个新的服务系统,并希望使用DID进行登录,类似于网上的使用Google账号登录或者微信扫码登录这样的OAuth登录,只要是在长安链上有颁发了身份的用户,都可以通过其DID钱包进行登录。

技术实现

以下是一个简化版的DID钱包登录流程,并以浏览器插件钱包为例:

1.用户在第三方应用上发起登录请求。
2.第三方应用后端生成一个随机数(nonce)并发送给钱包浏览器插件。
3.钱包浏览器插件使用用户的DID私钥对随机数进行签名,并将签名和用户的DID一起发送给第三方应用后端。
4.第三方应用后端将签名和DID发送给DID合约进行验证。
5.DID合约查询区块链上的DID文档,获取DID的公钥,并使用公钥验证签名。如果验证成功,返回用户的身份信息给第三方应用后端。
6.第三方应用后端根据返回的身份信息,完成用户的登录或注册操作,并返回登录结果给用户。

以下是对应的时序图:

sequenceDiagram 用户->>应用前端: 发起登录请求 应用前端->>应用后端: 请求随机数(nonce) 应用后端->>应用前端: 返回随机数(nonce) 应用前端->>钱包插件: 发送随机数(nonce) 用户->>钱包插件: 用DID私钥签名nonce 钱包插件->>应用前端: 发送签名和用户DID 应用前端->>应用后端: 请求验证签名和用户DID 应用后端->>DID合约: 发送签名和用户DID进行验证 DID合约->>应用后端: 查询链上DID文档,返回验证结果和身份信息 应用后端->>应用前端: 返回验证结果和身份信息 应用前端->>用户: 返回登录结果

场景2. 基于VC/VP的DID登录

需求

有些应用并不是任何获得了DID身份的用户就能够登录的,比给企业T做一个员工福利网站,只有企业T的员工才能正常登录。所以我们需要基于VC(可验证凭证)和VP(可验证表示)的DID登录。

技术实现

前置条件是企业T已经作为颁证机构,给自己企业的员工都颁发了员工卡VC,员工在登录网站的时候,需要出示该员工卡VC,验证VC通过才能正常登录。流程如下:

  1. 用户在第三方应用上发起登录请求。
  2. 第三方应用后端生成一个随机数(nonce)和要求的VC类型,发送给钱包浏览器插件。
  3. 钱包浏览器插件根据要求的VC类型,从用户的DID钱包中选择相应的VC,并生成一个VP(包含DID、VC和nonce)。
  4. 用户使用DID私钥对VP进行签名,并将签名的VP发送给第三方应用后端。
  5. 第三方应用后端将签名的VP发送给DID合约,通过查询合约的方式进行验证。
  6. DID合约首先验证VP的签名。如果签名验证通过,继续检查VP中的VC。这包括验证VC的签名、检查VC的颁发者和过期时间等。
  7. 如果VP和VC的验证都成功,DID合约将返回用户的身份信息给第三方应用后端。
  8. 第三方应用后端根据返回的身份信息,完成用户的登录或注册操作,并返回登录结果给用户。
sequenceDiagram 用户->>应用前端: 发起登录请求 应用前端->>应用后端: 请求随机数(nonce)和VC类型 应用后端->>应用前端: 返回随机数(nonce)和VC类型 应用前端->>钱包插件: 发送随机数(nonce)和VC类型 钱包插件->>用户: 选择相应的VC 用户->>钱包插件: 用DID私钥签名VP 钱包插件->>应用前端: 发送签名的VP 应用前端->>应用后端: 请求验证VP和VC 应用后端->>DID合约: 发送VP和VC进行验证 DID合约->>应用后端: 返回验证结果和身份信息 应用后端->>应用前端: 返回验证结果和身份信息 应用前端->>用户: 返回登录结果

总结

基于DID进行登录相对于互联网的OAuth登录有以下优势:

  1. 更高的安全性:在DID登录中,用户的私钥始终保存在钱包中,不会泄露给其他参与方,减少了中心化存储的风险。而在OAuth登录中,用户的访问令牌和刷新令牌需要在第三方应用和授权服务器之间传递,增加了被攻击者截获的风险。
  2. 更好的隐私保护:DID登录允许用户选择性地披露自己的身份信息,甚至是基于零知识证明保护隐私,而不是像OAuth登录那样,将用户的信息都暴露给第三方应用。
  3. 去中心化:DID是基于区块链技术的去中心化身份解决方案,不依赖于任何中心化的身份提供商。这意味着用户可以拥有并控制自己的数字身份,而无需依赖于第三方服务。而OAuth登录依赖于授权服务器,如Google或Facebook,这些服务可能会受到审查、关闭或遭受攻击。
  4. 更简洁的用户体验:DID登录简化了身份验证过程,用户只需要使用钱包生成、管理DID和签名,无需记住多个用户名和密码。而在OAuth登录中,用户需要在不同的授权服务器上创建和管理账户,可能导致多个用户名和密码的混淆。
  5. 更易于实现自主身份:通过使用DID,用户可以建立自主身份(Self-Sovereign Identity,SSI),这是一种用户拥有并控制自己身份信息的模型。在这种模型中,用户可以将身份信息存储在自己控制的设备上,而不是依赖于中心化的身份提供商。这有助于实现更高程度的隐私保护和数据所有权。而在OAuth登录中,用户的身份信息通常由授权服务器管理,用户无法完全控制自己的数据。

标签:VC,登录,DID,用户,钱包,应用,分布式
From: https://www.cnblogs.com/studyzy/p/17933314.html

相关文章

  • 分布式I/O在汽车制造领域的应用
    随着制造行业的不断发展和技术进步,生产线的复杂性和智能化需求越来越高。分布式I/O技术,作为现代工业自动化的重要组成部分,正逐渐在制造行业中展现出其独特的优势和应用价值。在制造行业,传统集中式控制系统存在着信号传输延迟、布线复杂、扩展性差等问题。随着生产线规模的扩大和智......
  • 分布式I/O助力医药行业实现高效生产控制
    分布式I/O在医药行业的应用正逐渐受到关注。这种技术为医药制造、包装和检验等环节提供了高效、精确的控制和监测手段,从而确保了产品质量和生产安全。分布式I/O能够提高医药生产的效率。在医药制造过程中,需要严格控制各种工艺参数,如温度、压力、流量和浓度等。分布式I/O可以实时采......
  • 用户登录后IP记录日志的六种实现方案探讨
    之前大群里有小伙伴在讨论用户IP日志记录的一些方案,也有小伙伴在做这个需求,私底下跟我咨询过,所以在此特地汇总梳理一下。###方案1在登录业务中直接记录用户每次登录的IP日志,如下图所示: 用户请求登录的Controller,原先用户直接调用登录的service,这里假设用户登录校验都没问题,......
  • 分布式IO如何提升工业自动化生产效率
    随着工业自动化技术的不断发展,分布式IO在工业自动化领域的应用越来越广泛。作为一种先进的控制技术,分布式IO能够实现设备的分布式控制和监测,提高生产效率、降低能耗和减少故障率。分布式IO可以提高工业自动化生产的效率。在传统的工业自动化生产中,设备的控制和监测通常采用集中式控......
  • 测试开发 | 人工智能与分布式计算:驱动智能时代的强力结合
    随着人工智能的迅猛发展,处理庞大数据集的需求不断增长。在这一背景下,分布式计算成为推动人工智能创新的关键技术之一。本文将探讨人工智能与分布式计算的密切关系,以及它们如何协同工作,推动智能时代的到来。1.引言人工智能的广泛应用使得数据处理的规模不断扩大,传统的单机计算已经......
  • 如何用Redis构建分布式锁系统?
       对常见的加锁场景的归纳,只涉及到了JVM的api锁和redis的分布式锁。其实也可以用zookeeper或者mysql,其他的以后在分享吧,其实最完美的还是老外那套saga状态机解决分布式事务比较完美,缺点就是难度很大要用到领域驱动的思想,国内普遍用的贫血模型,切换到DDD还是需要些时间研究......
  • 【flink番外篇】4、flink的sink(内置、mysql、kafka、redis、clickhouse、分布式缓存、
    文章目录Flink系列文章一、maven依赖二、广播变量BroadcastVariables示例1、介绍2、广播变量示例3、验证三、BroadcastState与BroadcastVariable区别本文简单的介绍了flink中关于广播变量的简单使用示例。一、maven依赖为避免篇幅过长,所有基础依赖均在第一篇文章中列出,具......
  • 【flink番外篇】4、flink的sink(内置、mysql、kafka、redis、clickhouse、分布式缓存、
    文章目录Flink系列文章一、maven依赖二、Flinksink介绍三、sink到文件、console示例1、console输出2、sink到文件1)、sinktxt文件到hdfs上2)、sinkcsv文件到本地3)、sinktext文件到hdfs上(writeUsingOutputFormat)四、sink到socket示例(writeToSocket)五、Jdbc/mysql示例1、maven依......
  • 【flink番外篇】4、flink的sink(内置、mysql、kafka、redis、clickhouse、分布式缓存、
    文章目录Flink系列文章一、maven依赖二、分布式缓存(DistributedCache)示例1、介绍2、maven依赖3、实现4、验证1)、验证步骤2)、验证本文介绍了flink关于分布式缓存的使用示例,比较简单。本文除了maven依赖外,没有其他依赖。本示例需要hadoop环境可用。一、maven依赖为避免篇幅过长,所......
  • 【flink番外篇】4、flink的sink(内置、mysql、kafka、redis、clickhouse、分布式缓存、
    文章目录Flink系列文章一、maven依赖二、sink到ClickHouse示例1、介绍2、maven依赖3、创建clickhouse表4、验证clickhouseweb页面是否正常5、实现1)、userbean2)、sink实现6、验证1)、nc输入2)、启动应用程序3)、观察应用程序控制台输出4)、查看clickhouse表中的数据本文介绍了nc作......