Needham-Schroeder共享密钥协议

Needham-Schroeder共享密钥协议(Needham-Schroeder Shared-Key Protocol, NSSK) 是密码学史上首个基于可信第三方(Trusted Third Party, TTP)相互认证与密钥分发协议。旨在解决大规模网络中任意两方安全建立共享会话密钥的难题。

该协议的核心思想是引入一个各方都信任的密钥分发中心(Key Distribution Center, KDC),记作 S。每个用户(如Alice和Bob)预先与KDC共享一个长期密钥(K_AS, K_BS),用于安全地获取短期、一次性的会话密钥(K_AB)。

协议流程

协议由5条消息组成,分为密钥分发(消息1-3)和相互认证(消息4-5)两个阶段。

前提条件

  • A(发起方)与S(KDC)共享长期密钥 K_AS
  • B(响应方)与S(KDC)共享长期密钥 K_BS
  • 协议目标:A与B建立并相互认证一个新鲜的会话密钥 K_AB

协议步骤

  1. A → SA, B, N_A
    A向KDC发起会话请求,附上自己的身份A、目标身份B以及一个一次性随机数N_A(Nonce),用于保证消息的新鲜性

  2. S → A{ N_A, B, K_AB, { K_AB, A }_K_BS }_K_AS
    KDC生成会话密钥K_AB,然后构造一个“票据(Ticket)”:{ K_AB, A }_K_BS,这个票据只有Bob能用他的密钥K_BS解密。KDC将N_ABK_AB和这个票据打包,并用Alice的密钥K_AS加密后发回给Alice。
    Alice解密后,通过检查N_AB来确认这是对她请求的、新鲜的响应。

  3. A → B{ K_AB, A }_K_BS
    Alice将收到的票据原样转发给Bob。
    Bob用自己的密钥K_BS解密票据,从而获得会话密钥K_AB,并确认与之通信的对象是Alice。

  4. B → A{ N_B }_K_AB
    Bob生成一个新的随机数N_B,用刚得到的会话密钥K_AB加密后发送给Alice。这是一个挑战(Challenge),用于验证Alice是否真的持有K_AB

  5. A → B{ N_B - 1 }_K_AB
    Alice解密消息4得到N_B,对其进行一个约定的变换(如减1),再用K_AB加密后发回给Bob。这是对挑战的响应(Response)
    Bob解密并验证N_B - 1正确,即可确信对方确实拥有K_AB,从而完成了对Alice的认证。

协议缺陷与攻击

该协议存在一个著名的重放攻击(Replay Attack)

  • 攻击场景:假设攻击者(I)已经通过某种方式(如破解或泄露)获取了一个旧的会话密钥K_AB
  • 攻击流程
    1. 攻击者记录下在旧会话中A发给B的票据{ K_AB, A }_K_BS
    2. 新会话中,攻击者冒充A,将此旧票据重放给B。
    3. B解密票据,以为在与A通信,并使用旧的K_AB加密自己的新鲜随机数N_B发给“A”(实际被攻击者截获)。
    4. 攻击者用已知的旧密钥K_AB解密得到N_B,并计算出N_B-1,再用K_AB加密后发回给B。
  • 攻击结果:B成功完成了认证,相信自己正与A进行新鲜的安全通信,但实际上共享的是攻击者已知的旧密钥,通信内容可被攻击者解密。该攻击的本质是协议无法保证消息3(票据)的新鲜性

协议的改进

为解决上述缺陷,主要提出了两种改进思路:

  1. 引入时间戳(Timestamp):Denning和Sacco提出,在KDC生成的票据中加入时间戳T。接收方(Bob)通过检查时间戳是否在可接受的窗口内,来判断票据是否新鲜。这简化了协议(可省略消息4和5),但要求所有参与者时钟同步,这在分布式系统中并非易事。
  2. 增加一次握手:Kerberos认证协议基于此思想进行了改进,通过增加额外的认证步骤来确保票据的新鲜性。
posted @ 2026-06-22 19:53  lumiere_nebula  阅读(25)  评论(0)    收藏  举报