实体鉴别

实体鉴别和报文鉴别不同。报文鉴别是对每一个收到的报文都要鉴别报文的发送者,而实体鉴别是在系统接入的全部持续时间内对和自己通信的对方实体只需验证一次

最简单的实体鉴别过程如下图所示。A 向远端的 B 发送带有自己身份 A(例如,A 的姓名)和口令的报文,并且使用双方约定好的共享对称密钥 KABK_{AB} 进行加密。B 收到此报文后,用共享对称密钥 KABK_{AB} 进行解密,从而鉴别了实体 A 的身份。

重放攻击(replay attack)

这种简单的鉴别方法具有明显的漏洞。例如,入侵者 C 可以从网络上截获 A 发给 B 的报文,C 并不需要破译这个报文(因为这可能得花很长时间),而是直接把这个由 A 加密的报文发送给 B,使 B 误认为 C 就是 A;然后 B 就向伪装成 A 的 C 发送许多本来应当发给 A 的报文。这就叫做重放攻击 (replay attack)

为了对付重放攻击,可以使用不重数(nonce)。不重数就是一个不重复使用的大随机数,即“一次一数”。在鉴别过程中不重数可以使 B 能够把重复的鉴别请求和新的鉴别请求区分开。下图给出了这个过程:

在图中,A 首先用明文发送其身份 A 和一个不重数 RAR_A 给 B。接着,B 响应 A 的查问,用共享的密钥 KABK_{AB}RAR_A 加密后发回给 A,同时也给出了自己的不重数 RBR_B。最后,A 再响应 B 的查问,用共享的密钥 KABK_{AB}RBR_B 加密后发回给 B。由于不重数不能重复使用,所以 C 在进行重放攻击时无法重复使用所截获的不重数。

在使用公钥密码体制时,可以对不重数进行签名鉴别。例如在上图中,B 用其私钥对不重数 RAR_A 进行签名后发回给 A。A 用 B 的公钥核实签名,如能得出自己原来发送的不重数 RAR_A,就核实了和自己通信的对方的确是 B。同样,A 也用自己的私钥对不重数 RBR_B 进行签名后发送给 B。B 用 A 的公钥核实签名,鉴别了 A 的身份。

公钥密码体制虽然不必在互相通信的用户之间秘密地分配共享密钥,但仍有受到攻击的可能。让我们看下面的例子:

  1. C 冒充 A,发送报文给 B,说:“我是 A”。

  2. B 选择一个不重数 RBR_B,发送给 A,但被 C 截获了。

  3. C 用自己的私钥 SKCSK_C 冒充是 A 的私钥,对 RBR_B 加密,并发送给 B。

  4. B 向 A 发送报文,要求对方把解密用的公钥发送过来,但这报文也被 C 截获了。

  5. C 把自己的公钥 PKCPK_C 冒充是 A 的公钥发送给 B。

  6. B 用收到的公钥 PKCPK_C 对收到的加密的 RBR_B 进行解密,其结果当然正确。于是 B 相信通信的对方是 A,接着就向 A 发送许多敏感数据,但都被 C 截获了。

Last updated