0


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

了解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协议,群人数不宜太多。


本文转载自: https://blog.csdn.net/wuhuanyicheng/article/details/130738307
版权归原作者 无欢以承 所有, 如有侵权,请联系我们删除。

“最详细的signal 通信协议讲解,双棘轮复杂加密”的评论:

还没有评论