WhatsApp 最近宣布对所有通信进行端到端加密。虽然这是一个令人印象深刻的举动,但我仍然有一个很大的悬而未决的问号。
文章和本白皮书建议,公钥在生成后存储在服务器上。当我想与另一个人交谈时,我会向 WhatsApp 服务器询问他们的公钥,并在通信中使用它。同一份白皮书对密钥验证进行了说明:
WhatsApp 用户还可以选择验证与他们通信的其他用户的密钥,以便他们能够确认未经授权的第三方(或 WhatsApp)没有发起中间人攻击。这可以通过扫描二维码或比较 60 位数字来完成。
哦,太好了,这些东西是怎么产生的?
二维码包含:
- 厌恶。
- 双方的用户标识符。
- 双方的完整 32 字节公共身份密钥。
当任一用户扫描对方的 QR 码时,会比较密钥以确保 QR 码中的内容与从服务器检索的身份密钥匹配。
但是......这些都是服务器知道的所有细节,并且不需要其他人有什么特别的(它没有提到正在签名的 QR)。60位数字怎么样?
60 位数字是通过连接每个用户的身份密钥的两个 30 位数字指纹来计算的。计算 30 位数字指纹:
- 迭代 SHA-512 将公共身份密钥和用户标识符散列 5200 次。
- 取最终散列输出的前 30 个字节。
- 将 30 字节的结果分成六个 5 字节的块。
- 通过将每个 5 字节块解释为大端无符号整数并将其模 100000 减少,将每个 5 字节块转换为 5 位数字。
- 将六组五位数连接成三十位数。
同样,这些是服务器可以轻松计算并作为有效验证数据呈现给我的详细信息。
我是否误解了这一点,或者没有真正的方法来验证我正在与之交谈的公钥是否属于我认为的那个人?