坏设计的例子:挑战认证

一个合作公司,给出了一个挑战认证的设计,需要我在客户端实现。这个设计真是太烂了。给他们提建议了他们也不理,很不爽。这里写下这种设计,算是一个反面教材吧。

Client -> Server : Register(SerialNum)
Server --> Client : RegisterOK(Challenge)
Client -> Server : Authenticate( Hash(SerialNum || Challenge))
Server --> Client: AuthenticateOK

图1

这就是协议本身,正确的设计应该是这样的

Client -> Server :  Register
Server --> Client : RegisterOK(Challenge)
Client -> Server :  Authenticate(Username, Hash(Challenge || Passphrase))
Server --> Client : AuthenticateOK

图2

或者

Client -> Server :  Register(Username)
Server --> Client : RegisterOK(Challenge)
Client -> Server :  Authenticate(Hash(Challenge || Passphrase))
Server --> Client : AuthenticateOK

图3

为什么图1中连Passphrase都没有?在该设计的上下文环境中,Passhprase用于计算Serialnum,而不参与协议交互!如果是这样的话,Server能够用相同的算法计算Serialnum也还说得过去,但是事实上是没有,并且这个Serialnum还同时充当了今后的授权ticket! 该设计真的让我恶心到极点!