密码协议可以划分为基于对称密钥的密码协议、基于证书的密码协议、基于身份的密码协议、基于口令的密码协议,以及混合的密码协议;根据参与方的个数,密码协议包括两方的密码协议和多方的密码协议。
在密码协议的设计过程中,很容易出现各种各样的逻辑漏洞,研究人员在密码协议的设计实践中总结了大量的失败教训,得到了若干设计原则。在设计密码协议时,一般遵循一些默认的假设和原则。下面的这些设计准则是由Abadi和Needham归纳出的。需要说明的是,准则本身是一种非形式化的指导方针,独立于任何逻辑。尽管准则可以使协议的设计者避免一些错误,却不能保证完全符合这些准则一定得到安全的密码协议;相反,不遵守这些准则,就有可能导致漏洞的出现。
准则一:每个消息应该精确、完全地表达所要表达的意义,即对于消息的解释仅仅取决于消息本身,而不必借助上下文来推断。
准则二:对于一个消息采取行动的先决条件应该明确无疑,以便任何使用者都可以根据条件来判断是否采用该协议。
准则三:如果主体的身份对于某个消息的意义来说是必要的,那么应该谨慎处理主体的身份信息,如在消息中明确地提到主体的名字。
准则四:应该清楚地知道协议中使用加密的目的,因为加密不是一种简单的运算,它需要的计算量较大,不清楚加密的目的可能会导致冗余,而不正确的使用加密将导致协议的错误。
准则五:如果主体对已加密的消息进行了签名操作,那么不能由此推断出主体知晓该消息的内容。反之,如果主体对消息先签名然后再加密,那么可以推断出主体知道该消息的内容。
准则六:要清楚地知道协议中所使用的临时值的特性。临时值可以用于确保时间上的连续性,也可以用于确保关联性,还可以通过其他方式建立关联性。
准则七:在挑战—响应交换中可以使用可预测的值(如计数器的值)来保证新鲜性,但是如果这一可预测的值对协议的影响很大,那么就应该对该值进行保护,这样入侵者就不能模拟挑战、以后再重放响应。
准则八:如果时间戳是根据绝对时间来保证其新鲜性的,那么不同机器的本地时钟差别需要小于消息允许的有效范围。而且,所有地方的时间维护机制需要成为可信计算基的一部分。
准则九:一个密钥可能在最近使用过,如果用来加密一次性随机数,很可能是相当旧的,甚至已经被泄露。
准则十:如果用一种编码来表达消息的意义,那么应能区分使用的是哪一种编码。通常情况下,编码是与协议相关的。经过某种编码以后,应能推出消息是属于某个协议,进一步说是属于协议的某一次特定运行,而且知道该消息是协议中的第几条消息。
准则十一:协议设计者应该知道他所设计的协议依赖于哪种信任关系,以及为何这种依赖是必不可少的。