WhatsApp 使用的信号协议如何工作?

信息安全 加密 密码学 whatsapp
2021-08-14 19:05:41

我想了解信号协议的过程。我有谷歌它,但我找不到任何好的文章或教程。

我想了解信号协议的基本定义和功能,如果有任何描述该过程的图表可用,那就太好了。

1个回答

看看 WhatsApp 的这份技术白皮书,他们最近转移到了用于 e2e 加密的信号协议。

公钥类型

  • Identity Key Pair – 在安装时生成的长期 Curve25519 密钥对。
  • Signed Pre Key – 中期 Curve25519 密钥对,在安装时生成,由身份密钥签名,并定期轮换。
  • One-Time Pre Keys– 一次性使用的 Curve25519 密钥对队列,在安装时生成,并根据需要进行补充。会话密钥类型
  • Root Key – 一个 32 字节的值,用于创建链密钥。
  • Chain Key – 用于创建消息密钥的 32 字节值。
  • Message Key– 用于加密消息内容的 80 字节值。AES-256 密钥使用 32 个字节,HMAC-SHA256 密钥使用 32 个字节,IV 使用 16 个字节。

要建立会话:

  1. 发起客户端(“发起者”) 为接收者请求 public Identity Key、 publicSigned Pre Key和单个 public 。One-Time Pre Key
  2. 服务器返回请求的公钥值。AOne-Time Pre Key只使用一次,因此在被请求后会从服务器存储中删除。收件人最新一批One-Time Pre Keys已消费且收件人未补货的,不予One-Time Pre Key退换。
  3. 发起者保存接收者的Identity Keyas IrecipientSigned Pre KeyasSrecipientOne-Time Pre Keyas Orecipient
  4. 发起者生成一个临时 Curve25519 密钥对Einitiator
  5. 发起者将自己的加载Identity KeyIinitiator.
  6. 发起者将主密钥计算为master_secret = ECDH(Iinitiator, Srecipient) || ECDH(Einitiator, Irecipient) || ECDH(Einitiator, Srecipient) || ECDH(Einitiator, Orecipient)如果没有One Time Pre Key,则省略最终的 ECDH。
  7. 发起者用途香港民主促进会创建Root KeyChain Keysmaster_secret

接收会话设置

建立一个长时间运行的加密会话后,发起者可以立即开始向接收者发送消息,即使接收者处于离线状态。在接收方响应之前,发起方会包含接收方建立相应会话所需的信息(在所有已发送消息的标头中)。这包括发起者的EinitiatorIinitiator

当收件人收到包含会话设置信息的消息时:

  1. master_secret接收方使用自己的私钥和传入消息头中公布的公钥计算对应的值。
  2. 接收者删除One-Time Pre Key发起者使用的。
  3. Root Key发起者 使用 HKDFChain Keysmaster_secret.