挑战-响应中的一个严重安全问题

2026-05-28T00:47:56+08:00

挑战-响应的一种做法是,把一个随机字符串(nonce)发送给需要验证身份的人,并让对方使用自己的私钥对该字符串进行签名。然而,这会带来一个非常严重的安全问题。

例如,Alice 想要验证 Bob。但 Mallory 插在他们中间。于是会发生下面的事情:

  1. Alice 将挑战发送给被 Mallory 冒充的 'Bob'。
  2. Mallory 冒充 Alice,将该挑战转发给 Bob,并请求返回响应。
  3. Bob 把响应发回,然后 Mallory 再把响应转发回去。

在这种情况下,Mallory 已经成功向 Alice 冒充了 Bob,现在就可以进行 MITM 攻击了。

解决办法不是只把随机字符串当作挑战。一个好的挑战至少应包含以下内容:

  1. 验证者和被验证者的信任锚的标识信息(例如 OpenPGP 指纹);
  2. 通道的标识信息(例如,面对面验证时的地点;在 XMPP 上验证时的 JID 以及 OMEMO 指纹;在 Matrix 上验证时双方的 Matrix ID 和房间);
  3. 时间戳;
  4. nonce,也就是随机字符串。

换句话说,挑战应当把验证者和被验证者的身份、已认证的通道或会话上下文、用于保证新鲜度的时间戳,以及 nonce 绑定在一起。验证者必须将已签名的身份声明与已认证的传输元数据进行比对。

在这种情况下,Mallory 就必须篡改通道上下文来欺骗 Bob(否则 Bob 会立刻识别出这个有问题的挑战并拒绝响应),而这样一来,由于挑战已被篡改,Alice 在验证时就会发现响应无效。

为了获得更强的安全性,请彼此相互验证。

Tildeverse Banner Exchange