目录

了解signal的意思

起源:

涉及算法:

signal技术优势:

使用signal的热门产品

Signal protocol

为了快速入门,先来了解一下signal protocol两端协议的演变:

DH协议(迪菲-赫尔曼密钥交换协议(Diffie–Hellman key exchange):

X3DH

双棘轮算法

KDF棘轮

DH棘轮

Signal Protocol的群组聊天设计


了解signal的意思

首要了解:signal通信协议一般指的是signal protocol协议,而signal本身是一个私人通信平台

  • 起源:

    • Signal 起源于 Open Whisper Systems 这个组织,其前身是 Whisper Systems 公司,成立于2010年。Open Whisper Systems 成立后致力于加密通信方面的研究工作,其首个产品是名为 TextSecure 的 Android 平台短信加密应用程序,它采用 Signal Protocol 协议实现了端对端加密,然后最终演变为今天更广泛使用的 Signal 应用程序。
  • 目的:Signal旨在提供一个私密、安全、开放和免费的通讯平台,在保证用户信息安全的同时对用户的隐私进行保护
  • 涉及算法:

    • 主要是前两个算法

      • Curve25519用于生成会话密钥
      • AES-256-GCM用于加密每个消息。
      • 此外,它还使用了HMAC-SHA256作为消息认证码和密钥派生函数,确保消息内容完整和不可更改。
  • signal技术优势:

    • 数据不会保存:Signal 始终使用端对端加密,消息、通话、群组和文件都不会存储于 Signal 服务器。因此,Signal 不会在其中保存数据来供自己或任何其他人查看。
    • 开源软件:Signal 是一种开源软件,使人们可以审查代码以确认其安全性,也鼓励其他开发人员参与进来并帮助改进它。
    • 隐私屏蔽技术:Signal 提供了一些隐私技术,如 "Sealed Sender"(密封发送者),用于隐藏消息发送者的身份,从而确保只有接收者能够读取其内容。
    • 双重校验机制:Signal 还提供了一个基于二次验证的账户设置选项,用于确保凭证和设备等信息有额外的保护,防止被攻击者盗用
  • 使用signal的热门产品

    • Signal 私人聊天应用程序:Signal 本身是一个开源、免费且安全的消息和通话应用程序,许多人选择使用它来代替其他通信应用程序以保护其通信隐私。
    • WhatsApp:WhatsApp 是一款人气极高的即时通讯应用程序,同时也是一家 Facebook 公司旗下的产品,其默认使用 Signal 协议加密用户通信内容。
    • Skype:Skype 是一款流行的视频和语音通话软件,在一定程度上也使用 Signal 协议加密通信内容。
    • Facebook Messenger:Facebook 的聊天应用程序 Messenger 也使用 Signal 协议的加密技术,不过用户需要手动启用“秘密聊天”选项才能使用

Signal protocol

  • 首要了解与signal之间的关系:Signal 是一个私人通信平台,而 Signal Protocol 则是其所用的加密协议。换句话说,Signal Protocol 是 Signal 保护用户信息安全和隐私的技术基础
  • signal protocol协议是一个端对端的加密通信协议,且安全性极高,有着世界上最安全的通讯协议的誉称。基础是双方通信时的终端加密,这意味着消息只能在发送者和接收者之间解密**,即使Signal自己也无法查看或存储消息的内容
  • 为了快速入门,先来了解一下signal protocol两端协议的演变:

    • DH协议(迪菲-赫尔曼密钥交换协议(Diffie–Hellman key exchange):

      • 说明:允许通信两方在没有安全预共享密钥的情况下建立共享秘密,并可以用于加密通信。DH协议的基本思想是:通过模数取幂的方式得出一个共享的秘密值,而这个结果对外界来说是不可知的。
      • 网上热门解释:
        • 图示

        • 拟定Alice和Bob要确定一个消息密钥
        • 1) Alice和Bob各自创建符合DH协议的密钥对,假设Alice密钥对为(私钥A,公钥A),Bob密钥对为(私钥B,公钥B);
        • 2) 双方发送自己的公钥给对方,即使有黑客监听,他只能得到公钥A,公钥B;
        • 3) Alice用自己的私钥和Bob的公钥计算消息密钥为S,即DH(私钥A,公钥B)=密钥S;
        • 4) Bob用自己的私钥和Alice的公钥计算消息密钥也为S;即DH(私钥B,公钥A)=密钥S;
        • 5) 双方同时确定了协商密钥S,后续可以通过S衍生出消息密钥,进行加密通讯。
        • 6) 黑客只知道公钥A和公钥B,因为不知道任意一方的私钥,所以无法计算出密钥S。
      • 总结简单讲DH就是:在一个不安全的网络环境下,通信的双方各自商定制作各自公钥和私钥,传输的时候发送各自公钥就行了,通过对方公钥和自己的私钥就能生成共享密钥
    • X3DH

      • x3DH,全称是extended Triple Diffie-Hellman key exchange协议。这是一种基于 DH 协议的3倍加强版密钥交换协议,用于在不同设备或运行程序中的不同用户之间进行端到端加密通信。它是 Signal Protocol 使用的一部分,因此也被广泛应用于Signal和许多其他加密应用程序中。
      • 特色
        • x3DH中角色:除了会话发起方,接收方,还有一个新增角色服务方,用于存储所有用户的各种公钥。
        • 3个基础密钥对:所有通信用户需要创建3个基础密钥对,用于严格保证安全性
          • IPK(Identity Key Pair): 身份密钥对,一个长期的符合DH协议的密钥对,用户注册时创建,与用户身份绑定
          • SPK(Signed Pre Key): 已签名的预共享密钥,一个中期的符合DH协议的密钥对,用户注册时创建,由身份密钥签名,并定期进行轮换,此密钥可能是为了保护身份密钥不被泄露;
          • OPK(One-Time Pre Keys): 一次性使用的 Curve25519 密钥对队列,安装时生成,不足时补充。
          • 所有人都要将这3种密钥对的公钥上传到服务器上,以便其他人发起会话时使用。
        • 示例说明
          • a向b发送消息,需要先确定消息密钥,具体流程如下

            • a需要创建一个临时密钥 对ephemeral key(EPK)
            • a从服务器获取b的3种公钥:身份密钥对的公钥IPK-B;已签名的预共享密钥对的公钥SPK-B;一次性预共享密钥对的公钥OPK-B
            • a使用自己的EPK私钥和IPK私钥+b的3个公钥作为DH协议算法的参数,然后使用类似交叉排序的算法计算出初始密钥
              • 算法如下:

                • DH1 = DH(IPK-A, SPK-B)
                • DH2 = DH(EPK-A, IPK-B)
                • DH3= DH(EPK-A, SPK-B)
                • DH4 = DH(IPK-A, OPK-B)
              • 初始密钥DH = DH1 || DH2 || DH3 || DH4,即连接起来。
              • 但是DH这个密钥太长,不适合作为消息密钥,所以对这个初始密钥进行一次KDF计算(KDF是密钥衍生算法的一种,可以看成加强版的hash),以衍生出固定长度的消息密钥S
                • kDF算法是一种用于数据隐私保护的技术,全称为"k-Anonymity with Differential Privacy"。它主要通过对数据进行匿名化处理来保护个人隐私,在此基础上提供隐私保护性能评估。具体而言,kDF算法通过对原始数据进行相似性分组和扰动处理,从而实现个人信息的低风险泄露和攻击者的追踪困难化。
              • S = KDF(DH1 || DH2 || DH3 || DH4)
            • 得到密钥s后,然后a使用消息密钥S对消息进行加密,连同自己的身份公钥IPK-A和临时公钥EPK-A一同发给b
            • b收到a的信息后,取出a的2个公钥,连同自己的密钥,使用与a相同的算法计算消息密钥S。
            • 之后a和b使用消息密钥进行加密通讯。
        • 与DH相比优势:
          • x3DH 可以让多个设备使用同一个密钥。DH 协议基于两个人之间的相互交换生成一般性的共享秘密,然而 x3DH 协议可以扩展到三方的合作,可以让更多的参与者使用相同的加密密钥。
          • x3DH 使用了数字签名验证身份和对称密钥加密技术,使其在密钥分发过程中具有更高的安全性。在实现中, x3DH 使用着数字证书证明公钥的正确性和身份的真实性,同时它也采用了对称密钥技术来保护消息在传输途中被篡改的安全性。
          • 在运行流程中,在实现单向秘密这一点上X3DH是区别于DH协议的。这种单向流程避免了一些普通DH攻击模式的掌握情况,例如:中间人攻击和回放攻击等。
        • 存在问题:
          • 密钥管理风险:在Signal中,用户可以通过多个设备同时使用同一个账号,在这种情况下,密钥会被存储在每个设备上,如果某个设备受到攻击,则所有设备的密钥都会出现问题。
          • 安全升级问题: 协议安全性随着时间一起快速升级,新发现的脆弱点和漏洞也会修补。因此确定一个明确的更新规则来维护安全性就显得非常必要。
          • MITM攻击:在Signal的流程中,如果攻击者能够成功执行“人中心”攻击( Man-in-the-Middle)并伪造类似"公告信息"或"系统通知"的提示,很容易导致用户信任,从而授权攻击者获取其私钥密文。
    • 双棘轮算法

      • 棘轮:棘轮就是一种特殊的齿轮,他只能往一个方向转下去,而不能往回转
      • 单棘轮算法:
        • 只向一个方向转动,不能往回转,保证前向安全或后向安全
        • 再来回到KDF算法(也是一种棘轮算法),kdf算法导出的KDF链只能往后面派生,而不能计算出前向的密钥,这就保证了,如果某一轮的密钥被破解出来,但前面的密钥是无法计算出来的,也就是前面的消息无法被解密
        • 如果再加上一个棘轮算法,就可以再前向安全的基础上保障后向安全,即一条消息的密钥被破解,之前和之后的消息密钥都无法推算,这种算法被称为“双棘轮算法”
      • signal protocol协议双棘轮加密算法为:“KDF链棘轮”+“DH棘轮”。以保证消息的前向安全和后向安全
      • KDF棘轮

        • KDF是一种密钥导出函数,通过附加一些数据(数据被称为“盐”,即solt,附加数据又称“加盐”),将原始密钥导出新的密钥,提高原始密钥的保密性。公式表达为
        • KDF (原密钥,盐) = 导出密钥
        • KDF算法可用于更安全地保存用户密码,普通的密码管理方式是服务器保存用户密码的哈希值,以避免服务器被攻击后黑客拿到用户密码原文,但是一些简单密码的哈希值仍然可以通过少量的碰撞破解出来,比如123456的哈希值就很容易被碰撞出来。更加安全的做法是在用户哈希值附加其它信息(比如用户注册时间,用户住址等等),通过KDF算法导出,得出的密钥具有非常强的随机性,就很难被碰撞出来。比如原始密码是123456的哈希值为"hash (123456)",使用KDF算法得出最终密钥。比如:KDF(hash (123456),用户注册时间)=最终密钥
        • 而服务器只保存最终密钥。这样的密码管理方式的好处是,不管用户设置的密码多么简单,服务器保存的密钥都是非常随机的,很难被碰撞出来。
        • 图示

        • 讲解:
          • 第一步里,将初始密钥使用KDF算法导出新的密钥,新的密钥被切成2部分,前半部分作为下一次KDF计算的输入,后半部分作为消息密钥。每迭代一次(也可以说 棘轮步进一次),就会生成新的消息密钥。
          • 假设每发一条消息,就棘轮步进一次,那么每条消息的密钥都会不同,而且由于KDF算法的单向性,通过这条消息的密钥无法倒推出上一条消息密钥的。这就保证了密钥的前向安全。
          • 但是这种设计不能保证后向安全,黑客一旦破解了某条密钥,并掌握了盐的内容,那么它就可以按照这种算法计算出以后所有的消息密钥。
          • 所以,为了保证后向安全,就要设计一种算法,使每次迭代时引入的盐是随机的,从而保证每次的消息密钥是不可以向后推算的。Signal Protocol 通过增加“DH棘轮”来保证盐的随机性。
        • 总结通过KDF棘轮算法,将初始密钥+盐数据,得出新密钥,整个新密钥会切分为两部分,前半部分分作为下一次KDF计算的输入,后半部分作为消息密钥。往后生成新的消息密钥,均由此方法迭代
      • DH棘轮

        • “DH棘轮”算法能保证每次计算引入的盐的随机性。由前文可知,2对密钥对可以通过DH协议生成一个安全的协商密钥,如果更换其中一个密钥对,新的协商密钥也会变化。DH棘轮算法就是通过轮流更换一个密钥对,每次生成不同的协商密钥,作为KDF棘轮算法的盐。每进行一个消息轮回,DH棘轮就更新一次临时密钥对,盐就被更新,KDF棘轮算法生成的消息密钥就具有后向安全性。
        • 在前文提过,a要给b发送消息,根据X3DH协议,a要创建一个临时密钥对(EPK-A),用于创建初始消息密钥S。其实这个临时密钥对还有另外一个用途,就是用于生成第一个盐。
        • 图示

      • 具体过程
        • A发送一次消息B回复一次消息的过程

          • 1.a使用X3DH协议生成初始密钥s1用于创建会话

          • 2.a使用密钥s1加密了需要发送的消息,并将加密消息和临时密钥对公钥EPK-A和身份密钥对的公用IPK-A一并发送给b

          • 3.b在拿到密钥s1和a的两个公钥,同样使用X3DH协议算法得到s1密钥,并将其解密,得到消息

          • 4.在进行消息回复的时候,使用双棘轮加密算法:即将密钥s1+solt盐数据(由临时密钥对生成的数据,这个临时密钥对是a的公钥和b的私钥)。得到一个数据,数据前半部分作为下次KDF密钥的输入数据,即放入KDF链棘轮里面(最初输入是初始密钥s),后半部分作为回复的消息密钥s2。
          • 5.然后b使用s2密钥加密回复消息,并和b的临时密钥一并发送给a

          • 6.a收到b的临时密钥和加密信息后,将s1的前半部分作为输入数据,由EPK-A和EPK-B作为DH棘轮,生成本次的盐,最终得到s2密钥,解密s2后半不放获取b的回复消息

          • 7.如果a再次发送消息,则更换临时密钥,重规迭矩之后得出s3密钥,并将消息进行加密

          • 8.b收到也是如法炮制,使用双棘轮得出s3密钥,并将消息解密

        • A向B连续发送消息得过程
          • 1.a照例使用双棘轮算法得出s3密钥,并使用后半部分进行消息加密,不过此时b接收不再参与双棘轮加密,仅仅只是解密

          • 2.a再次发送消息(同一会话),此时临时密钥不改变,DH密钥也不改变,即盐数据不变。

    • Signal Protocol的群组聊天设计

      • Signal Protocol的群组聊天是通过KDF棘轮算法+公钥签名来进行加密通讯的。通讯流程是这样的,
      • (1) 每个群组成员都要首先生成随机 32 字节的KDF链密钥(Chain Key),用于生成消息密钥,以保障消息密钥的前向安全性,同时还要生成一个随机Curve25519 签名密钥对,用于消息签名。
      • (2) 每个群组成员用向其它成员单独加密发送链密钥(Chain Key)和签名公钥。此时每一个成员都拥有群内所有成员的链密钥和签名公钥。
      • (3) 当一名成员发送消息时,首先用KDF链棘轮算法生成的消息密钥加密消息,然后使用私钥签名,再将消息发给服务器,由服务器发送给其它成员。
      • (4) 其它成员收到加密消息后,首先使用发送人的签名公钥验证,验证成功后,使用相应的链密钥生成消息密钥,并用消息密钥解密。
      • (5) 当群组成员离开时,所有的群组成员都清除自己链密钥和签名公钥并重新生成,再次单独发给每一位成员。这样操作,离开的成员就无法查看群组内的消息了。
      • 由上可知,一个人在不同的群组里,会生成不同的链密钥和签名密钥对,以保障群组之间的隔离。在每个群组中,每个成员还要存储其它成员的KDF链和签名公钥,如果群组成员过多,加解密运算量非常大,会影响发送和接收速度,同时密钥管理数据库也会非常大,读取效率也会降低。所以,群组聊天使用signal Protocol协议,群人数不宜太多。
      • 图示:
        • 1.群组有a,b,c,d四人,各自保存所有在群成员的KDF链密钥和签名公钥

        • 2.a发送消息,使用kdf链棘轮得到消息加密密钥,并使用Curve25519私钥进行签名(二次加密),发送至服务器,由服务器发送至各成员

        • 3.收到消息的成员使用发送成员的Curve25519公钥进行解密和其KDF链密钥进行双重解密,最终得到消息

        • 4.当群组成员离开时,所有的群组成员都清除自己KDF链密钥和Curve25519密钥对并重新生成,再次单独发给每一位成员。这样操作,离开的成员就无法查看群组内的消息了。由上可知,一个人在不同的群组里,会生成不同的KDF链密钥和Curve25519密钥对,以保障群组之间的隔离。在每个群组中,每个成员还要存储其它成员的KDF链密钥和Curve25519公钥,如果群组成员过多,加解密运算量非常大,会影响发送和接收速度,同时密钥管理数据库也会非常大,读取效率也会降低。所以,群组聊天使用signal Protocol协议,群人数不宜太多。

