Needham-Schroeder协议

最近学习了一些账户登录和验证相关的知识,了解了OpenId机制的一些技术细节,发现OpenId的验证机制和某些基于Web的SSO验证机制非常类似,但不知道这些验证机制的原型和出处,于是开始转向学习Kerberos - Unix平台上一个老牌的单点登录验证系统。在《Kerberos权威指南》里找到了“Needham-Schroeder协议”,虽然不知道这个协议与其后出现的Web SSO和OpenId有没有渊源,但是学习这个协议对于理解SSO非常有帮助。

借助受信任的第三方相互验证

《在大型计算机网络中使用加密身份验证》是Roger Needham和Michael Schroeder 1978年在施乐帕罗奥多研究中心(当年乔布斯偷师的地方)工作时发表的一篇论文。该论文讨论了在非安全网络环境下,通讯双方如果借助一个共同信任的第三方相互验证的方法。

协议假设有三方参与,一个客户机,一个应用服务器和一个验证服务器。客户机可以是某台请求验证的机器,通常是个人电脑。服务器提供客户机希望访问的服务,比如邮件服务。而验证服务器是一台专门的服务器,用于存储网络上用户和服务器的密钥(受信任的第三方)。

协议的两个版本

  • 基于对称密钥算法的Needham-Schroeder协议。Kerberos单点认证系统基于此协议扩展,该协议旨在双方之间在网络上建立会话密钥,以保护之后的通讯。
  • 基于非对称密钥算法的Needham-Schroeder协议。该协议的目的是提供在网络上通信的双方之间的相互认证,但其建议的形式是不安全的。

下面采用安全协议标记法(security protocal notation) 来表示两种不同版本的Needham-Schroeder协议

对称密钥版本

假设,Alice(简称A)发起向Bob(简称B)的通信。Server(简称S)一个被双方信任的服务器。

在通信中:

  • A和B分别是Alice和Bob的身份标识
  • KAS是A和S的对称密钥
  • KBS是B和S的对称密钥
  • NA和NB分别是A和B生成的随机数nonces
  • KAB是一个生成的对称密钥,将用于A和B之间的会话的会话密钥。

步骤如下:

  1. Alice向服务器发送一条包含她本人和Bob标识的消息,告诉服务器她想和Bob通信。


2. 该服务器产生KAB,并发送回Alice一个副本和一个被KBS加密的副本由Alice转交给Bob。由于Alice可能同时发出多份通信验证请求,所有nonce保证响应消息是新的和并与某一请求对应。在响应中加入了Bob的标识以告诉Alice她将与谁共享该密钥。


3. Alice将KAB密钥转交给Bob,他能通过KBS密钥(他于服务器的共享密钥)解密出该密钥,以验证数据的可靠性。


4. 然后Bob想Alice发送一个通过密钥KAB随机数nonce,表示他以获得密钥


5. Alice对接收到的随机数nonce进行简单的操作,重新进行加密,并把它发送回确认她也持有密钥并且仍处于活跃状态。

攻击该协议

该协议可被回放攻击。如果攻击者使用一个陈旧的被窃取的KAB,他可以回放{KAB, A}KBS给Blob,Blob不但不知道这个密钥是已过期,反而欣然接收请求。

改进版本

Kerberos协议通过加入时间戳改进了这一缺陷。也可以引入随机数nonce。

  1. Alice向Bob发起请求

  2. Bob响应她一个随机数nonce,该随机数被bob和认证服务器的对称密钥加密

  3. Alice发送一个消息给服务器包含自己和鲍勃的标识,告知她想要与Bob通信服务器。

  4. 注意包含的随机数

接下来的3步与上面协议描述的类似。注意N’B不同于NB。新包含的随机数可以防止回放被窃取的{KAB, A}KBS,由于新的消息格式为{KAB, A, N’B}KBS,攻击者无法伪造,因为他得不到KBS密钥。

非对称密钥版本

该版本使用了公钥加密算法 假设,Alice(简称A)和Bob(简称B)都使用信任的服务器(简称S)发布的公钥用于请求。 这些密钥是:

  • KPA和KSA,分别表示A的公钥和私钥对。其中(S表示“Secret Key”)
  • KPB和KSB,是B的密钥对。
  • KPS和KSS,是S的密钥对。

协议的步骤是:

  1. A向S请求B的公钥

  2. S响应B的标识和公钥,并使用自己的私钥加密数据,以便A验证自己。

    3. A引入随机数NA,然后发送给B

  3. B向S请求A的公钥

  4. S的响应

  5. B引入随机数NB和NA使用KPA加密后发送给A,以证明他的能力。

  6. A发回确认请求包含NB,以证明他能使用KSA解密

最后,A和B双方相互确认,也都知道随机数NA和NB。这些随机数不为窃听者所知。

攻击该协议

遗憾的是,该协议可被中间人攻击。如果一个骗子能说服A向他发起会话,然后他将消息传输给B,让B误以为在与A进行通信。

下面攻击的过程忽略了与S的通信,因为没有差异:

  1. A向I发送NA,使用I的公钥KSI

  2. I将消息转发给B,假装A在于他进行通信

  3. B发回BN

  4. I转发给A

  5. 加密的BN被发回,向I确认。

  6. I重新加密BN,向B假装他成功解密了。

最后,B错误的以为A在与他进行通信,随机数NA和NB仅仅被A和B知道。

防止中间人攻击

这个攻击方法是1995年Gavin Lowe在他的一篇论文中首次提出。文中还提供了该协议的一个修复版本,被称作Needham–Schroeder–Lowe协议。修复版本修改了第六步的消息。

改为:

参考资料

[1]. 《Kerberos:The Definitive Guide》by Jason Garman August 2003
[2]. 《Using Encryption for Authentication in Large Networks of Computers》Roger M.Needham and Michael D. Schroeder 1978
[3]. Needham–Schroeder protocol from Wikipedia
[4]. Security protocol notation from Wikipeida