简介
本白皮书提供了 WhatsApp 端到端加密系统的技术说明。请访问 WhatsApp 的网站 www.whatsapp.com/security 了解更多。
WhatsApp Messenger 容许人们自由的交换消息(包括聊天,群聊,图片,视频,语音消息和文件),并在发送者和接收者之间使用端对端加密(在 2016 年 3 月 31 以后的版本)。
Signal 协议是由 Open Whisper Systems (非盈利软件开发团体)设计,是 WhatsApp 端对端加密的基础。这种端对端加密协议旨在防止第三方和 WhatsApp 对消息或通话进行明文访问。更重要的是,即便用户设备的密钥泄露,也不能解密以前传输的消息。
本文档概述了 Singal 协议在 WhatsApp 中的应用。java
交换消息
一旦创建了会话,经过 AES256 消息密钥加密(CbC 模式)和 HMAC-SHA256 验证来保护客户端交换消息。
消息密钥是短暂的且在每次发送消息后都会变化,使得用于加密消息的消息密钥不能从已发送或已接收后的会话状态中重建。
消息密钥在发送消息时对发送人的链密钥(Chain Key)进行向前的“棘轮(ratchets)”派生而来。此外,每次消息巡回都执行一个新的 ECDH 协议以建立一个新的链密钥(Chain Key)。经过组合即时 “哈希棘轮(hash ratchet)” 和巡回 “DH 棘轮(DH ratchet)” 提供前向安全。git
经过链密钥(Chain Key)计算消息密钥(Message Key)
消息发送者每次须要新的消息密钥时,计算以下:github
这样造成向前“棘轮(ratchets)”链密钥(Chain Key),这也意味不能使用存储的消息密钥推导出当前或过去的链密钥(Chain Key)值。算法
经过根密钥(Root Key)计算链密钥(Chain Key)
每一条发送的消息都附带一个短时间的 Curve25519 公钥。一旦收到响应,新的链密钥(Chain Key)计算以下:数据库
一个链密钥只能给一个用户发消息,因此消息密钥不能被重用。因为消息密钥和链密钥(Chain Keys)的计算方式,消息可能会延迟、乱序或彻底丢失而不会有问题。安全
传输媒体和附件
任何类型的大附件(视频,音频,图像或文件)也都是端对端加密的:服务器
群组消息
传统未加密的聊天应用一般对群组消息使用“服务器扇出(server-side fan-out)”来发群组消息。当一个用户向群组发消息时,服务器将消息分发给每个群组成员。
而“客户端扇出(client-side fan-out)”是客户端将消息发给每个群组成员。
WhatsApp 的群组消息基于上面列出的成对加密会话构建,以便高效实现大量群组消息经过服务器扇出(server-side fan-out)。这是经过 Signal 传输协议(Signal Messaging Protocol)的 “发送者密钥(Sender Keys)”来完成的。
WhatsApp 群组成员第一次发消息到群组:网络
全部后续发给该群组的消息:app
消息发送人链密钥(Chain Key)的“哈希棘轮(hash ratchet)”提供向前安全。当群组成员离开时时,全部剩下的群组成员都清除发送人密钥(Sender Key)并从新生成。框架
通话设置
WhatsApp 语音和视频通话也是端对端加密。当 WhatsApp 用户发起语音或视频通话时:
状态
WhatsApp 状态加密方式和群组消息很是类似。给指定的一组接收人第一次发状态遵循向群组第一次发消息相同的步骤。相似地,给同一组接收人发送后续状态也遵循发群组消息相同的步骤。当状态发送人更改状态隐私设置或从地址簿种删除号码来删除接收人时,状态发送人会清除发送人密钥(Sender Key)并从新生成。
验证密钥
WhatsApp 用户还能够验证与之通讯用户的密钥,以便他们可以确认未受权的第三方(或 WhatsApp)未发起中间人攻击。经过扫描二维码或经过比较 60 位数字来完成。
二维码包括:
当用户扫描对方的二维码时,将比较这些密钥以确保二维码中的身份密钥与服务器检索到的相匹配。
经过拼接两个用户身份密钥的 30 位数字指纹来计算 60 位数字号码。计算 30 位数字指纹步骤:
传输安全
WhatsApp 客户端和服务器之间全部通讯都在单独的加密通道内分层。在 Windows Phone、iPhone 和 Android 上,这些端对端加密客户端可使用噪音管道(Noise Pipes),使用噪声协议框架(Noise Protocol Framework)中的 Curve2551九、AES-GCM 和 SHA256 实现长期运行的交互链接。
这为客户端提供了一些不错的属性:
结论
WhatsApp 用户之间的消息受到端对端加密协议的保护,所以第三方和 WhatsApp 都没法获知消息内容,消息只能由接收人解密。全部 WhatsApp 消息(包括聊天、群聊、图片、视频、语音消息和文件)和 WhatsApp 通话都受到端对端加密的保护。
WhatsApp 服务器没法访问 WhatsApp 用户的私钥,而且 WhatsApp 用户能够选择验证密钥以确保其通信完整。
WhatsApp 使用的 Signal 协议库是开源的,代码:https://github.com/whispersystems/libsignal-protocol-java/
参考
过年期间翻译了一下,原本英语就差很是吃力,正好作这块硬着头皮试着翻译一下,但愿对英语也很差的朋友有一点帮助。对了,招人,看我博客首页招 Swifter :)