kerberos课程设计.docx
- 文档编号:24450997
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:27
- 大小:483.75KB
kerberos课程设计.docx
《kerberos课程设计.docx》由会员分享,可在线阅读,更多相关《kerberos课程设计.docx(27页珍藏版)》请在冰豆网上搜索。
kerberos课程设计
第一章需求分析
1.1引言
1.1.1Kerberos的发展背景
Kerberos是美国麻省理工学院(MIT)在20世纪80年代中期开发的雅典娜(Athena)项目中的一个部分。
Kerberos协议用来保护ProjectAthena提供的网络服务器。
这个协议以希腊神话中的人物Kerberos(或者Cerberus)命名,他在希腊神话中是Hades的一条凶猛的三头保卫神犬。
目前该协议存在一些版本,版本1-3都只有麻省理工内部发行。
Kerberos版本4是一个真正投入实际应用的、网络环境下的身份验证系统。
Kerberos版本5是对版本4的扩展版本,引入了在新的网络环境的身份验证功能,例如跨管理域的身份验证功能等。
Kerberos版本5是IETF标准化的版本。
麻省理工在版权许可的情况下,制作了一个Kerberos的免费实现工具,这种情况类似于BSD。
在2007年,麻省理工组成了一个Kerberos协会,以此推动Kerberos的持续发展。
因为使用了DES加密算法(用56比特的密钥),美国出口管制当局把Kerberos归类为军需品,并禁止其出口。
一个非美国设计的Kerberos版本4的实现工具KTH-KRB由瑞典皇家理工研制,它使得这套系统在美国更改密码出口管理条例(2000年)前,在美国境外就可以使用。
瑞典的实现工具基于一个叫做eBones的版本,而eBones基于麻省理工对外发行的基于Kerberos版本4的补丁9的Bones(跳过了加密公式和对它们的函数调用)。
这些在一定程度上决定了Kerberos为什么没有被叫做eBones版。
Kerbberos版本5的实现工具,Heimdal,基本上也是由发布KTH-KRB的同一组人发布。
1.1.2什么是Kerberos
其实Kerberos是一种网络认证协议,其设计目标是通过密钥系统为客户机/服务器应用程序提供强大的认证服务。
该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据。
在以上情况下,Kerberos作为一种可信任的第三方认证服务,是通过传统的密码技术(如:
共享密钥)执行认证服务的。
Kerberos协议主要用于计算机网络的身份鉴别(Authentication),其基本思想是:
能正确对信息进行解密的用户就是合法用户。
用户在对应用服务器进行访问之前,必须先从第三方(Kerberos服务器)获取该应用服务器的访问许可证(ticket)。
其特点是用户只需要输入一次身份验证信息就可以凭借此次验证获得的票据(ticket-grantingticket)访问多个服务,即SSO(SingleSignOn)。
由于在每个Client和Service之间建立了共享密钥,使得该协议具有相当的安全性。
1.2Kerberos协议基本原理
Kerberos使用了一个涉及客户端、应用服务器和一个Kerberos服务器的协议。
这个协议的复杂性反映了这样一个事实:
敌手有许多威胁安全的方法。
Kerberos是设计用来对抗针对客户端/服务器对话安全多种威胁的。
它的基本思想非常简单。
在一个不受保护的网络环境中,任何一个客户端可以使用任何一台服务器提供的服务。
(1)客户请求Kerberos认证服务器发给接入KerberosTGS(门票分配服务器)的门票。
请求以报文形式形成。
(2)认证服务器在其数据库中查找客户实体,产生一个会话密钥,Kerberos使用客户的秘密密钥对此会话密钥进行加密;然后生成一TGT(门票分配许可证),该许可证包括客户实体名、地址、TGS名、时间印记、时限、会话密钥等信息;并用TGS的秘密密钥(此密钥只有认证服务器和TGS知道)对TGT进行加密;认证服务器把这两个加密报文发还给客户。
(3)客户将第一个报文解密得到会话密钥,然后生成一个认证单,包括客户实体名、地址及时间印记,并用会话密钥对认证单进行加密。
然后,向TGS发出请求,申请接入某一目标服务器的门票。
此请求包括目标服务名称、收到Kerberos发来的加过密的TGT以及加密的认证单。
(4)TGS用其秘密密钥对TGT进行解密,使用TGT中的会话密钥对认证单进行解密。
然后将认证单中的信息与TGT中的信息进行比较。
此时,TGS产生新的会话密钥供客户实体与目标
服务器使用,利用客户实体和TGS用的会话密钥将新的会话密钥加密;还将新的会话密钥加入客户向该服务器提交的有效门票之中,门票中还包括客户实体名、网络地址、服务器名、时间印记、时限等,并用目标服务器的秘密密钥将此门票加密;然后将这两个报文发送给客户。
(5)客户将接收到的报文解密后,获得与目标服务器共用的会话密钥。
这时,客户制作一个新的认证单,并用获得的会话密钥对该认证单进行加密。
当请求进入访问目标服务器时,将加密的认证单和从TGS收到的门票一并发送给目标服务器。
由于此认证单有会话密钥加密的明文信息,从而证明发信人知道该密钥。
(6)目标服务器对门票和认证单进行解密检查,包括地址、时间印记、时限等。
如果一切都核对无误,服务器则知道了客户实体的身分,并与之共享一个可用于他们之间秘密通信的加密密钥。
1.3Kerberos协议的优缺点
1.3.1Kerberos协议的优点:
1.安全性高:
Kerberos系统对用户的口令进行加密后作为用户的私钥,从而避免了用户的口令在网络上显示传输,使得窃听者难以在网络上取得相应的口令信息;
2.透明性高:
用户在使用过程中,仅在登录时要求输入口令,与平常的操作完全一样,Kerberos的存在对于合法用户来说是透明的;
3.可扩展性好:
Kerberos为每一个服务提供认证,确保应用的安全。
1.3.2Kerberos协议的缺点:
1.Kerberos服务器与用户共享的秘密是用户的口令字,服务器在回应时不验证用户的真实性,假设只有合法用户拥有口令字。
如攻击者记录申请回答报文,就易形成代码本攻击。
2.AS与TGS是集中式管理,容易形成瓶颈,系统的性能和安全也严重依赖于AS和TGS的性能和安全。
在AS和TGS前应该有访问控制,以增强AS和TGS的安全;
3.随着用户数的增加,密钥管理较复杂。
Kerberos拥有每个用户的口令字的散列值,AS与TGS负责用户间通信密钥的分配。
当N个用户想同时通信时,仍需要N(N-1)/2个密钥。
第二章概要设计
2.1Kerberos模型设计
图2-1
在上图中,Kerberos认证的基本流程有以下几步:
用户在客户机的登录步骤:
1.用户输入用户名和密码到客户机。
2.客户机程序在输入的密码上运行一个单向函数。
客户机用户认证步骤:
1.客户机向AS发送一个明文信息,代表用户请求服务。
举个例子:
“用户PWZ想请求服务”。
此时,既不需要向AS发送密钥,也不需要发送密码。
2.AS校验这个客户是否在它的数据库里。
如果在,AS返回以下两条信息给客户:
a.经过客户密钥加密的客户/TGS会话密钥。
b.用TGS密钥加密的票据授权票据(包括客户ID,客户网络地址,票据有效期,客户/TGS会话密钥)。
3.一旦客户收到消息a和b,他解密消息a得到客户/TGS会话密钥。
会话密钥用在将来与TGS的通信上,这样的话,客户有了足够的消息向TGS证明自己的身份。
客户服务认证步骤:
1.当申请服务时,客户向TGS发送以下两条消息:
c.由从消息b中获取的票据授权票据和申请的服务的ID组成。
d.用客户/TGS会话密钥加密的认证(由客户ID和时间戳组成)。
2.基于收到的消息c和d,TGS从消息c中重新获得消息b。
它用TGS的密钥解密消息b。
这一步使它得到“客户/TGS会话密钥”。
通过使用这个密钥,TGS解密消息d(认证),而后返回给客户以下两条信息:
e.用服务器密钥加密的客户—服务器票据(包括客户ID,客户网络地址,客户/服务器会话密钥的有效期)。
f.用客户/TGS会话密钥加密的客户/服务器会话密钥。
客户服务申请的步骤:
1.基于从TGS收到的消息e和f,客户有足够的信息向service认证自己。
客户联系service,并向它发出以下两条消息:
e.由先前的步骤得到(客户—服务器票据,用服务器的密钥加密)。
g.用客户/会话密钥加密的一个新的认证,包括客户ID,时间戳。
2.service用自己的密钥解密票据重新得到客户/服务器会话密钥。
用这个会话密钥,service解密得到认证,并返回以下消息给客户,确认他的身份,并乐于向客户提供服务:
h.在客户认证中找到时间戳,加1,用客户/服务器会话密钥加密。
3.客户使用客户/服务器会话密钥解密确认函,并检查时间戳是否被正确的更新。
如果是,客户可以信赖服务器,并可以向服务器发送服务请求。
4.服务器向客户提供其所请求的服务。
2.2报文格式设计
我们主要设计了以下几种报文格式:
AS服务器向Client发送的报文:
TGS服务器向Client发送的报文:
发送报文中的ticket票据格式:
第三章Client模块的具体设计
3.1DES加密/解密过程
3.1.1DES加密
本实验中,使用到的加密算法是DES,DES的原始思想可以参照二战德国的恩格玛机,其基本思想大致相同。
传统的密码加密都是由古代的循环移位思想而来,恩格玛机在这个基础之上进行了扩散模糊。
但是本质原理都是一样的。
现代DES在二进制级别做着同样的事:
替代模糊,增加分析的难度。
DES使用一个56位的密钥以及附加的8位奇偶校验位,产生最大64位的分组大小。
这是一个迭代的分组密码,使用称为Feistel的技术,其中将加密的文本块分成两半。
使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。
DES使用16个循环,使用异或,置换,代换,移位操作四种基本运算。
DES(DataEncryptionStandard)满足了国家标准局欲达到的4个目的:
提供高质量的数据保护,防止数据XX的泄露和未被察觉的修改;具有相当高的复杂性,使得破译的开销超过可能获得的利益,同时又要便于理解和掌握。
DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,首先,DES把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,并进行前后置换(输入的第58位换到第一位,第50位换到第2位,依此类推,最后一位是原来的第7位),最终由L0输出左32位,R0输出右32位,根据这个法则经过16次迭代运算后,得到L16、R16,将此作为输入,进行与初始置换相反的逆置换,即得到密文输出。
DES算法的入口参数有三个:
Key、Data、Mode。
其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:
加密或解密,如果Mode为加密,则用Key去把数据Data进行加密,生成Data的密码形式作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式作为DES的输出结果。
在使用DES时,双方预先约定使用的”密码”即Key,然后用Key去加密数据;接收方得到密文后使用同样的Key解密得到原数据,这样便实现了安全性较高的数据传输。
攻击DES的主要形式被称为蛮力的或彻底密钥搜索,即重复尝试各种密钥直到有一个符合为止。
如果DES使用56位的密钥,则可能的密钥数量是2的56次方个。
随着计算机系统能力的不断发展,DES的安全性比它刚出现时会弱得多,然而从非关键性质的实际出发,仍可以认为它是足够的。
不过,DES现在仅用于旧系统的鉴定,而更多地选择新的加密标准—高级加密标准(AdvancedEncryptionStandard,AES)。
DES的常见变体是三重DES,使用168位的密钥对资料进行三次加密的一种机制;它通常(但非始终)提供极其强大的安全性。
如果三个56位的子元素都相同,则三重DES向后兼容DES。
IBM曾对DES拥有几年的专利权,但是在1983年已到期,并且处于公有范围中,允许在特定条件下可以免除专利使用费而使用。
图3-1一轮DES加密算法流程图
3.1.2DES解密.
DES的解密算法和加密算法共用相同的算法过程,即使用相同的方法完成加密和解密,两者的不同之处仅仅在于解密时子密钥Ki的使用顺序和加密时相反。
使用DES解密算法进行解密时,将以64位密文输入,最后输出64位明文
3.1.3DES算法的具体实现
在DES的具体实现中,我们使用了以下几个关键的置换:
初始置换IP置换
进行扩展置换的ei盒:
S盒,一共8个,每个S盒对应6位输入,4位输出:
对8个S盒输出的32位进行处理的P盒:
最后置换fp,64位输入64位输出:
同时还有对密钥进行的置换和压缩:
3.2Client进行Kerberos认证流程设计
1)用户登录并向AS服务器发送获取票据请求:
C→AS:
IDC||IDtgs||TS1
图3-2Client向AS服务器发送请求的流程
2)Client等待接收从AS服务器发回的票据许可:
AS→C:
EKC[Kc,tgs||IDtgs||TS2||Lifetime2||Tickettgs]
其中,Tickettgs是Client用来访问TGS的ticket
Tickettgs=EKtgs[Kc,tgs||IDC||ADC||IDtgs||TS2||Lifetime2]
图3-3AS服务器向client发送票据的流程
3)用户向TGS服务器请求服务许可票据
C→TGS:
IDV||Tickettgs||Authenticatorc
图3-4Client向TGS服务器发送请求的流程
4)TGS服务器向client发送许可票据
TGS→C:
EKc,tgs[Kc,v||IDV||TS4||Ticketv]
其中,Ticketv是client用以访问服务器V的ticket。
Ticketv=EKV[Kc,v||IDC||ADC||IDv||TS4||Lifetime4]
图3-5TGS服务器向client发送服务许可的流程
5)client向服务器发送消息
C→V:
Ticketv||Authenticatorc
Authenticatorc=EKc,v[IDc||ADc||TS5]
图3-6Client向服务器发送请求的流程
6)服务器响应client
V→C:
EKc,v[TS5+1](相互认证)
图3-7服务器向client相互认证的流程
Kerberos认证六个步骤的流程如上所示,认证的任务主要集中在两个相对独立的服务器AS和TGS上。
第四章实现
4.1client程序
voidmain()
{
input();
}
主程序进入input,即用户登录。
voidinput()
{
puts("\t输入用户名和密码:
\n");
printf("\t用户名是:
");
scanf("%s",IDc);
printf("\t密码是:
");
scanf("%s",Kc);
menu();
}
voidmenu()
{
voidinput();
voidgetTicket();
voidlinkServ();
intc,w1;
do
{
puts("\n\n\n\tKerberos服务器\n");
puts("\t1.连接AS服务器并向TGS服务器请求票据\n");
puts("\t2.连接服务器请求服务\n");
puts("\t3.更换其他用户登录\n");
puts("\t4.下线啦!
\n");
printf("选择号码吧:
");
scanf("%d",&c);
if(c<1||c>4)
{
w1=1;
getchar();
}
elsew1=0;
}
while(w1==1);
switch(c)
{
case1:
getTicket();break;
case2:
linkServ();break;
case3:
input();break;
case4:
exit(0);break;
}
return;
}
Case1-4分别代表获取票据,连接服务器,更换用户重新登录,退出服务。
在获取票据过程中,主要使用的几个功能是:
connToAS,连接AS服务器,并发出获取票据许可请求
voidconnToAS(charIDtgs[],char*msg)//构造向AS发送的请求字符串
{
charTS1[11]={0};
inti;
time_tnow;
printf("输入tgs服务器的名字:
");
scanf("%s",IDtgs);
strcpy(tmpID,IDtgs);
while(strlen(IDc)<10){strcat(IDc,"\\");}
while(strlen(IDtgs)<10){strcat(IDtgs,"\\");}
time(&now);
for(i=0;i<10;i++)//将time_t的值转换为字符串
{
TS1[i]=now/(int)pow(10,9-i)+48;
now%=(int)pow(10,9-i);
}
memcpy(msg,"1",1);
memcpy(msg+1,IDc,10);
memcpy(msg+11,IDtgs,10);
memcpy(msg+21,TS1,10);
return;
}
RecvASReply接收来自AS服务器的票据许可
voidrecvASReply(charrecvBuf[],structTGT*pText)//处理来自AS的响应字符串
{
chartext[1500]={0};
char*p=recvBuf+1;
//用Kc解密TGT
onDES(Kc,text,p,96,1);//解密到text
cout<<"经过解密得到的明文是:
"< cout< memcpy(pText->keyCTGS,text,8); memcpy(pText->IDtgs,text+8,10); memcpy(pText->TS2,text+18,10); memcpy(pText->lifetime2,text+28,4); memcpy(pText->TicketTGS,text+32,64); strcpy(Kctgs,pText->keyCTGS); } ConnToTGS连接TGS服务器,并发送服务许可请求 voidconnToTGS(char*tickettgs,char*msg)//构造向TGS发送的请求字符串 { charIDv[11]={0},TS3[11]={0},auth[41]={0};chartest[200]={0}; printf("输入服务器的名字: "); scanf("%s",IDv); while(strlen(IDv)<10){strcat(IDv,"\\");} memcpy(msg,"3",1); memcpy(msg+1,IDv,10); memcpy(msg+11,tickettgs,64); formAuth(Kctgs,auth); memcpy(msg+75,auth,40); return; } recvTGSReply用于接收TGS服务器发回的服务许可票据 voidrecvTGSReply(charrecvBuf[],structSGT*pText)//处理来自TGS的响应字符串 { chartext[150]={0}; char*p=recvBuf+1; onDES(Kctgs,text,p,96,1); memcpy(pText->keyCV,text,8); memcpy(pText->IDv,text+8,10); memcpy(pText->TS4,text+18,10); memcpy(pText->TicketV,text+28,64); } connToServer连接到服务器请求服务 voidconnToServer(char*ticketv,char*msg)//用获得的票据向服务器请求服务 { charauth[41]={0}; memcpy(msg,"5",1); memcpy(msg+1,ticketv,64); formAuth(Kcv,auth,&ts5); memcpy(msg+65,auth,40); } voidformAuth(charkey[],char*p,time_t*t=NULL)//生成认证符 { charmsg[50]={0},TS[11]={0}; inti; time_tnow; time(&now); if(t! =NULL)*t=now; for(i=0;i<10;i++)//将time_t的值转换为字符串 { TS[i]=now/(int)pow(10,9-i)+48; now%=(int)pow(10,9-i); } while(strlen(IDc)<10){strcat(IDc,"\\");} while(strlen(myAddr)<15){strcat(myAddr,"\\");} memcpy(msg,IDc,10); memcpy(msg+10,myAddr,15); memcpy(msg+25,TS,10); onDES(key,p,msg,40,0); return; } intrecvAuthFromServ(charrecvBuf[])//对服务器进行认证 { chartext[16]={0}; time_tt; onDES(Kcv,text,recvBuf+1,16,1); t=atoi(text); if(t-ts5==1)return1; elsereturn0; } 4.2Socket程序 创建套接字进行网络通信,部分代码如下: intkbrSocket(charaddr[],intport,charsendBuf[],charrecvBuf[],intsendLen=0)//SOCKET连接函数 { constintDEFAULT_PORT=5000; WORDwVersionRequested; WSADATAwsaData; interr,iLen; char*p="Erroroccurs.";
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- kerberos 课程设计