2. 认证协议基础与威胁模型

认证协议的本质,是在不可信信道与不可信终端之间,建立“某个主体确实持有某份凭证”的可验证结论。要理解后续的测试与风险治理,必须先看清四类基础认证范式的凭证形态、交互方向与信任假设,再叠加攻击者能力假设与信任边界,最后用 STRIDE 把威胁落到具体资产上。

四类基础认证范式

口令认证是最常见也最脆弱的一类。用户提交口令(或其派生值),服务端与存储的校验值比对。若服务端明文存储口令,一次数据库泄露即导致全量凭证失陷;因此正确做法是使用带盐的慢哈希,例如 Argon2id、scrypt 或 bcrypt。示例参数:Argon2id 采用 m=64MiB、t=3、p=4,盐为 16 字节随机值,输出 32 字节。校验时使用恒定时间比较,避免通过响应时间差推断前缀匹配长度。口令认证的核心弱点在于凭证可被重放、可被离线爆破、可被钓鱼直接获取,且用户跨站复用会放大单点泄露的影响。

挑战响应认证引入一次性随机数(nonce/challenge),使攻击者无法仅靠截获一次响应就完成重放。典型流程是:服务端下发随机挑战 C,客户端用共享密钥 K 计算 R = HMAC(K, C),服务端用同一 K 重算并比对。这里的关键安全条件是:挑战必须足够随机、单次有效、有明确有效期,且绑定会话上下文(如客户端标识、时间戳)。若挑战可预测或可复用,挑战响应就退化为可重放的口令。测试时应重点观察挑战是否重复、是否在失败后仍被接受、是否与响应存在绑定关系。

令牌认证把“证明身份”与“使用身份”解耦:用户先通过一次认证换取令牌,后续请求携带令牌访问资源。常见形态包括不透明令牌(服务端查表校验)与自包含令牌(如 JWT,服务端验签后直接读取声明)。JWT 的典型结构为 header.payload.signature,签名算法如 RS256 或 ES256。令牌认证的风险集中在:令牌泄露即身份冒用、签名算法混淆(如把 RS256 降级为 HS256 并用公钥当 HMAC 密钥)、未校验 aud/iss/exp、以及注销后令牌仍在有效期内可用。因此令牌应短有效期、可撤销、绑定受众,并避免放入 URL 或日志。

联合身份把认证职责委托给身份提供方(IdP),依赖方(RP)通过标准协议获取断言。OAuth 2.0 负责授权委托,OIDC 在其上叠加身份层,核心是 ID Token 与 UserInfo。典型授权码流程中,RP 将用户重定向到 IdP,用户认证后 IdP 返回授权码,RP 用授权码加 client_secret(或 PKCE 的 code_verifier)换取令牌。联合身份的风险在于信任链被错误配置:redirect_uri 校验不严会导致授权码被劫持,state 缺失会引入 CSRF,PKCE 缺失会让公共客户端授权码可被拦截后兑换。

认证范式 · 信任边界 · 攻击者能力 · STRIDE 映射 信任边界(不可信终端 / 不可信信道 → 可信服务端) 口令认证 凭证:口令 / 慢哈希 Argon2id m=64MiB t=3 风险:重放·爆破·钓鱼 S·I·D 挑战响应 R = HMAC(K, C) C 单次有效·绑定会话 风险:挑战可预测/复用 S·T 令牌认证 JWT: header.payload.sig RS256 / ES256 验签 风险:算法混淆·未校验 S·T·E 联合身份 OIDC 授权码 + PKCE IdP 断言 → RP 信任 风险:redirect_uri·state S·T·I 攻击者能力假设(由弱到强) A1 被动窃听:可读明文信道流量 A2 主动篡改:可改包、重放、注入 A3 凭证窃取:钓鱼、恶意客户端、日志泄露 A4 内部/配置面:读密钥、改 IdP 元数据 能力越强,越需短令牌、可撤销、强绑定 STRIDE 威胁分类与认证资产 S 仿冒 → 口令/令牌被盗用 T 篡改 → 断言/签名被改 R 抵赖 → 无审计绑定 I 信息泄露 → 凭证外泄 D 拒绝服务 → 锁定/耗尽 E 权限提升 → 越权访问 建模顺序:资产 → 边界 → 能力 → STRIDE → 控制 控制示例:MFA、PKCE、短 TTL、aud/iss 校验 验证点:重放、降级、重定向、令牌撤销