最详细的signal 通信协议讲解,双棘轮复杂加密相关推荐

  1. 详细讲解 “双评价”——建设指向的土地资源评价

    因为本系列只是起研究模拟作用,因此以广东省(省级)为例,地理坐标系使用WGS1984(许多网上得到的数据都是WGS84,所以不使用CGCS2000),投影使用WGS_1984_UTM_Zone_49N ...

  2. HTML学习知识点大全-----超详细(各种标签使用讲解及案例)

    HTML学习知识点大全-----超详细(各种标签使用讲解及案例) 1:概念 **最基础的网页开发语言 *Hyper Text Markup language:超文本标记语言超文本:运用了超链接的方法, ...

  3. 详细的线程池讲解,手写C与C++版本

    详细的线程池讲解,手写C与C++版本 在此感谢苏丙榅的教程讲的很详细,我看了他的C版本教程,对线程池有了深刻理解,手写了C版本,并自主改了C++版本. 线程池是消费者生产者模型的其中之一.这里面的线程 ...

  4. 一个很详细的web.xml讲解(转)

    <?xml version="1.0" encoding="UTF-8"?>  <!DOCTYPE web-app PUBLIC " ...

  5. 动态规划27k字超详细保姆级入门讲解——附DP经典线性、区间、二维图、四维8个模型题解

    动态规划27k字超详细保姆级入门讲解 写在前面: 这篇文章是目前为止我写过最长也是最久的文章,前面关于DP的讲解我查阅了大量的博客资料,学习其他博主对DP的理解,也翻阅了很多经典的纸质书籍,同时做了近 ...

  6. 一体式分体水冷!【改造详细教程】适用所有双路平台

    一体式分体水冷![改造详细教程]适用所有双路平台

  7. 华为5ipro详细参数使用功能_详细讲解双计双控智能电表技术参数以及新增功能优势...

    双计双控智能电表(升级版)是一款具有两路计量两路控制智能费控功能的电表,相当于两台智能电表组合成一台智能电表.它采用微电子技术研制的新型电度表,该表具有高精度计量.智能费控.自动结算电费.恶性负载识别 ...

  8. 详细讲解 “双评价”——农业土地资源评价

    本系列基于自然资源部2019年6月和2020年1月印发的两版<资源环境承载能力和国土空间开发适宜性评价指南(试行)>(简称"双评价"),因为计算公式与方法在2020.1 ...

  9. python中堆排序_python堆排序,详细过程图和讲解,这样做小白都会

    ### 正文前的扯淡 之前电话面试一个公司时,面试官让写一个堆排序,遗憾的是我忘了堆排序的思想了,所以直接说不会写,这次电面也以失败告终...知耻后勇,这几天在网上找了很多写堆排序的帖子,但是帖子质量 ...

