Kerberos是认证协议。
要a访问b,请执行以下操作:
一般的认证只是b确认a不是假货。
在Kerberos中,不仅要保证上述问题,还必须保证a和b都不是假货
Step 1: A和KDC的相互认证(
在不告诉对方自己的密码的前提下,让对方知道自己有密码(向对方证明自己) )
以下是a向KDC证明自己的身份。 首先,a使用hash函数将自己的密码加密为私钥kclt(a (由a的密码加密)。
使用在a上生成的密钥Kclt加密时间戳,得到{timestamp}Kclt
a发送到KDC的AS_REQ包含以下数据
AS_REQ={timestamp}Kclt,a的信息,随机字符串图中的1
后面的字符串允许a验证KDC,加密时间戳可以防止重放攻击。
KDC收到AS_REQ后,可以使用从AS_REQ中读取a的信息来调用a的密码。
而且,通过与a相同的方式(用相同的散列函数加密a的密码),KDC也得到与a相同的Kclt,
然后,用该Kclt对{timestamp}Kclt进行解密,如果能够解密,则表示对方是a,通过KDC对a的认证也完成。
这样就完成了KDC对a的认证。
然后进行a对KDC的认证。 实际上,可以用Kclt对AS_REQ的随机字符串进行加密,然后发送到a。 一旦解了a,就完成了a对KDC的认证,但每次认证都会消耗KDC的资源,因为KDC必须从AS_REQ中检索a的信息并调用a的密码
首先,KDC直接生成两个用于以后a和KDC相互认证的密钥Kclt-Kdc,把其中一个交给a,另一个应该是自己的,但也交给a保管(KDC )
但是,不能把自己的钥匙就这样交给a。 有可能从假的客户端发送来假的密钥。 因此,KDC必须能够识别出这个密码确实是自己寄存在A上的。 因此,KDC使用由自己的密码hash组成的Kkdc对存储在a中的密钥进行加密。 (请注意,此处的密码是KDC自己的密码,而不是如上所述用于生成Kclt的a的密码。 如果这把钥匙回来了(这里是KDC自己的,但是寄存在a的钥匙和另一把真的是a的) )。
KDC用Kkdc加密的,不仅是自己交给别人的私钥,还有对方的信息,全部被称为TGT
TGT={对方的信息,Kclt-Kdc}Kkdc,
因此,回复a内容AS_REP具有以下内容
AS_REP=TGT,{Kclt-kdc,timestamp,随机字符串}Kclt图中2
TGT被寄存在a中,a不进行任意的解密操作,根据需要将其返还给KDC即可。
后面是用Kclt加密的内容,如上所述,Kclt会出现a的密码hash,所以只有a能解开。
然后,可以通过随机字符串判断KDC的身份。 也就是说,由a进行的KDC认证完成。
KLT-KDC:KDC和a即将用于认证的密钥,这是属于a的密钥,但TGT中的只是KDC自己的,暂时存储在a中。 一共2根)
这样就完成了a和KDC的相互认证,完成了图的1、2
步骤2 a是向KDC认证b的方法(还是在a和KDC之间完成的,b没有参加)对应图3、4 a为了让KDC帮助认证b,必须告诉KDC认证谁,也就是说要向KDC发送b的信息。
别人的东西也要还。 也就是说,KDC暂时存放在a的TGT也必须送回KDC。 另外,还有用于a和KDC相互认证的信息。 (
因此,a发送到KDC的消息TGS_REQ具有以下部分:
TGS_REQ=TGT,b的信息、{A的信息、timestamp}Kclt-Kdc图中3
TGS_REQ的信息包括返回给KDC的TGT、a要验证的b的信息以及证明自己身份的信息。 此时,KDC还没有这个密钥。 KDC的密钥在TGT中,所以还没有发送到KDC。
KDC收到TGS_REQ后,用自己的Kkdc对TGT进行解密(TGT是KDC用自己的Kkdc加密的),得到密钥Kdlt-Kdc,可以解密之后的{A的信息,timestamp}Kclt-Kdc
然后,KDC必须向a提供a和b认证所需的信息。 此时,KDC在a和b之间生成两个用于认证的密钥Kclt-srv。 上述Kclt-kdc用于a和KDC之间的相互认证。 一个是a,另一个是b,但b从a传递到b,临时存储上述a和KDC的密钥Kclt-kdc
srv来对属于B的那把密钥进行加密,叫做Ticket(要发给B的)Ticket = {A的信息,Kclt-srv}Ksrv 用Ksrv来加密,只有B能解开,里边存放了A、B间相互认证使用的密钥
KDC发给A的回复信息包括
TGS_REP = {Kclt-srv}Kclt-kdc, Ticket 图中4
其中包含要转交给B的Ticket,
还有属于A的那把用于A与B认证的密钥(用A与KDC间的密钥Kclt-kdc加密,因为这是KDC与A之间交换的数据)
A收到TGS_REP之后,就有了一把与B之间相互认证的密钥:Kclt-srv, 还有要交给B的Ticket,
此时B是没有用于与A相互认证的密钥的,还在Ticket中(未发送)。
Step 3 A与B相互认证AP_REQ : A给B发送 {A信息,timestamp}Kclt-srv, Ticket 图中5
B收到这个Ticket,用自己的Ksrv解开得到与A间认证的密钥Kclt-srv, 然后用这把密钥解开 {A信息,timestamp}Kclt-srv,
来完成对A的身份的认证
AP_REP : B向A证明自己的身份,AP_REP = {timestamp}Kclt-srv, 图中6
如果A能解开,说明B是真的,其他人不可能有这把密钥(Kclt-srv)
Reference : 《Wirshark 网络分析就这么简单》 洁净的篮球