攻击者能力假设与信任边界

威胁模型的第一步不是列威胁,而是明确“攻击者能做什么”。建议按能力递增分层:A1 被动窃听,只能读取明文信道流量;A2 主动篡改,可改包、重放、注入;A3 凭证窃取,可通过钓鱼、恶意客户端或日志泄露拿到口令与令牌;A4 内部或配置面能力,可读取密钥、修改 IdP 元数据。能力假设直接决定控制强度:若只假设 A1,强制 TLS 即可;若假设 A3,则必须引入 MFA、短有效期令牌与绑定设备的凭证。

信任边界是威胁建模的骨架。典型边界有三条:终端与服务端之间(终端不可信,输入不可信)、服务端与 IdP 之间(依赖方必须校验断言来源与受众)、服务与存储之间(密钥与哈希库是高价值资产)。跨边界的数据流就是攻击面:口令从终端到服务端、授权码从 IdP 到 RP、令牌从 RP 到资源服务。测试时应沿每条边界追问:数据是否可被替换、是否可被重放、接收方是否验证了来源与完整性。

STRIDE 建模与认证资产映射

STRIDE 把威胁分为仿冒(S)、篡改(T)、抵赖(R)、信息泄露(I)、拒绝服务(D)、权限提升(E)。映射到认证资产上:口令与令牌泄露对应 S 与 I;断言或签名被改对应 T;缺少审计绑定对应 R;账号锁定与资源耗尽对应 D;令牌声明被滥用导致越权对应 E。建模顺序建议为:先列资产(口令库、签名私钥、令牌、断言、会话),再画边界,再定攻击者能力,然后逐资产套 STRIDE,最后为每个威胁指定控制与验证点。

以 OIDC 授权码流程为例,可落地的控制与验证点包括:redirect_uri 必须精确匹配白名单,state 必须随机且一次性校验,公共客户端必须使用 PKCE(S256),ID Token 必须校验 iss、aud、exp、nonce 与签名算法,令牌 TTL 建议访问令牌 5~15 分钟、刷新令牌可撤销。测试时构造四类用例:重放旧授权码、篡改 redirect_uri、把 RS256 降级为 HS256、注销后继续使用旧令牌。若四类均被拒绝并留下审计记录,说明该边界的基本控制有效。

建模时先固定参照系:本文所有“方向”均指数据从不可信侧流向可信侧;跨边界即视为攻击面,接收方必须独立验证来源、完整性与时效。

可直接使用的 STRIDE 认证威胁建模表

资产信任边界攻击者能力STRIDE控制验证点
口令哈希库服务端→存储A4I / SArgon2id 加盐、最小权限泄露后是否可离线爆破
挑战 nonce终端→服务端A2S / T单次有效、绑定会话重复挑战是否被拒
JWT 签名RP→资源服务A2T / E固定算法、校验 aud/iss算法降级是否被拒
授权码IdP→RPA3S / IPKCE、state、精确 redirect_uri旧码与篡改重定向是否被拒
刷新令牌RP→IdPA3S / E可撤销、轮换、绑定客户端注销后是否立即失效

把这张表当作测试设计的输入:每一行对应一组可执行的负向用例,验证点即断言条件。认证协议的安全不取决于单点算法强度,而取决于信任边界上每一跳是否都做了来源、完整性与时效验证。下一阶段将在此模型上展开具体的协议测试方法与风险治理措施。