二、关于Kerberos
(有一些细节没有描述,如时间戳)
Kerberos能提供身份认证、数据完整性和数据私有性。 |
1、 产生:MIT
2、 名字起源:守护地狱的三只狗
3、 基础:单密钥加密技术
a) 加密解密使用同一密钥(密钥就是有一定长度的字符串)
b) 最大的问题就是密钥分发问题
c) 常使用的算法:DES ,Triple-DES ,RC2 ,RC4
4、 Kerberos中的密钥分发方法和交互登陆方法
口令密钥:用户登陆时使用
动态密钥:使用其他服务时使用
1) 用户登录
a) 口令密钥是用户密码的散列值,散列是单向的。
b) 服务器方面并不保存用户口令的明文,而是保存口令的散列值
单密钥如何提供身份认证? 如果你和我共享一个密钥,我给你发个用此密钥加密的信息,如果你用这个密钥解开了信息并且与我发的信息相同,就表明了我身份。 我不需要传递密钥。 |
c) 这个加密的信息称为Ticket:Ticket是用一些明文信息和用自己的密钥加密的密文组合的一个数据结构。其中包含的重要信息有:明文中有用户名;密文中有Ticket标志、会话密钥、用户名、时间戳、地址、令牌;
在进行身份认证时Ticket中的明文包含用户名,密文中也包含用户名,所以服务器在得到某个用户认证时查找明文中指出的用户的服务器端的口令散列密钥并用它解密,如果密文中的用户名和当前用户名相同就可以认定此用户是合法用户。 |
d) 其他名词
KDC:密钥分发中心,动态生成会话密钥
KX:密钥,x的私钥
{anyting} KX:用x的私钥加密后的信息
{T}KX:用x的私钥加密后的证书
KX,y:x和y的会话密钥
{anyting} KX,y:用x和y的会话密钥加密后的信息
e) 用户第一次登陆到服务器
客户方发送Ticket中包含明文的用户名和加密的用户名、时间戳和等KDC接收到请求后按以前说过的方法进行用户的身份认证。
如果用户身份已经验证并正确那么KDC发送给客户端两部分内容。第一部分为KDC动态产生一个客户和KDC以后要进行会话的会话密钥Kk,c,并用KDC的密钥Kk 将Kk,c 和客户的一些信息保存成为一个TGT,即{TGT}Kk。第二部分为用客户的KC将Kk,c 进行加密,即{ Kk,c }KC。
客户收到此Ticket后用自己的KC解密后可得到Kk,c
以后客户有请求时(下一节描述的第一个过程),将请求的内容用会话密钥进行加密并将{TGT}Kk连接发送过去KDC用Kk解开{TGT}Kk后得到Kk,c 并用它来解开用户请求的内容。
2) 使用其他服务
a) 用户使用某种资源时必须获得指向该服务的Ticket,因为这Ticket中包含了用户和服务进行通讯的会话密钥。
b) 请求专门用来发放Ticket的Ticket叫TGT(Ticket-Granting Ticket)。
c) 客户与使用服务S的安全资源时的认证过程如下:
用户用与KDC会话的密钥Kk,c加密与服务器S连接的请求,并附带KDC以前传来的{TGT}Kk
KDC接收{TGT}Kk{Authenticator}Kc,k
Ticket后用自己的密钥Kk解开{TGT}Kk 从TGT中取出会话密钥Kc,k再用它解开{Authenticator}Kc,k得到客户要与服务S连接的信息(间接的表明KDC不保存会话密码,以后的服务相同),之后创建新的客户与服务S会话的密钥Ks,k并查找服务S的密钥对其它和其它信息加密形成{T}Ks,再把会话密钥用Kc,k进行加密发送给客户端。
客户接收后用Kc,k解开{Kc,s}Kc,k从中取出客户与服务S进行会话的密钥,并将请求的服务用它加密,附上KDC传来的{T}Ks传给S服务器。S服务器根据自己的密钥Ks将{T}Ks解开从T中得到会话密钥Kc,s ,用它解开{Authenticator}Kc,s 得到客户的请求并根据客户的令牌的能力提供服务。
数据完整性:使用MD5对发送的消息和其他信息计算校验和并用RC4算法用会话密钥进行加密。 |
数据私有性:用会话密钥进行加密后只有数据传输的双方知道密钥。 |
5、 双向认证
客户如何确定服务器就是它所声称的服务器呢?
可能一个伪装的服务器做出一个这样的Ticket。
在这一步中客户可以得到会话密钥,而且TGT中也包含这个会话密钥Kc,k所以如果知道KDC的密钥Kk就可以知道KDC是否也知道会话密钥了,就确定了服务器的身份。也就是说如果进行双向认证必须得知道KDC口令(服务器雷同)。