密码学算法之数字签名和认证协议篇
- 前言
- [1.1 基于口令的认证](#1.1 基于口令的认证)
-
- [1.1.1 口令的各种形式](#1.1.1 口令的各种形式)
- [1.1.2 认证技术和协议](#1.1.2 认证技术和协议)
- [1.2 数字签名的基本概念](#1.2 数字签名的基本概念)
-
- [1.2.1 数字签名的目的](#1.2.1 数字签名的目的)
- [1.2.2 直接数字签名](#1.2.2 直接数字签名)
- [1.2.3 有仲裁的数字签名](#1.2.3 有仲裁的数字签名)
- [1.3 认证模型](#1.3 认证模型)
- [1.5 Kerberos 认证系统](#1.5 Kerberos 认证系统)
-
-
- [1.5.1 Kerberos 的目的](#1.5.1 Kerberos 的目的)
- [1.5.2 Kerberos 认证协议](#1.5.2 Kerberos 认证协议)
-
前言
公钥密码学获得的最重要进展之一是数字签名。数字签名是实现对数据完整性检验、真实性认证及抗抵赖的重要技术。他提供了其他方式已以实现的安全机制。本文介绍数字签名的基本概念和依赖数字签名使用的认证协议、数字签名标准(DSS)及支持应用级认证和数字签名的认证函数。
第 5 章 数字签名与认证技术
1.1 基于口令的认证
1.1.1 口令的各种形式
认证(验证)是网络通信中获得信任的手段,是安全服务的最基本内容之一。认证的目的是确认通信实体的真实性和有效性,实现认证的方法通常与加密技术有关。这里的通信实体可以是用户、设备,或者网络中的指定在线应用业务。传统认证方法通常基于以下因素:
- 申请人表示知道某些信息,例如口令。
- 申请人出示特定所有物,例如智能卡或者物理密钥。
- 申请人展示不可变更的独有特征,例如书写签名、指纹、声纹、视网膜等。
- 申请人出示正在特定物理场的证据,例如特定 IP 地址或者消息验证码 MAC。
申请人是指试图认证为某特定通信实体身份的人或者事。根据应用要求和安全强度,实际认证过程中通常要求以上因素组合使用。具体实施的方法因申请人的身份表示形式不同,可以分为实体认证和数据源认证。网络通信中主要考虑数据源认证方法。
口令又称个人识别码(PIN)或通行短语,是身份认证中最传统但仍广泛使用的方法。几乎所有的个人身份认证在一定程度上都依赖于口令。在电子商务中,口令也是系统安全的主要弱点。对于基于口令的认证主要存在以下威胁:
- 外部泄露:攻击者通过网络以外的方式获得口令。例如用户可能将他或者她的 PIN 写在纸片或者银行卡上;用户在银行 ATM 终端操作时被攻击者偷窥;用户将写有口令的纸片未经粉碎丢弃在废纸篓中;用户无意地将口令告诉他人等。
- 猜测:攻击者不断试验用户口令。如果采用字典攻击,成功率通常是极低的。但是如果用户设置的口令与他的生日、电话号码、姓名缩写相关,则很可能被攻击者首先猜测。
- 通信窃取:用户通过网络传输的口令未进行加密保护,则攻击者很容易通过监听窃取。对于窃取的口令,攻击者甚至无需知道口令值,他只需要伪装成合法实体重放就可以了。
- 渗透主机:攻击者进入含有用户口令数据库的服务器或者客户机。
抵御以上威胁既需要实施有效的口令管理和认证协议,也需要对用户进行必要的网络安全培训,使之对自己的行为负责。
个人身份验证时必须出示本人合法持有的某些东西的要求是十分关键的。为保障系统安全性,与口令验证相关的另一种物理方法是个人令牌,它是合法持有人配备的某种小型物理设备。申请人获得认证时既要出示口令,也要出示令牌。
令牌需要能够防止篡改、伪造、复制。常见的令牌有:
- 人机界面令牌:通常是一种带有数字显示的手持设备,显示屏中显示持有者进入某个网络系统的数字。对令牌的验证方法通常是要求持有者输入 PIN 数据。
- 智能卡:尺寸如银行信用卡,内嵌有微处理器和微电路存储系统的塑料卡片。将智能卡插入一个外部终端设备,通过接触,终端向智能卡提供电源,同时使用低速率协议实现终端与卡上处理器的数据交换。
- PCMCIA 卡:PCMCIA 插槽通常是移动 PC 机配置的外设接口。与智能卡比较,PCMCIA 卡具有更强大的处理功能和更宽的接口带宽。
- USB 令牌:通过 USB 端口接入的令牌,具有很强的处理功能和存储逻辑。
影响令牌物理形式的主要原因是所要的接口类型,是选择硬件接口还是通过人工输入方式应该根据应用需求决定。硬件接口成本较高,但对于数字签名令牌则是必须的。令牌的硬件接口选择应该遵循智能卡、USB、PCMCIA 等标准。人工接口令牌不需要专门的硬件接口,成本开销较小。在使用提问 - 回答方式令牌或者同步一次性口令生成器时,人工接口方式比较合适。
1.1.2 认证技术和协议
在服务器端对客户端的用户身份真实性认证(验证)设计中主要考虑防止通信窃取和重放攻击。常用方法有:
- 口令变换:用户给出的口令在客户端经过单向函数变换处理后传送给服务器,服务器对存储的用户口令副本进行同样变换后与收到的口令值进行比较。这主要是防止攻击者通过信道窃取用户口令原值。
- 提问 - 回答:服务器向客户端发送一个称为提问的随机值或者现值。作为提问的随机值对每次认证请求是不一样的,该值必须合并到用户的答复中。服务器在处理用户答复时必须确认用户是否使用了正确的提问。这种考虑主要是防止客户端的重放攻击。
- 时间戳:从客户端发出的认证请求必须嵌入正确的日期时间,以供服务器检查认证请求的合理性。这也是防止客户端重放的一种办法,但时间戳的应用要求系统所有时钟同步。
- 一次性口令:一次性口令类似于口令变换,对用户登录的口令执行 N 次确定的单向处理函数。用户每登录一次,N 减 1,从而生成一个不同的在线口令。攻击者可能窃取一个在线口令,但不能生成下一个在线口令,因此能够防止重放和窃取。
- 数字签名:数字签名是基于现代密码学的认证协议的基础。用户使用私钥对消息或者消息摘要的加密被称为数字签名。由于私钥是每个用户特有的,以此来证明消息来源的身份。在签名内容中加上提问现值或者时间戳,可以防止重放攻击。
- 零知识技术:零知识技术是用于相互认证的加密技术,该技术的特点是不需要给出与信息相关的任何内容就能够验证消息来源的身份。零知识技术的实现可能要求复杂的数据交换协议,需要传输较多的数据,因此是以消耗通信资源为代价的。
实际认证过程通常是以上各种方法的综合,即所谓认证协议。好的认证协议需要认真设计,需要考虑的问题包括窃取、重放和欺骗威胁。既要求尽可能严谨,又要考虑协议实现的代价。认证协议通常建立在网络通信协议之上,如网络协议和应用层协议。基于现代密码学的认证协议既可以是以对称密码系统为基础,也可以公钥密码系统为基础,但更多的是两者的结合。
1.2 数字签名的基本概念
1.2.1 数字签名的目的
数字签名的目的是认证网络通信双方身份的真实性,防止相互欺骗或抵赖。网络通信双方之间可能存在的问题是:用户 A 要发送一条信息给用户 B,既要防止用户 B 或第三方的伪造,又要防止用户 A 事后因对自己不利而否认。在实际应用中,这两种情况都牵涉到法律问题。如:在网上进行资金转账,接收者的账户将增加转账过来的资金,但接收者却否认收到发方转过来的资金;股票经纪人代理委托人执行了某项交易的命令,结果这项交易是亏本的,发送者于是否认发送过的交易指令,以逃避责任。数字签名技术可以很好地解决这类问题。
数字签名必须满足三个条件:
- 收方条件:接收者能够核实和确认发送者对消息的签名,但不能伪造对消息的签名。
- 发方条件:发送者事后不能否认和抵赖对消息的签名。
- 公证条件:公证方能确认收方的信息,做出仲裁,但不能伪造这一过程。
目前,已有多种实现各种数字签名的方法。这些方法可分为两类:直接数字签名和有仲裁的数字签名。
1.2.2 直接数字签名
直接数字签名只涉及到通信双方。设消息接收者已经或者可以获得消息发送者的公钥。发送者用其私钥对整个消息或者消息散列码进行加密来形成数字签名。通过对整个消息和签名进行再加密来实现消息和签名的机密性。可采用收方的公钥,也可采用双方共享的密钥(对称加密)来进行加密。首先执行签名函数,然后再执行外部的加密函数。出现争端时,某个第三方必须查看消息以及签名。如果签名是通过密文计算得出,第三方也需要解密密钥才能阅读到初始的消息明文。如果签名作为内部操作,接收方可存储明文和签名以备以后解决争端时使用。
目前的直接签名方案有一个共同的弱点:其有效性依赖于发送方私钥的安全性。发送方可以通过声称私钥被盗用且签名被伪造来否认发送过某个消息。可以对私钥进行管理控制,代价是妨碍或减弱了方案的使用。
1.2.3 有仲裁的数字签名
直接数字签名中容易产生发送者否认发送过某个消息的问题,这可以通过使用仲裁来解决。数字仲裁方案也有许多种,但一般都按以下方式进行:
设定 A 想对数字消息签名,送达给 B。C 为一个 A、B 共同承认的可信仲裁者。
- A 将准备发送给 B 的签名消息,首先传送给 C。
- C 对 A 传送过来的消息以及签名进行检验。
- C 对经检验的消息标注日期,并附上一个已经过仲裁证实的说明,再发送给 B。
下面给出几种需要仲裁的数字签名方案。
方案 1 对称加密,仲裁者可以看到消息内容: - A→C: M || E_Kac [ID_A || H (M)]
- C→B: E_Kcb [ID_A || M || E_Kac [ID_A || H (M)] || T]
方案 1 使用的是对称密钥加密。它假定发方 A 与仲裁者 C 共享一个密钥 Kac,仲裁者 C 和收方 B 共享一个密钥 Kcb。A 生成消息 M,计算出散列码 H(M),用密钥 Kac 对标识符 ID_A 和散列码 H(M)签名,然后将消息 M 和签名传送给 C。C 对该签名进行解密并验证散列值是否是由消息生成。然后 C 向收方 B 发送一个消息,该消息使用 Kcb 加密,消息包括 ID_A、源自 A 的消息 M、加密签名以及时间戳 T。时间戳用来通知收方该消息是新的而不是过时的。收方 B 可以存储 M 和签名,一旦发生争执,收方 B 声称收到 A 的消息)可以向仲裁者 C 发出如下消息:E_Kcb [ID_A || M || E_Kac [ID_A || H (M)]],仲裁者 C 使用 Kcb 恢复出 ID、M 和加密签名,然后使用 Kac 对签名进行解密并验证散列码。
从这个过程中可以看出,C 的存在可以解决直接数字签名可能产生的问题。这时,仲裁起着敏感且关键的作用,其前提是建立在通信各方对仲裁者的信任之上的。这必须要求:
- 发送 A 必须确信仲裁者 C 不会泄露 Kac,也不会产生虚假的签名。
- 接收方 B 必须确信仲裁者 C 只有在散列码正确且 X 签名证实的情况下才下发送。
- 双方必须确信 A 能公平地解决争端。
方案 2 对称加密,仲裁者不能看到消息内容:
- A→C: ID_A || E_Kab [M] || E_Kac [ID_A || H (E_Kab [M])]
- C→B: E_Kcb [ID_A || E_Kab [M] || E_Kac [ID_A || H (E_Kab [M])] || T]
方案 2 认为当 C 可以看到 A 发送给 B 的消息时,其它窃密者也可能这么做。因此,提供仲裁的同时还要确保消息的机密性。假定 A 和 B 共享密钥 Kab,首先发送者 A 传送标识符 ID、消息 M(用 Kab 加密)和签名(由 A 的标识符和加密消息的散列值组成,用 Kac 加密)给仲裁者 C。和方案 1 一样,仲裁者 C 对签名进行解密并验证散列值的有效性。这时仲裁者只能面对加密过的消息,然后仲裁者 C 将从 A 收到的所有信息附上时间戳,用 Kcb 加密后发送给接收方 B。尽管看不到加密消息的内容,但 C 仍能起到仲裁的作用。和方案 1 一样,该方案存在的问题是:仲裁者和发送方结成联盟来否认一个消息签名,或者仲裁者和收方结成联盟来伪造发送方签名。这些问题可以通过公钥密码方案来解决,即带仲裁的数字签名方案 3。
方案 3 公钥加密,仲裁不能看到消息内容:
- A→C: ID_A || E_KRa [ID_A || E_KUb [E_KRa (E_KUb [M])]
- C→B: E_KRc [ID_A || E_KUb [M] || T]
方案 3 中,发送方 A 对消息 M 先使用 A 的私钥 KRa 进行加密,然后再使用 B 的公钥 KUb 进行加密。这样就得到一个签名且加密两次的消息。再次使用 KRa,对这个得到的消息连同 A 的标识符一起加密,并将结果连同 ID_A 发送给 C。内部经过双重解密的消息对仲裁者(包括 B 的私钥之外的其他人)都是安全的。但同时,C 能对外层加密进行解密,通过验证确信 A 的私钥及公钥是否仍然有效来完成对消息的验证。然后 C 用 KRc 加密由 ID_A、双重加密消息 M 和时间戳 T 组成的消息,发送给接收方 B。
与前面的方案相比,方案 3 的优点在于:由于通信各方没有任何共享信息,所以可以防止前面所讨论的结盟欺骗;只要仲裁者 C 的私钥 KRc 是安全的,通信各方不能对消息进行篡改;从 A 发送到 B 的消息内容对仲裁者 C 和其他人都是保密的。
1.3 认证模型
1.3.1 相互认证
相互认证协议能使通信双方相互证实对方的身份并交换会话密钥进行通话。经认证的密钥交换过程中,需要考虑两个重要问题:机密性和时效性。机密性是指用户的身份信息和会话密钥信息应以密文形式交换,以防止会话密钥的篡改和泄露。解决这一问题的常用做法是双方预先存在一个密钥或采用公钥方法。时效性主要是防止消息重放的危险。因为采取消息重放,对手有机会获取会话密钥伪装成通信的另一方。对付重放攻击的基本方法有两种:时间戳和盘问 / 响应。
时间戳方法需要通信双方的时钟保持同步。当 A 接收一个消息,给 A 验证确认其时间戳与 A 的当前时间足够接近,才认为消息是新的。
盘问 / 响应方法是当 A 希望从 B 接收一个新消息时,首先向 B 发送一个现时消息(nonce),即盘问,随后要求从 B 接收消息,即响应,其中包含正确的现时值。
1.对称加密法
可以采用两级分层对称加密来为分布式环境中的通信方提供机密性。这个方案需要一个可信的密钥分配中心(KDC)。通信双方和 KDC 共享一个密钥(主密钥)。KDC 为通信双方产生一个会话密钥,并使用主密钥来保护会话密钥的分配。下面介绍一种经多次改进后的协议。该协议描述如下:
- A→B: ID_A || N_a
- B→KDC: ID_B || N_b || E_Kb [ID_A || N_a || T_1]
- KDC→A: E_Ka [ID_B || N_a || T_b || K_s ] || E_Kb [ID_A || K_s || T_2 ] || N_b
- A→B: E_Kb [ID_A || K_s || T_2 ] || E_Ks [N_b ]
具体的交换过程是:
- A 产生一个现时加上自己的标识,以明文的形式发给 B。包含这个现时和会话密钥加密的消息将返回 A。A 通过该现时确保消息的时效性。
- B 告知 KDC 需要一个会话密钥。它发往 KDC 的消息包括它的标识符和一个现时 N_b。包含这个现时和会话密钥加密的消息将返回 B。B 通过该现时确保消息的时效性。B 发往 KDC 的消息还包括一个使用由 B 和 KDC 共享的密钥加密的分组,这个分组用来通知 KDC 向 A 分布一个信任状,包括信任状的预期接收者、从 A 发来的现时和信任状的过期时间。时间 T_1 相对于 B 的时钟。这样,这个时间戳不需要同步时钟,因为 B 只检查自身产生的时间戳。
- KDC 将 B 的现时和一个使用 B 和 KDC 共享密钥加密的分组传递给 A。这个分组作为 A 在随后认证中使用的一种 "票据"。KDC 还向 A 传送了一个使用 A 和 KDC 共享密钥加密的分组,这个分组用于证实 B 已经收到初始消息(ID_B),这是一个及时的消息而不是重放(N_a),此外还向 A 提供一个会话密钥(K_s)和它的使用时限(T_2)。
- A 将票据连同 B 的现时传送给 B,后者使用会话密钥加密。该票据为 B 提供了用来解密以恢复这个现时的票据。使用会话密钥对 B 的现时加密这一事实能认证该消息来自 A 而不是一个重放。
这个协议给 A 和 B 建立会话提供了一种有效、安全的会话密钥交换方式。而且,该协议仅让 A 和 B 拥有一个会话密钥,能用于加密双方对话内容,避免了需要重复多次与认证服务器联系的必要。
上述协议建立后,在会话的有效期内,A 与 B 之间的会话协议如下:
- A→B:E_Ks [ID_A || K_s || T_2 ] || N'_a;
- B→A:N'_a || E_Ks [N'_b ];
- A→B:E_Ks [N'_b ]。
当 B 收到消息时,它验证消息中的票据没有过期。新产生的现时 N'_a 和 N'_b 将向每方保证这不是重放攻击。
2. 公钥加密法
一个基于公钥密码的时间戳方法协议如下:
- A→AS:ID_A || ID_B;
- AS→A:E_KRa [ID_A || KU_U || T] || E_KRa [ID_B || KU_b || T];
- A→B:E_KUb [ID_A || KU_U || T] || E_KRa [ID_B || KU_b || T] || E_KUb [E_KRa [K_s || T]]。
在这个协议中,中心系统被称为认证服务器 AS,AS 并不负责会话密钥的分配。AS 实际上提供公钥证书。会话密钥的选择和加密由 A 完成;因此没有 AS 泄露密钥的危险。时间戳防止重放攻击密钥,该协议需要时钟同步。
另一个使用现时的改进协议:
- A→KDC: ID_A || ID_B
- KDC→A: E_KRkdc [ID_B || KU_b ]
- A→B: E_KUb [ID_A || N_a ]
- B→KDC: ID_B || ID_A || E_KRkdc [N_a ]
- KDC→B: E_KRkdc [ID_A || KU_a ] || E_KUb [E_KRkdc [N_a || ID_A || ID_B || K_s ]]
- B→A: E_KUa [E_KRkdc [N_a || ID_A || ID_B || K_s ] || N_b ]
- A→B: E_Ks [N_b ]
A 作为通信发起方首先通知 KDC 它希望与 B 建立一个安全连接。KDC 向 A 返回一份用自己的私钥加密的 B 的公钥证书。步骤(3)中 A 使用 B 的公钥,通知 B 它希望与其进行通话,并送一个现时 N_a。如果 B 响应 A 的通信请求,则向 KDC 发送 A、B 的标识和一个用 KDC 的公钥加密的现时,请求 A 的公钥证书和一个会话密钥。KDC 收到 B 的应答后向 B 返回一个 A 的公钥证书以及用 KDC 的私钥和 B 的公钥加密的 N_a、ID_A、ID_B、K_s 信息。这些信息说明 K_s 是 KDC 为特定的 A、B 双方通信而产生的会话密钥,而且 K_s 与 N_a 一起将使 A 确信 K_s 是最新的。用 KDC 的私钥加密,可使 B 确信是由 KDC 发回的。用 B 的公钥加密,以防止其他人建立 A 的欺骗性连接。步骤(6)中将用 KDC 私钥加密的信息 N_a、ID_A、ID_B、K_s 和 B 的现时 N_a 用 A 的公钥加密后,发送给 A。最后 A 解密从 B 收到的消息后,将 B 的现时 N_b 用会话密钥 K_s 加密,再发回给 B,确认自己已收到会话密钥。
1.3.2 单向认证
单向认证协议在电子邮件中广泛应用。邮件被转发到收方的电子邮箱中,保存下来直到收方阅读它,而收发双方无需同时在线。通常发信方希望邮件内容保密,不希望邮件处理系统或其他方能读到邮件的明文信息;收信方也希望确认该信是来自被认为的发信方。即用户的两个需求:机密性和认证。和双向认证一样,我们也可采用对称加密法和公钥加密法满足这类认证需求。
1.对称加密协议
- A→KDC: ID_A || ID_B || N_a
- KDC→A: E_Ka [ID_B || N_a || K_s || E_Kb [ID_A || K_s ]]
- A→B: E_Kb [ID_A || K_s ] || E_Ks [M ]
这个方法保证只有合法的接收者 B 才能读到消息的内容,同时也使 B 确信信息是来自 A 的。该协议无法防止重放攻击。由于电子邮件潜在的延时,即使加上时戳,其作用也有限。
1. 公钥加密法
公钥加密法能提供机密性和认证性,非常适合电子邮件系统。为保证机密性,我们可采用下面的这种方法:A→B: E_KUb [K_s ] || E_Ks [M ]
这种方法中,需要 A 知道 B 的公钥。A 用 B 的公钥对会话密钥加密,再用会话密钥对消息加密。因此,消息内容只能由 B 用自己的私钥进行解密恢复会话密钥,然后再用会话密钥解密出消息内容。但 B 无法确认该信息是由 A 发来的。
对于认证,不考虑保密,可采用下面的方法:
A→B: M || E_KRa [H (M) ]
该方法可使 A 无法否认自己向 B 发过消息。B 需要知道 A 的公钥。若第三方 C 截获该信息,将 A 的签名换成 C 的签名,再将消息送到准备投递 B 的邮件队列中。显然此时,C 窃取了 A 的想法。为此,可用收方 B 的公钥对消息和签名一起加密,以保证只有 B 能恢复消息内容:A→B: E_KUb [M || E_KRa [H (M) ]]
若既需要机密性,又需要认证,将上述两种方法结合起来即可。
1.4 数字签名标准
5.4.1 DSS 标准
DSS 是由美国国家标准技术学会(NIST)于 1991 年 8 月提出,1994 年 5 月在联邦记录(FR)中公布,1994 年 12 月被采纳的一个数字签名标准。它是 ElGamal 数字签名方案的一个变形。不同于 RSA,它不能用作加密或密钥交换。DSS 使用算法 DSA 来提供惟一的数字签名函数。注意:DSA 是算法,DSS 是标准,标准采用算法,算法是标准的一部分。
1.4.2 数字签名算法 DSA
DSA 包含数字签名和验证两个部分。
算法中应用了下述参数:
- p:L 位素数。L 是 64 的倍数,范围是 512 到 1024;
- q:(p-1) 的 160 位素因子;
- g:g = h^((p-1)/q) mod p,其中 h 为整数,满足 1 < h < p-1,h^((p-1)/q) mod p > 1;
- x:伪随机整数,0 < x < q;
- y:y = g^x mod p;
- k:伪随机整数,0 < k < q;
- H(x):单向散列函数
其中,p,q,g 为全局公钥分量;x 为用户私钥;y 为用户公钥;k 对用户每个消息是惟一的。
签名过程:
产生随机数 k(0 < k < q),计算:
r=(gkmodp)modqs=(k−1×(H(m)+xr))modq
(m 为需要签名的消息)
签名结果为(m,r,s)
验证签名:接收者收到 m,r,s 后(0 < r < q,0 < s < q),计算:
w=s −1 mod q
u1=(H(m)×w) mod q
u2=(r×w) mod q
v=((g u1 × y u2) mod p) mod q
因为
v = ((g u1 × y u2) mod p) mod q
= ((g u1 × g ^(x * u 2 )^) mod p) mod q
= (g (u1+xu2) mod p) mod q
= (g(H(m)+xr)w mod p) mod q
= (g^(H(m)+xr)k −1)^ mod p) mod q
注意到 s=k−1(H(m)+xr) mod q, 所以
v = (gk mod p) mod q = r
所以,如果 v=r,则认为签名有效。
以上过程中 H(x)可选择 SHA、MD5 等散列算法。DSA 算法的安全性依赖于有限域上的离散对数问题,安全强度和速度均低于 RSA 算法,其优点是不涉及专利的问题。DSA 的一个重要特点是两个素数公开,这样,当使用别人的 p 和 q 时,即使不知道私钥,也能确定它们是随机产生还是作了手脚,这是 RSA 算法做不到的。
1.5 Kerberos 认证系统
Kerberos①是为 TCP/IP 网络设计的可信任第三方认证协议。Kerberos 面对问题是:在一个开放的分布式环境中,工作站的用户希望获得分布在网络中的服务器上提供的服务;服务器应该能够限制授权用户的访问,并能对服务请求进行认证。在这种环境下的问题是,工作站如何向网络服务器证实用户的身份呢?网络中经常出现威胁包括:非法用户可能访问某个特定的工作站,并假装成一个用户在操作;非法用户还可能更改工作站的网络地址,使从这个已更改工作站发出的请求看似来自伪装的工作站;非法用户也可以窃听消息交换过程,并使用重放攻击来获得进入服务器或阻止正在进行的操作。这些情况下,未授权的用户都能够访问那些不被授权访问的服务和数据。Kerberos 提供一个集中的认证服务器,其功能是实现服务器与用户之间的相互认证。换言之,网络上的 Kerberos 服务器起着可信仲裁者的作用。Kerberos 提供安全的网络认证,允许个人访问网络中的不同的机器。
Kerberos 基于对称密码学,它与网络上的每个实体分别共享一个不同的密钥,是否知道该密钥便是身份的证明。
Kerberos 最初是在麻省理工学院(MIT)为 Athena 项目而开发的,Kerberos 模型基于 Needham、Schroeder 的可信任方协议。广泛使用的 Kerberos 的版本是第 4 版和第 5 版,第 5 版弥补了第 4 版中存在的一些安全漏洞,已经发布为 Internet 提议标准(RFC1510)。
1.5.1 Kerberos 的目的
目前广泛应用的分布式结构由专用用户工作站和分布的或集中的服务器组成。在相对封闭、由单个组织所拥有的系统中,可以依靠每个客户工作站来保护用户的身份,每个服务器通过基于用户身份标识(ID)来加强安全策略;同时,需要客户系统向服务器证实它们的身份,服务器要信任客户系统的用户身份。在一个更开放的网络环境中,通过网络与其他系统互联时,还要考虑到保护服务器中的用户信息和资源。Kerberos 支持这三种安全要求,它基于一个分布的客户 / 服务器结构,用多个 Kerberos 服务器提供认证服务。为此,对 Kerberos 提出如下需求:
- 安全:非法用户不能伪装成合法用户来窃听有关信息,即 Kerberos 应提供强大的安全机制来防止潜在的非法入侵者发现脆弱的链路。
- 可靠:用户依靠 Kerberos 提供的服务来取得进行访问控制所需的服务。因此,要求 Kerberos 具有高可靠性,采用分布式的服务器结构,随时对系统进行备份,否则,用户得不到 Kerberos 的服务,就无法获得所要求的服务。
- 透明:为方便用户,整个系统对用户来说应该是透明的。除了需要输入一个口令外,用户感觉不到认证服务的发生。
- 可扩缩:Kerberos 应该采用模块化、分布式结构,能够支持大量客户和服务器。
Kerberos 系统采用一个协议来提供可信的第三方认证服务,客户和服务器都信任 Kerberos 对它们之间的仲裁。因此,只要 Kerberos 服务器本身是安全的,那么认证服务就是安全的。
1.5.2 Kerberos 认证协议
Kerberos 设置了两个服务器,其中一个是认证服务器 AS(Authentication Server),当出现要求获得网络中某服务器 V 所提供服务的用户请求时,首先由 AS 作为第三方对该用户进行身份认证。AS 知道每个用户的口令,并且将用户口令存储在一个中心数据库中。AS 将收到的用户口令与中心数据库存储的口令进行比较验证。如果验证通过,AS 向提出服务请求的用户发放一允许用户得到访问服务器 V 服务的票据,用户则根据该票据去获得业务服务器 V 提供的服务。
为了避免用户每次访问服务器都要重复以上过程,Kerberos 又设置了票据许可服务器 TGS(Ticket-granting Server)。TGS 的作用是向已经过 AS 认证的用户发放用于获取业务服务器所提供服务的票据。用户首次申请业务服务器 V 服务时,先向 AS 申请访问 TGS 的票据许可票据 Tickettgs。用户将所获得的有效 Tickettgs保存,以后每次要求访问业务服务器 V 所提供服务时只需向 TGS 出示 Tickettgs,TGS 再向用户发放可以获得业务服务器 V 服务的服务许可票据 Ticketv。
每份票据许可票据 Tickettgs和服务许可票据 Ticketv应该有合适的有效期(Lifetime)。有效期过短,则用户必须频繁地向 AS 输入自己的身份口令;有效期过长,则遭受敌手攻击的可能性将增大。故用户有可能通过监听获得 Tickettgs,据此冒充合法用户向服务器提出请求。另外还必须考虑的是:服务器必须向用户证明自己的身份,以防止敌手假冒服务器获得用户身份信息后再拒绝服务。
按照以上考虑,Kerberos 协议基本框架见图 5-1。

客户登录工作站向 Kerberos 请求访问权限,AS 在数据库中验证用户的访问权限,生成票据许可票据和会话密钥,用用户的秘密密钥加密后发送给用户。工作站提示用户输入口令来对收到的消息进行解密,为了使用特定的服务器,客户还需要从 TGS 中请求一张票据,于是将票据许可票据以及包含用户名称、网络地址和时间的认证符发送 TGS。TGS 对票据和认证符进行解密,验证请求,然后生成请求服务许可票据,并将票据发回给工作站。接着,工作站将票据和认证符呈现给服务器,服务器验证票据和认证符中的匹配,如果客户的身份没有问题,服务器便会让客户访问该服务。如果需要双向认证,服务器返回一个认证符。