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]——?在这种假设下,当时的协议设计是合理的。