3. 典型认证协议族解析
认证协议族的差异,本质上不是“谁更安全”的简单排序,而是信任锚点、凭证形态、消息交换方向与安全目标的不同组合。理解这些差异,才能在测试中判断“协议本身是否被正确使用”,而不是只盯着某个字段或某次抓包结果。下面按协议族逐一拆解其流程、消息交换与安全目标,并在最后给出跨协议的测试关注点。
Kerberos:以对称密钥和票据为中心的域内认证
Kerberos 的核心是KDC(密钥分发中心),它由 AS(认证服务)和 TGS(票据授予服务)组成。客户端首次登录时,用长期密钥派生的密钥加密时间戳向 AS 请求 TGT(票据授予票据);AS 返回用客户端密钥加密的会话密钥和用 TGS 密钥加密的 TGT。随后客户端用 TGT 向 TGS 请求服务票据 ST,TGS 返回用服务密钥加密的 ST。客户端最终用 ST 向目标服务证明身份。
其安全目标包括:双向认证(客户端与服务互相验证)、票据时效性(通过时间戳和票据有效期防重放)、密钥不直接暴露(长期密钥仅用于派生,不参与每次会话)。测试时重点关注:TGT/ST 是否可被重放、票据有效期与时钟偏移是否被正确校验、Kerberoasting(请求服务票据后离线破解服务账户口令)是否可行、以及是否启用了 AES 而非 RC4。
OAuth 2.0:授权委托而非身份认证
OAuth 2.0 解决的是“让第三方应用在用户授权下访问资源”,它本身不是认证协议。典型授权码流程为:客户端将用户重定向到授权服务器,携带 client_id、redirect_uri、scope、state;用户认证并同意后,授权服务器返回授权码;客户端用授权码加 client_secret 换取 access_token;客户端再用 access_token 访问资源服务器。
安全目标聚焦于:授权范围最小化(scope 限制)、授权码一次性、重定向地址严格匹配、state 防 CSRF。测试重点包括:redirect_uri 是否可被篡改为攻击者域名、授权码是否可重复使用、PKCE 是否在公共客户端中启用、access_token 是否通过日志或 Referer 泄露、以及隐式模式是否仍在使用。
OpenID Connect:在 OAuth 2.0 之上补上身份层
OpenID Connect(OIDC)在 OAuth 2.0 的授权流程上增加了 id_token(JWT 格式)和 UserInfo 端点。授权码流程中,客户端在 token 端点同时获得 access_token 和 id_token;id_token 包含 iss、sub、aud、exp、iat、nonce 等声明,用于向客户端证明用户身份。
安全目标包括:id_token 签名与声明校验(iss 必须匹配、aud 必须包含 client_id、nonce 必须与请求一致)、令牌绑定(防止 id_token 被替换)、会话管理。测试时需验证:是否校验签名算法(防止 alg=none 或 HS256 混淆)、nonce 是否被强制校验、id_token 是否可被重放、以及 UserInfo 端点是否要求 access_token。
SAML:基于 XML 断言的企业级联邦认证
SAML 2.0 常用于企业 SSO,核心是 IdP(身份提供方)与 SP(服务提供方)之间的断言交换。SP 发起 AuthnRequest,用户被重定向到 IdP 认证,IdP 生成包含认证声明的 SAML Response,经用户浏览器 POST 回 SP 的 ACS 端点,SP 校验签名后建立会话。
安全目标:断言完整性(XML 签名)、断言时效性(NotBefore/NotOnOrAfter)、受众限制(Audience 必须匹配 SP)、防重放(InResponseTo 与 AssertionID 校验)。测试重点:XML 签名包裹(XSW)攻击、签名验证是否可被绕过、断言是否可被篡改后重放、以及 IdP 元数据是否被正确校验。
FIDO2/WebAuthn:以公钥凭证替代共享秘密
FIDO2 由 WebAuthn(浏览器 API)和 CTAP(认证器协议)组成。注册时,认证器生成密钥对,私钥不出认证器,公钥和凭证 ID 发送给服务器;认证时,服务器发送 challenge,认证器用私钥签名,服务器用公钥验证。私钥受硬件保护,且绑定到具体源(origin)。
安全目标:抗钓鱼(origin 绑定)、抗重放(challenge 一次性)、无共享秘密(服务器不存储可被拖库的密码)。测试重点:challenge 是否随机且一次性、origin 校验是否严格、attestation 是否被正确验证、以及是否允许降级到弱认证方式。
TLS 客户端认证:以证书证明客户端身份
TLS 客户端认证在标准 TLS 握手基础上,服务器在 CertificateRequest 消息中要求客户端提供证书;客户端返回 Certificate 和 CertificateVerify(用私钥签名握手摘要),服务器验证证书链和签名后完成双向认证。其安全目标:双向身份确认、证书链可信、私钥持有证明。
测试重点:是否校验客户端证书有效期与吊销状态、是否接受自签名或弱签名算法证书、CertificateVerify 是否可被绕过、以及是否将客户端证书与具体用户绑定。
跨协议测试的共性判断
尽管六类协议差异明显,测试时仍可沿三条主线展开。第一,凭证是否可被重放或伪造:Kerberos 看票据时效与加密算法,OAuth/OIDC 看授权码与令牌的一次性,SAML 看断言 ID 与签名,FIDO2 看 challenge 与 origin,TLS 看 CertificateVerify。第二,信任锚点是否被正确校验:OIDC 的 iss/aud、SAML 的 Audience、TLS 的证书链、FIDO2 的 RP ID,任何一项缺失都会导致认证被绕过。第三,降级路径是否存在:是否允许回退到隐式模式、RC4、无 PKCE、无 nonce 或弱签名算法。
最后需要强调:OAuth 2.0 本身不提供身份认证,若业务需要“登录”,必须使用 OIDC 或在其上叠加身份层;Kerberos 与 SAML 更适合企业内网与联邦场景;FIDO2 与 TLS 客户端认证则分别面向抗钓鱼和机器身份。选择协议时,应先明确安全目标,再评估实现是否覆盖了该目标对应的校验点。