协议(16)

3.7.2  Needham-Schroeder协议

很多事情都可能出错,这里给出安全协议历史上一个著名的实例。很多现有的密钥分发协议都源自1978年的Needham-Schroeder协议[960]。这个协议和上面提到的有些类似,但是使用的是Nonce,而不是时间戳。该协议运行过程如下:

消息1  A→S:  A,B,NA

消息2  S→A: {NA,B,KAB,{KAB,A}}

消息3  A→B: {KAB,A}

消息4  B→A: {NB}

消息5  A→B: {NB-1}

这里,Alice发起请求,并向Sam声称:“我是Alice,我想和Bob通话,我的随机Nonce是NA。”作为应答,Sam给她提供一个会话密钥,该会话密钥用他和Alice共享的密钥进行加密。密文中也包括Alice的Nonce,因此她可以确定这不是一次重放。Sam还给她一个证书让她把密钥转给Bob。Alice把证书发给Bob,之后Bob进行一次“质询-应答”,以便确认Alice在场而且是就绪的。

这个协议有一个小问题:Bob必须假定他从Sam(经由Alice)那里收到的KAB是新鲜的,实际上可能并非如此——?Alice在第2和第3步之间可能等待了一年。在很多应用中,这个问题并不重要,甚至还可以帮助Alice缓存密钥,以预防服务器发生失败的情况。但是如果对手,比如Charlie获取了Alice的密钥KAS,他就可以使用这个密钥和其他很多主体建立会话密钥。

比如,假设Alice也申请并收到了和Dave进行通信的密钥,Charlie偷窃她的密钥以后,就可以假冒Alice向Sam发送消息,并获得与Freddie和Ginger进行通信的密钥。他还有可能观察到Alice和Dave通过协议交换的消息2。因此,现在Charlie可以冒充Alice与Dave、Freddie和Ginger进行通信。当Alice发觉其密钥被偷窃(或许是通过和Dave比较消息记录发现的),她就必须让Sam和每个她曾发放过密钥的人取得联系,并通知他们原来的密钥失效了。她本人无法做到这一点,因为她对Freddie和Ginger一无所知。换句话说,撤消权限是一个问题:Sam可能必须保留自己所做操作的全部日志,这些日志一直都在增长,除非主体的名字在将来某个固定的时间过期。

大概30多年以后,这个实例仍在安全协议领域引发争议。简化的观点是认为Needham和Schroeder做错了,Susan Pancho和Dieter Gollmann争论的观点(我比较倾向于这个观点)则认为,这又是一个改变假设而导致协议失败的实例[538、1002]。1978年时,计算机与通信网络还是一个文温尔雅的世界,当时的计算机安全是假定攻击者在系统之外,而现在必须把坏人假想为系统的用户。Needham-Schroeder的论文显式地假定所有主体都扮演自己的角色,攻击者都来自于外界[960]——?在这种假设下,当时的协议设计是合理的。

读书导航