Kerberos V5 协议

来源:互联网 发布:视频网站源码 编辑:程序博客网 时间:2024/06/05 14:13

Kerberos V5 协议

1. 简介

         Kerberos协议是由MIT大学研究并开发出的一种网络认证协议,其设计目标是通过密钥系统为客户机 / 服务器应用程序提供强大的双向认证服务。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据。在以上情况下, Kerberos 作为一种可信任的第三方认证服务,是通过传统的密码技术(对称加密)执行认证服务的。

——来自百度百科。

2. 术语解释

2.1. 角色:KDC、KDC-TGS、SERVER、CLIENT

         KDC:keydistribute center,密钥分发中心,向用户提供身份认证,并为其分发TGT和登录会话密钥(取名:lsk)。

         KDC-TGS:KDC-ticketgranting service,服务票证许可服务组件,向用户分发ST和服务会话密钥(ssk)。

注:KDC和KDC-TGS可以在一个主机上,他们共享一个数据中心(可以是数据库或者缓存池),该数据中心存储了所有用户的长期密码(UK)以及服务(SERVER)的长期密码(SK),并且KDC自己的长期密码(KK)也放在数据中心。

         SERVER:向用户提供具体的服务的服务端,需要预先在KDC中注册,使得KDC知道自己的服务,以及自己的长期密码(KK)。

         CLIENT:用户,也需要预先在KDC中注册。

2.2. 密钥和票证

         密钥分为长期密钥和短期会话密钥,长期密钥一般是很长时间段有效的,比如用户的密码可能就从来不会更改。短期会话密钥用以在用户和服务器(包括KDC-TGS和SERVER)之间交互的密钥,这种密钥当超过一个时间就会失效。

         用户密码:UK,长期有效密钥。

         KDC的密钥:KK,KDC和KDC-TGS共享的长期密钥。

         SERVER的密钥:SK,SERVER的长期密钥。

         登陆会话密钥:lsk,短期密钥,由KDC生成,并分发给用户,用户以此密钥与TGS交互。

         服务会话密钥:ssk,短期密钥,由TGS生成,并响应给用户,用户以此密钥与SERVER交互。

         TGT:服务许可票证,包含lsk和用户信息,由KDC创建。此票证相当于到TGS的门票,TGS从门票中可以获取到lsk,然后认证用户。

         ST:服务票证,包含ssk和用户信息,有TGS创建。此票证相当于到SERVER的门票。SERVER从门票中可以获取ssk,以此认证用户,具体认证过程参看下一章。

3. 认证原理

Kerberos的认证原理流程图如下图所示:

 

 

 

 

 

 

 

 

 

 

 


详细步骤分析如下:

1.        Client向KDC请求身份认证。需要向KDC提供三个信息:

A、用户名:name。

B、请求TGT所需要的服务信息:Sinfo

C、用户密码加密的认证符(一般可为时间戳):E(UK, T1)。

                   注:E(UK, T1) 表示用 用户的密码UK 将认证符即时间戳T1加密。

2.        KDC先从数据中心中根据client传过来的name查找出client的UK,然后用UK解密加密的T1(D(UK, T1)),如果时间戳是解密有效的,则身份认证通过,证明请求的用户没有被冒充。然后KDC根据用户信息等创建一个登陆会话密钥lsk,并且创建一个TGT,TGT的内容包含了lsk和用户信息。

3.        身份认证通过后,KDC响应client,响应内容如下:

A、 E(UK,lsk) :经过用户密码UK加密的登陆会话密钥lsk。

B、 E(KK,TGT) :经KDC的密码KK加密的TGT。

4.        客户端用户使用自己的长期密码UK解密获取得到lsk:即D(UK,lsk)。并将lsk缓存在本地,同时将KDC传过来的用KK加密的TGT也缓存在本地。

5.        用户向KDC-TGS请求服务票证ST和服务会话密钥ssk。请求携带的内容如下:

A、E(lsk,T2) :使用登陆会话密钥加密的T2。

