13.3 增强保护质量

可以在三种摘要首部中提供 qop 字段:WWW-AuthenticateAuthorizationAuthentication-Info

通过 qop 字段,客户端和服务器可以对不同类型及质量的保护进行协商。比如,即便会严重降低传输速度,有些事务可能也要检查报文主体的完整性。

服务器首先在 WWW-Authenticate 首部输出由逗号分隔的 qop 选项列表。然后客户端从中选择一个它支持且满足其需求的选项,并将其放在 Authorizationqop 字段中回送给服务器。

qop 字段是可选的,但只是在后向兼容原有 RFC 2069 规范的情况下才是可选的。现代所有的摘要实现都应该支持 qop 选项。

RFC 2617 定义了两种保护质量的初始值:表示认证的 auth,带有报文完整性保护的认证 auth-int。将来可能还会出现其他 qop 选项。

13.3.1 报文完整性保护

如果使用了完整性保护(qop="auth-int"),H(实体的主体部分)就是对实体主体部分,而不是报文主体部分的散列。对于发送者,要在应用任意传输编码方式之前计算;而对于接收者,则应在去除所有传输编码之后计算。注意,对于任何含有多部份的内容类型来说,多部分的边界和每部分中嵌入的首部都要包含在内。

13.3.2 摘要认证首部

基本认证和摘要认证协议都包含了 WWW-Authenticate 首部承载的授权质询、Authorization 首部承载的授权响应。摘要认证还添加了可选的 Authorization-Info 首部,这个首部是在成功认证之后发送的,用于实现三步握手机制,并传送下一个随机数。表 13-8 给出了基本认证和摘要认证的首部。

表13-8 HTTP认证首部

阶段 基  本 摘  要
质询
  1. WWW-Authenticate: Basic
    realm="<realm-value>"
  1. WWW-Authenticate: Digest
    realm="<realm-value>"
    nonce="<nonce-value>"
    [domain="<list-of-URIs>"]
    [opaque="<opaque-token-value>"]
    [stale=<true-or-false>]
    [algorithm=<digest-algorithm>]
    [qop="<list-of-qop-values>"]
    [<extension-directive>]
响应
  1. Authorization: Basic
    <base64(user:pass)>
  1. Authorization: Digest
    username="<username>"
    realm="<realm-value>"
    nonce="<nonce-value>"
    uri=<request-uri>
    response="<32-hex-digit-digest>"
    [algorithm=<digest-algorithm>]
    [opaque="<opaque-token-value>"]
    [cnonce="<nonce-value>"]
    [qop=<qop-value>]
    [nc=<8-hex-digit-nonce-count>]
    [<extension-directive>]
Info n/a
  1. Authentication-Info:
    nextnonce="<nonce-value>"
    [qop="<list-of-qop-values>"]
    [rspauth="<hex-digest>"]
    [cnonce="<nonce-value>"]
    [nc=<8-hex-digit-nonce-count>]

摘要认证首部要复杂得多。详细介绍参见附录 F。