根据签名显示验证状态

交叉签名的一般思想

交叉签名的总体思路是,无需每个设备都必须验证其他设备,人们只需验证其他人,并且您只需验证自己的每个新会话(登录)一次。为此,每个用户都有三个密钥:主密钥、自签名密钥和用户签名密钥。主密钥将对自签名密钥和用户签名密钥进行签名。然后,自签名密钥将签署您自己的设备密钥,而用户签名密钥将签署其他人的主密钥。将其拆分为三个密钥的目的是,在自签名密钥或用户签名密钥被泄露的情况下,您可以轻松交换它们,同时仍保留主密钥。由于主密钥用于签署您自己的用户签名和自签名密钥,很少使用,因此获得它的攻击面很小。或者,设备密钥本身可以签署自己的主密钥。

因此,除了其他人的设备密钥,我们还需要获取他们的交叉签名密钥。然后我们可以验证他们的签名!

交叉签名密钥

除了设备密钥之外,还引入了交叉签名密钥。它们不是通过密钥 ID 来识别,而是通过它们的公钥来识别。为了防止冲突,家庭服务器 必须确保没有用户拥有与交叉签名密钥的公钥相同的密钥 ID。这很方便,因为这意味着作为客户,我们不必关心那部分!

跟踪交叉签名密钥

如果您已经为设备密钥跟踪交叉签名密钥,则应该很简单。当用户被标记为过期时,您应该已经再次查询他们的密钥POST /_matrix/client/r0/keys/query 并相应地更新您的device_keys字典,就像以前一样。这个端点现在还应该返回用户的master_keys,self_signing_keysuser_signing_keys,因为他们正在使用交叉签名。只需在本地更新和存储此信息。这些格式与device_keys字典非常相似:

{"self_signing_keys": {"@bob:example.org": {"user_id": "@bob:example.org","usage": ["self_signing"],"keys": {"ed25519:base64+self+signing+public+key": "base64+self+signing+public+key"},"signatures": {"@bob:example.org": {"ed25519:base64+master+public+key": "signature+of+self+signing+key"}}}}
}

在这个例子中,我们有 Bob 的自签名密钥,它具有 Bob 的主密钥的签名。该usage 数组还指示键的用法,masterself_signinguser_signing。虽然对于交叉签名应该只有一项usage,但将来可能会添加一些其他可能具有多种用途的密钥。因此,这里使用数组来保证未来的发展。

和部分master_keys看起来user_signing_keys相同。

密钥验证的更改

现在,您需要对我们之前实现的密钥验证(特别是 SAS)进行轻微更改:在m.key.verification.mac回复中,将有一个 MAC 字典来验证某些密钥。这些不仅包含设备密钥,还包含由 标识的交叉签名密钥 ed25519:base64+master+public+key等。请务必将这些交叉签名密钥也标记为已验证。

根据交叉签名状态获取验证级别

如果您想知道设备密钥是否经过验证,只需递归检查密钥的所有有效签名,直到您点击已验证的密钥!这意味着给定一个签名链如下(假设你是 Alice):

Alice 的主密钥 --> Alice 的用户签名密钥 --> Bob 的主密钥 --> Bob 的自签名密钥 --> Bob 的平板电脑

并且您之前(通过例如表情符号验证)验证了 Alice(您自己的)主密钥,并且想知道 Bob 的平板电脑是否经过验证,您可以向后传播该链,前提是所有签名都是有效的,直到您点击验证的主密钥。

验证签名

它有一种方法可以轻松验证签名!如果您有密钥 A 并且想要验证密钥 B 添加的签名,则必须执行以下操作:

  1. 在密钥 Asignatures字典中,找到密钥 B 的条目并记下签名。
  2. 创建用于验证的字符串:获取密钥 A 的完整字典,剥离unsigned 和signature字典并将其转换为规范的 json。
  3. 用于olmutil.ed25519_verify(key_b_pub_key, canonical_json, signature);验证签名:注意如果无效会抛出错误,如果有效则不会。
  4. 就是这样,你已经验证了签名!

检查用户是否经过验证

要查看用户是否经过验证,只需检查他们的主密钥是否经过验证!您可以通过查找用户数组中master的交叉签名密钥来找到用户的主密钥。

如果用户已通过验证,但其所有设备均未通过验证,则最好显示警告。

需要注意的事项

  1. 永远不要相信无效的签名。就像根本没有签名一样对待它们。
  2. 存在签名循环。为您的签名循环检查添加无限递归保护。
  3. 虽然签名检查似乎并不昂贵,但在程序运行时将结果缓存在内存中可能是个好主意。
  4. 如果您在同步循环中被告知他们需要更新,请务必查询用户的密钥(如果您之前正确实施了此操作,则此处没有任何更改)。
  5. 您也可以递归直到找到自己的经过验证的主密钥,而不是递归直到找到有效密钥。然而,这在实践中不允许在设备-设备验证和交叉签名验证之间轻松迁移。因此,递归直到您点击经过验证的设备是首选。