B、E(KK,TGT) :缓存中的使用KDC的密码KK加密的TGT。

C、Sinfo:用户想访问的服务和服务器的名称等。

6.        TGS先用与KDC共享的KDC密码KK解密TGT,然后从中获取得到lsk并缓存之,再用lsk解密T2,验证时间戳是否有效,验证通过则根据Sinfo信息,查看用户是否有访问SERVER的权限,如果有,则下一步。

7.        根据用户信息等生成一个服务会话密钥:ssk,以及生成一个服务票证ST(C(ssk,ST)即表示生成ssk和ST),ST中包含了ssk和用户信息等。然后根据SInfo找到SERVER的长效密钥SK。

8.        使用lsk加密ssk:E(lsk,ssk),使用SK加密ST:E(SK,ST),然后将加密后的ssk和ST响应给client。

9.        用户使用lsk解密获取得到ssk:D(lsk,ssk),并将ssk缓存在本地。并且将使用SK加密的ST也缓存在本地。

10.    然后用户向真正的服务SERVER请求,携带内容如下:

A、E(ssk,T3):使用服务会话密钥加密的认证符T3。

B、E(SK,ST) :使用服务端的长期密码SK加密的ST,此数据时缓存在本地的,用户不知道SK。

11.    服务端先使用SK解密获取的到ST,然后从ST中获取得到ssk,然后用ssk解密获取得到T3,验证时间戳是否有效,验证通过后缓存ssk,响应client。

12.    用ssk加密T4(也可以直接是T3),请求用户验证。

13.    用户使用ssk解密T4,验证时间戳是否有效。如果有效,证明服务端没有被冒充,因为它能解密得出ST,然后获取的到ssk,说明它是知道SK的。

到此用户client和Server之间就作了双向的认证,此后用户可以以ssk去访问Server。

3.1. 几个为什么?

1.        为什么要两次获取票证,怎么不直接在KDC层就获取得到ST,去除掉获取TGT这一层?

因为假如ssk过期时间为5分钟,当SERVER发现(通过比对当前时间戳和缓存的ssk的时间戳)ssk失效,则告知用户需要重新获取ssk和ST。用户此时需要向TGS请求新的ST和ssk,此时请求携带的内容仍然是E(lsk,Tn)和E(KK,TGT),后者是缓存在本地的。如果没有TGS,则需要直接到KDC去请求,所携带的内容变为:E(UK,Tn)和用户名,以及服务端信息。

如果lsk的过期时间是10个小时,则如果有TGS层,则10个小时后lsk才会失效,才会去请求KDC。如果没有TGS层,则如ssk失效时间为5分钟,则每5分钟就会去KDC请求新的会话密钥。

而有个原则为:使用长期密钥加密的数据,尽量不要在网络上传输。因此,增加了TGS层,则登陆会话密钥 失效后 才会使用 UK加密的数据 去请求新的会话密钥。

这样就减少了使用长期密钥加密的数据在网络上传输的次数。

2.        采用对称加密如何进行认证?

这是有个前提条件:假定各个角色的长期有效密码(UK、KK、SK)除了他们之间晓得,是没有其它人知道的。如:用户和KDC之间,用户A使用了自己的密码UK加密T1发给KDC,KDC从数据中心获取用户A的UK,然后解密出T1,说明用户就是用户A,因为密码就只有KDC和用户他们之间知道。在TGS和用户之间是一样的道理,只是TGT加密的过程在KDC上,加密的数据缓存在用户本地,这样只要TGS能解密出TGT,就说明他是TGS,因为密码KK只有KDC和KDC-TGS知道。

3.        为什么可以防窃听、防重演(Replay Attac)攻击?

防窃听:因为服务会话密钥的有效时间可以比较短,如果你窃听到用户发出的数据,即使你将密钥解密出来,此时该密钥也过期了。

防重演:因为每次访问使用的ssk服务会话密钥加密的认证符的内容包含有时间戳,如果重演,时间戳是无效的。

0 0
原创粉丝点击