来源: http://blog.csdn.net/dog250/article/details/5468942
kerberos是一个基于对称密钥的认证系统,事实上它有时候比基于非对称密钥的pki工作的更好,特别是在小规模网络架构时,管理上更加集中和方便,甚至效率更高。那篇经典对话相信很多人都能将之读完,但是读完之后同样很多人需要时间来消化,事实上那篇对话并不仅仅是在讲kerberos的原理,它更多的意义在于展示了一种研究问题的方法,从简单到复杂,一点一点的弥补漏洞,最终加上众多的权衡,得到一个既安全又高效并且可行的方案。本文简要概括kerberos的具体过程。
kerberos有三个最重要的规则,一是从不在网上传输明文,这保证了认证过程的保密性,这是一切的前提,二是在认证和被认证双方共享一个秘密,这保证了认证的根本,即不可冒充和不可伪造性,那么kerberos是怎么做到的呢,三是存在一个公信度很高的受信任机构,这保证了认证本身的保密和不可冒充,在认证体系上,kerberos是集权的,而pki是相对民主的?kerberos的过程大致分为两步,第一步是准入认证,第二步是通信认证,首先看第一步的过程:
1.首先新接入网络的客户端需要从受信任的机构获取一份准入声明,也就是获得受信机构的信任,它只需要简单发送用户名到该机构;
2.受信机构通过用户名查到用户的密码,然后生成一份准入证书(包含客户端的信息)和一个客户端和受信机构共享的一个共享密钥,用客户端的口令加密后发送给客户端;
3.客户端收到加密的准入证书和共享密钥之后会用只有自己和受信机构知道的自己的密钥进行解密,得到共享密钥,至此,客户成为准入的;
注意:每个服务器进入网络也同样需要进行同样的准入认证,过程稍有不同但是大致一致。
下面是第二步:
1.接下来如果客户端需要和某个服务器通信,那么它会将服务器的id连同自己的准入证书用和受信机构共享的密钥加密后连同一个验证器(用共享密钥加密的用户信息)以及用户信息的明文一同传给受信机构;
2.受信机构收到请求后,将验证用户的准入性,通过用户名查询共享密钥,用共享密钥解密验证器后和明文用户信息对比,如果一致则通过认证;
3.受信机构根据请求的服务器id生成一个该服务器和客户端共享的密钥,然后用受信机构和客户端的共享密钥将它和用户信息以及服务器信息以及时间戳信息加密后传回客户端;
注意:用户信息以及服务器信息以及时间戳信息本身中包含客户端和服务器的共享密钥并且是用被请求服务器的密钥加密的,因此客户端不可能得到更多的信息,不可能伪造和服务器通信的凭证。
4.客户端收到包后用和受信机构共享的密钥解开包,取出和服务器共享的密钥,然后用该密钥加密一段客户端的信息--验证器,将这个加密信息和从受信机构解出的剩下部分一并发给服务器;
5.服务器收到后,先用自己的密钥解密第4步中所谓的剩下的那一部分,从中得到那个自己和客户端共享的口令,然后用这个口令解密客户传来的验证器,比对信息,如果正确则通过验证。
上面就是整个kerberos的认证过程,其中省略了用时间戳限制使用时间的机制(我本人不喜欢这样的机制,感觉很不完美),要点就是服务器的秘密不能让客户端知道,但是客户端只有掌握了服务器的秘密才能让服务器彻底认为它是受信的,试想你仅将秘密告诉你信任的人,反过来一个人如果知道你的秘密那么你很大程度要信任他,使这样吗?kerberos可不敢保证,客户端可能保存那个秘密,进而可能让很多客户端都知道服务器的秘密,于是就出现了上述复杂的kerberos机制。在rsa出现之后,上面的一切只用两步就能搞定,一个是加密一个是签名,并且协商密钥时可以用数字信封,可以用dh,但是要知道非对称密钥体系是需要代价的,在小规模网络,kerberos有着很大的用武之地,但是KDC的单点故障对安全影响很大,所以必须尽一切力量保护kdc,而pki就不用,毕竟密钥信息已经内置进数字证书了。顺便指出的是,ssl握手中的密钥协商过程也可以采用kerberos的方式协商一个密钥,过程如下:客户端已经得到受信机构提供的和某一个服务器通信的凭证,包含经客户端和受信机构共享密钥加密的客户端和服务器共享的口令以及一个同样包含该口令的“证书”,此处的“证书”就是那篇经典对话中的“票”(经服务器的密钥加密),在ssl的ClientKeyExchange消息中,客户端将“证书”和经和服务器共享的口令加密的pre_master_secret一起发给服务器,服务器用自己的密钥解密“证书”,然后取出和客户端共享的口令,解密pre_master_secret。