最新文章

  1. 基于比特币现金的Token逐梦而来
  2. Deep Learning(深度学习)相关网站
  3. 一个程序看fputc和fgetc
  4. android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )及屏幕适配注意事
  5. ie compatibility
  6. 面试官让你用C语言实现大数相乘,慌吗?
  7. 《白帽子讲web安全》读书笔记
  8. id和instancetype
  9. Redhat8: SCTP: type= 5 errno= <0x5e> Socket type not supported
  10. c语言输出打印字符串数组,C语言字符串输出
  11. 【金猿产品展】荣联冷冻电镜数据分析平台——助力生物医疗科研创新
  12. PMP考前冲刺2.20 | 2023新征程,一举拿证
  13. 机器学习深度学习 常用算法推导
  14. illustrator插件-常用功能开发-尺寸标注-js脚本开发
  15. 有一个很棒的想法,如何向老板证明你是对的
  16. 智力风暴(经典智力题)
  17. public,static,private,protected的用法
  18. 源码分析工具Joern的相关资料整理
  19. 销售用到的心理学技巧有哪些
  20. R语言入门基础操作 啰嗦同桌级教程(一)

热门文章

  1. Oracle 递归案例
  2. VC宏定义 及常用宏定义说明
  3. Footprint Analytics:音乐 NFT 极有可能成为引领 NFT 行业的下一个风口
  4. 敏捷开发绩效管理之一:序言及“敏捷开发是否考核个人”(绩效考核)
  5. 西安交大轴承加速寿命实验数据
  6. php搭建环境网页显示空白,打开php项目网站,页面显示为空白
  7. libpcap linux安装,CentOS安装libpcap
  8. 通过CLI工具构建一个Vue.js程序
  9. direct wifi 芯片_Android WifiDirect 学习(三) 一些基础知识和问题
  10. python:字符编码问题