高级的E2EE——交叉签名(区块链密码签名)(第二篇-签名状态篇)相关推荐

  1. 通付盾再获区块链密码发明专利授权,区块链密码落地显实效

    现代密码学技术发展已近百年,先进.安全.可控的密码技术是网络安全的基础,在中国大力发展数字经济的今天,更是被赋予重要的历史使命.区块链技术虽然近年来才兴起,但其作为"信任机器",与 ...

  2. 干货!区块链入门、进阶、行业专家观点!1000篇好文帮你破解区块链密码!(中篇)...

    随着区块链概念理论的不断成熟以及强劲技术的不断深耕,区块链已经成为投资圈中备受关注的热点,从区块链1.0时代落地数字货币比特币.莱特币等,打开了区块链通向新弯道的高速路口,到区块链2.0时代开始通过智 ...

  3. 区块链与传统分布式数据库之共识篇

    区块链与传统分布式数据库之共识篇 一.背景 ​ 区块链是特殊的分布式数据库,从 2008年10月31日中本聪发布比特币白皮书及2009年1月4日2时15分5秒(北京时间)比特币创世块问世以来,区块链的 ...

  4. 《区块链编程》-第二章

    文章目录 椭圆曲线 练习1 代码实现 测试 练习2 代码实现 测试 实现加法恒等元的点加法运算 代码实现 测试 练习3 代码实现 练习4 代码实现 运行结果 练习5 代码实现 运行结果 练习6 代码实 ...

  5. 区块链中的数学 - EdDSA签名机制

    Ed25519 使用了扭曲爱德华曲线,签名过程和之前介绍过的 Schnorr,secp256k1, sm2 都不一样,最大的区别在于没有使用随机数,这样产生的签名结果是确定性的,即每次对同一消息签名结 ...

  6. secp256k1 php,区块链中的数学-secp256k1 签名可锻性以及解决方案

    本文简记一下椭圆曲线算法中的另外一个小的话题:签名的可锻性. ## 写在前面 上一节说了[从凭证角度详细说明了Miller Rabin算法思路和实现](https://learnblockchain. ...

  7. 区块链开发之BTC离线签名

    引言 btc的账户系统是基于utxo模式的(utxo具体解释,大家可以自行搜索),如何获取utxo列表,可以看我前篇文章:区块链开发之获取BTC,ETH的余额,BTC的UTXO列表,ETH的nonce ...

  8. 区块链学习路径,看这一篇就够了 | FISCO BCOS

    FISCO BCOS开源社区已沉淀过百篇文章,覆盖了区块链学习各个阶段.为了方便大家对应自身学习阶段找到合适的教程,我们按照区块链学习成长路径对社区文章进行整理排序,希望沿着这份路径规划,大家都能成为 ...

  9. 粒子说区块链7:产业链分析之硬件篇

    <粒子说区块链>系列路线图 摘要 在区块链世界中,虽然相关硬件是真实存在的,遗憾的是他们的出场率有点低.但是在币圈,硬件的曝光率就很高了.在这篇文章中,我们分析一下区块链领域中相关的硬件, ...

最新文章

  1. Java并发之synchronized关键字
  2. 如何设置多个图层层叠关系_凉山车载式叠螺污泥脱水机_山东领旗环保科技
  3. C++各大著名程序库
  4. 什么是js的严格模式
  5. 前端学习(1178):vue基础
  6. ios 应用程序证书安装以及发布
  7. 修改mysql_MySQL UPDATE:修改数据(更新数据)
  8. 測试加入多级文件夹篇
  9. windows server 2003 32位支持8G内存
  10. 【从C到C++学习笔记】域运算符/new/delete运算符/重载/Name managling/extern C/带函数默认值参数
  11. 虚拟机linux启动是来宾账户,配置Openstack Nova以自动启动在主机重新引导之前运行的guest虚拟机...
  12. 小学生python游戏编程5----拼图游戏继
  13. android开发接口文档模板
  14. 小型超市管理系统【软件工程大作业】
  15. .rgb格式文件的Python读取、格式转换
  16. scrum敏捷开发项目管理工具必备
  17. Android识别图片中的WIFI二维码,并自动连接
  18. matlab批量修改指定像素
  19. 前后端分离跨域上传图片代码
  20. 如何升级自己的思维,成为你想成为的自己? ----《少有人走的路》讀後感

热门文章

  1. 立创EDA导出3d模型到Altimu Designer
  2. python 图片库_Python开发之千库网图片下载助手
  3. COBIT设计指南信息和技术治理解决方案的设计
  4. 博途数据类型wstring怎么用_博图V14关于自定义数据类型的疑问,大家都是怎么编程写中间标签的那。...
  5. 分析当下最流行的思维框架,思维模型。
  6. 关于w5500客户端和服务器的调试心得
  7. python如何压缩文件?
  8. VisualGDB编译关键参数设置
  9. Java工程师培训课(十八【新的领域】)
  10. linux教程(四)— Xshell常用命令