1 | <?xml version="1.0" encoding="UTF-8"?> |
---|
2 | <?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?> |
---|
3 | <?rfc toc="yes"?> |
---|
4 | <?rfc symrefs="no"?> |
---|
5 | <?rfc sortrefs="no"?> |
---|
6 | <?rfc compact="yes"?> |
---|
7 | <?rfc subcompact="no"?> |
---|
8 | <?rfc-ext allow-markup-in-artwork="yes"?> |
---|
9 | <?rfc-ext include-references-in-index="yes" ?> |
---|
10 | |
---|
11 | <!DOCTYPE rfc [ |
---|
12 | <!ENTITY MAY "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>MAY</bcp14>"> |
---|
13 | <!ENTITY MUST "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>MUST</bcp14>"> |
---|
14 | <!ENTITY MUST-NOT "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>MUST NOT</bcp14>"> |
---|
15 | <!ENTITY OPTIONAL "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>OPTIONAL</bcp14>"> |
---|
16 | <!ENTITY RECOMMENDED "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>RECOMMENDED</bcp14>"> |
---|
17 | <!ENTITY REQUIRED "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>REQUIRED</bcp14>"> |
---|
18 | <!ENTITY SHALL "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>SHALL</bcp14>"> |
---|
19 | <!ENTITY SHALL-NOT "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>SHALL NOT</bcp14>"> |
---|
20 | <!ENTITY SHOULD "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>SHOULD</bcp14>"> |
---|
21 | <!ENTITY SHOULD-NOT "<bcp14 xmlns='http://purl.org/net/xml2rfc/ext'>SHOULD NOT</bcp14>"> |
---|
22 | ]> |
---|
23 | <rfc number="2617" category="std" obsoletes="2069" xmlns:x='http://purl.org/net/xml2rfc/ext' xmlns:grddl='http://www.w3.org/2003/g/data-view#' grddl:transformation='rfc2629grddl.xslt'> |
---|
24 | <front> |
---|
25 | <title abbrev="HTTP Authentication">HTTP Authentication: Basic and Digest Access Authentication</title> |
---|
26 | <author initials="J." surname="Franks" fullname="John Franks"> |
---|
27 | <organization>Northwestern University, Department of Mathematics</organization> |
---|
28 | <address> |
---|
29 | <postal> |
---|
30 | <street>Northwestern University</street> |
---|
31 | <city>Evanston</city> |
---|
32 | <region>IL</region> |
---|
33 | <code>60208-2730</code> |
---|
34 | <country>USA</country> |
---|
35 | </postal> |
---|
36 | <email>john@math.nwu.edu</email> |
---|
37 | </address> |
---|
38 | </author> |
---|
39 | <author initials="P.M." surname="Hallam-Baker" fullname="Phillip M. Hallam-Baker"> |
---|
40 | <organization>Verisign Inc.</organization> |
---|
41 | <address> |
---|
42 | <postal> |
---|
43 | <street>301 Edgewater Place</street> |
---|
44 | <street>Suite 210</street> |
---|
45 | <city>Wakefield</city> |
---|
46 | <region>MA</region> |
---|
47 | <code>01880</code> |
---|
48 | <country>USA</country> |
---|
49 | </postal> |
---|
50 | <email>pbaker@verisign.com</email> |
---|
51 | </address> |
---|
52 | </author> |
---|
53 | <author initials="J.L." surname="Hostetler" fullname="Jeffery L. Hostetler"> |
---|
54 | <organization>AbiSource, Inc.</organization> |
---|
55 | <address> |
---|
56 | <postal> |
---|
57 | <street>6 Dunlap Court</street> |
---|
58 | <city>Savoy</city> |
---|
59 | <region>IL</region> |
---|
60 | <code>61874</code> |
---|
61 | <country>USA</country> |
---|
62 | </postal> |
---|
63 | <email>jeff@AbiSource.com</email> |
---|
64 | </address> |
---|
65 | </author> |
---|
66 | <author initials="S.D." surname="Lawrence" fullname="Scott D. Lawrence"> |
---|
67 | <organization>Agranat Systems, Inc.</organization> |
---|
68 | <address> |
---|
69 | <postal> |
---|
70 | <street>5 Clocktower Place</street> |
---|
71 | <street>Suite 400</street> |
---|
72 | <city>Maynard</city> |
---|
73 | <region>MA</region> |
---|
74 | <code>01754</code> |
---|
75 | <country>USA</country> |
---|
76 | </postal> |
---|
77 | <email>lawrence@agranat.com</email> |
---|
78 | </address> |
---|
79 | </author> |
---|
80 | <author initials="P.J." surname="Leach" fullname="Paul J. Leach"> |
---|
81 | <organization>Microsoft Corporation</organization> |
---|
82 | <address> |
---|
83 | <postal> |
---|
84 | <street>1 Microsoft Way</street> |
---|
85 | <city>Redmond</city> |
---|
86 | <region>WA</region> |
---|
87 | <code>98052</code> |
---|
88 | <country>USA</country> |
---|
89 | </postal> |
---|
90 | <email>paulle@microsoft.com</email> |
---|
91 | </address> |
---|
92 | </author> |
---|
93 | <author initials="A." surname="Luotonen" fullname="Ari Luotonen"> |
---|
94 | <organization>Netscape Communications Corporation</organization> |
---|
95 | <address> |
---|
96 | <postal> |
---|
97 | <street>501 East Middlefield Road</street> |
---|
98 | <city>Mountain View</city> |
---|
99 | <region>CA</region> |
---|
100 | <code>94043</code> |
---|
101 | <country>USA</country> |
---|
102 | </postal> |
---|
103 | </address> |
---|
104 | </author> |
---|
105 | <author initials="L." surname="Stewart" fullname="Lawrence C. Stewart"> |
---|
106 | <organization>Open Market, Inc.</organization> |
---|
107 | <address> |
---|
108 | <postal> |
---|
109 | <street>215 First Street</street> |
---|
110 | <city>Cambridge</city> |
---|
111 | <region>MA</region> |
---|
112 | <code>02142</code> |
---|
113 | <country>USA</country> |
---|
114 | </postal> |
---|
115 | <email>stewart@OpenMarket.com</email> |
---|
116 | </address> |
---|
117 | </author> |
---|
118 | <date month="June" year="1999"/> |
---|
119 | |
---|
120 | <abstract> |
---|
121 | <t> |
---|
122 | "HTTP/1.0", includes the specification for a Basic Access |
---|
123 | Authentication scheme. This scheme is not considered to be a secure |
---|
124 | method of user authentication (unless used in conjunction with some |
---|
125 | external secure system such as SSL <xref target="RFC2246"/>), as the user name and |
---|
126 | password are passed over the network as cleartext. |
---|
127 | </t><t> |
---|
128 | This document also provides the specification for HTTP's |
---|
129 | authentication framework, the original Basic authentication scheme |
---|
130 | and a scheme based on cryptographic hashes, referred to as "Digest |
---|
131 | Access Authentication". It is therefore also intended to serve as a |
---|
132 | replacement for RFC 2069 <xref target="RFC2069"/>. Some optional elements specified by |
---|
133 | RFC 2069 have been removed from this specification due to problems |
---|
134 | found since its publication; other new elements have been added for |
---|
135 | compatibility, those new elements have been made optional, but are |
---|
136 | strongly recommended. |
---|
137 | </t><t> |
---|
138 | Like Basic, Digest access authentication verifies that both parties |
---|
139 | to a communication know a shared secret (a password); unlike Basic, |
---|
140 | this verification can be done without sending the password in the |
---|
141 | clear, which is Basic's biggest weakness. As with most other |
---|
142 | authentication protocols, the greatest sources of risks are usually |
---|
143 | found not in the core protocol itself but in policies and procedures |
---|
144 | surrounding its use. |
---|
145 | </t> |
---|
146 | </abstract> |
---|
147 | </front> |
---|
148 | <middle> |
---|
149 | |
---|
150 | <section title="Access Authentication"> |
---|
151 | |
---|
152 | <section title="Reliance on the HTTP/1.1 Specification"> |
---|
153 | <t> |
---|
154 | This specification is a companion to the HTTP/1.1 specification <xref target="RFC2616"/>. |
---|
155 | It uses the augmented BNF section <xref target="RFC2616" x:fmt="number" x:rel="#notation.abnf"/> of that document, and relies on |
---|
156 | both the non-terminals defined in that document and other aspects of |
---|
157 | the HTTP/1.1 specification. |
---|
158 | </t> |
---|
159 | </section> |
---|
160 | |
---|
161 | <section title="Access Authentication Framework" anchor="access.authentication.framework"> |
---|
162 | <t> |
---|
163 | HTTP provides a simple challenge-response authentication mechanism |
---|
164 | that &MAY; be used by a server to challenge a client request and by a |
---|
165 | client to provide authentication information. It uses an extensible, |
---|
166 | case-insensitive token to identify the authentication scheme, |
---|
167 | followed by a comma-separated list of attribute-value pairs which |
---|
168 | carry the parameters necessary for achieving authentication via that |
---|
169 | scheme. |
---|
170 | </t> |
---|
171 | <figure><artwork type="abnf2616"><iref item="auth-scheme" primary="true" |
---|
172 | /> auth-scheme = token |
---|
173 | <iref item="auth-param" primary="true" |
---|
174 | /> auth-param = token "=" ( token | quoted-string ) |
---|
175 | </artwork></figure> |
---|
176 | <t> |
---|
177 | The 401 (Unauthorized) response message is used by an origin server |
---|
178 | to challenge the authorization of a user agent. This response &MUST; |
---|
179 | include a WWW-Authenticate header field containing at least one |
---|
180 | challenge applicable to the requested resource. The 407 (Proxy |
---|
181 | Authentication Required) response message is used by a proxy to |
---|
182 | challenge the authorization of a client and &MUST; include a Proxy-Authenticate |
---|
183 | header field containing at least one challenge |
---|
184 | applicable to the proxy for the requested resource. |
---|
185 | </t> |
---|
186 | <figure><artwork type="abnf2616"><iref item="challenge" primary="true" |
---|
187 | /> challenge = auth-scheme 1*SP 1#auth-param |
---|
188 | </artwork></figure> |
---|
189 | <t> |
---|
190 | Note: User agents will need to take special care in parsing the WWW-Authenticate |
---|
191 | or Proxy-Authenticate header field value if it contains |
---|
192 | more than one challenge, or if more than one WWW-Authenticate header |
---|
193 | field is provided, since the contents of a challenge may itself |
---|
194 | contain a comma-separated list of authentication parameters. |
---|
195 | </t> |
---|
196 | <t> |
---|
197 | The authentication parameter realm is defined for all authentication |
---|
198 | schemes: |
---|
199 | </t> |
---|
200 | <figure><artwork type="abnf2616"><iref item="realm" primary="true" |
---|
201 | /> realm = "realm" "=" realm-value |
---|
202 | <iref item="realm-value" primary="true" |
---|
203 | /> realm-value = quoted-string |
---|
204 | </artwork></figure> |
---|
205 | <t> |
---|
206 | The realm directive (case-insensitive) is required for all |
---|
207 | authentication schemes that issue a challenge. The realm value |
---|
208 | (case-sensitive), in combination with the canonical root URL (the |
---|
209 | absoluteURI for the server whose abs_path is empty; see section <xref target="RFC2616" x:fmt="number" x:rel="#request-uri"/> |
---|
210 | of <xref target="RFC2616"/>) of the server being accessed, defines the protection space. |
---|
211 | These realms allow the protected resources on a server to be |
---|
212 | partitioned into a set of protection spaces, each with its own |
---|
213 | authentication scheme and/or authorization database. The realm value |
---|
214 | is a string, generally assigned by the origin server, which may have |
---|
215 | additional semantics specific to the authentication scheme. Note that |
---|
216 | there may be multiple challenges with the same auth-scheme but |
---|
217 | different realms. |
---|
218 | </t> |
---|
219 | <t> |
---|
220 | A user agent that wishes to authenticate itself with an origin |
---|
221 | server--usually, but not necessarily, after receiving a 401 |
---|
222 | (Unauthorized)--MAY do so by including an Authorization header field |
---|
223 | with the request. A client that wishes to authenticate itself with a |
---|
224 | proxy--usually, but not necessarily, after receiving a 407 (Proxy |
---|
225 | Authentication Required)--MAY do so by including a Proxy-Authorization |
---|
226 | header field with the request. Both the Authorization |
---|
227 | field value and the Proxy-Authorization field value consist of |
---|
228 | credentials containing the authentication information of the client |
---|
229 | for the realm of the resource being requested. The user agent &MUST; |
---|
230 | choose to use one of the challenges with the strongest auth-scheme it |
---|
231 | understands and request credentials from the user based upon that |
---|
232 | challenge. |
---|
233 | </t> |
---|
234 | <figure><artwork type="abnf2616"><iref item="credentials" primary="true" |
---|
235 | /> credentials = auth-scheme #auth-param |
---|
236 | </artwork></figure> |
---|
237 | <t> |
---|
238 | <list><t> |
---|
239 | Note that many browsers will only recognize Basic and will require |
---|
240 | that it be the first auth-scheme presented. Servers should only |
---|
241 | include Basic if it is minimally acceptable. |
---|
242 | </t></list> |
---|
243 | </t> |
---|
244 | <t> |
---|
245 | The protection space determines the domain over which credentials can |
---|
246 | be automatically applied. If a prior request has been authorized, the |
---|
247 | same credentials &MAY; be reused for all other requests within that |
---|
248 | protection space for a period of time determined by the |
---|
249 | authentication scheme, parameters, and/or user preference. Unless |
---|
250 | otherwise defined by the authentication scheme, a single protection |
---|
251 | space cannot extend outside the scope of its server. |
---|
252 | </t> |
---|
253 | <t> |
---|
254 | If the origin server does not wish to accept the credentials sent |
---|
255 | with a request, it &SHOULD; return a 401 (Unauthorized) response. The |
---|
256 | response &MUST; include a WWW-Authenticate header field containing at |
---|
257 | least one (possibly new) challenge applicable to the requested |
---|
258 | resource. If a proxy does not accept the credentials sent with a |
---|
259 | request, it &SHOULD; return a 407 (Proxy Authentication Required). The |
---|
260 | response &MUST; include a Proxy-Authenticate header field containing a |
---|
261 | (possibly new) challenge applicable to the proxy for the requested |
---|
262 | resource. |
---|
263 | </t> |
---|
264 | <t> |
---|
265 | The HTTP protocol does not restrict applications to this simple |
---|
266 | challenge-response mechanism for access authentication. Additional |
---|
267 | mechanisms &MAY; be used, such as encryption at the transport level or |
---|
268 | via message encapsulation, and with additional header fields |
---|
269 | specifying authentication information. However, these additional |
---|
270 | mechanisms are not defined by this specification. |
---|
271 | </t> |
---|
272 | <t> |
---|
273 | Proxies &MUST; be completely transparent regarding user agent |
---|
274 | authentication by origin servers. That is, they must forward the |
---|
275 | WWW-Authenticate and Authorization headers untouched, and follow the |
---|
276 | rules found in section <xref target="RFC2616" x:fmt="number" x:rel="#header.authorization"/> of <xref target="RFC2616"/>. Both the Proxy-Authenticate and |
---|
277 | the Proxy-Authorization header fields are hop-by-hop headers (see |
---|
278 | section <xref target="RFC2616" x:fmt="number" x:rel="#end-to-end.and.hop-by-hop.headers"/> of <xref target="RFC2616"/>). |
---|
279 | </t> |
---|
280 | </section> |
---|
281 | </section> |
---|
282 | |
---|
283 | <section title="Basic Authentication Scheme"> |
---|
284 | <t> |
---|
285 | The "basic" authentication scheme is based on the model that the |
---|
286 | client must authenticate itself with a user-ID and a password for |
---|
287 | each realm. The realm value should be considered an opaque string |
---|
288 | which can only be compared for equality with other realms on that |
---|
289 | server. The server will service the request only if it can validate |
---|
290 | the user-ID and password for the protection space of the Request-URI. |
---|
291 | There are no optional authentication parameters. |
---|
292 | </t> |
---|
293 | <t> |
---|
294 | For Basic, the framework above is utilized as follows: |
---|
295 | </t> |
---|
296 | <figure><artwork type="abnf2616"><iref item="challenge" |
---|
297 | /> challenge = "Basic" realm |
---|
298 | <iref item="credentials" |
---|
299 | /> credentials = "Basic" basic-credentials |
---|
300 | </artwork></figure> |
---|
301 | <t> |
---|
302 | Upon receipt of an unauthorized request for a URI within the |
---|
303 | protection space, the origin server &MAY; respond with a challenge like |
---|
304 | the following: |
---|
305 | </t> |
---|
306 | <figure><artwork type="example"> |
---|
307 | WWW-Authenticate: Basic realm="WallyWorld" |
---|
308 | </artwork></figure> |
---|
309 | <t> |
---|
310 | where "WallyWorld" is the string assigned by the server to identify |
---|
311 | the protection space of the Request-URI. A proxy may respond with the |
---|
312 | same challenge using the Proxy-Authenticate header field. |
---|
313 | </t> |
---|
314 | <t> |
---|
315 | To receive authorization, the client sends the userid and password, |
---|
316 | separated by a single colon (":") character, within a base64 <xref target="RFC2396"/> |
---|
317 | encoded string in the credentials. |
---|
318 | </t> |
---|
319 | <figure><artwork type="abnf2616"><iref item="basic-credentials" primary="true" |
---|
320 | /> basic-credentials = base64-user-pass |
---|
321 | <iref item="base64-user-pass" primary="true" |
---|
322 | /> base64-user-pass = <base64 [4] encoding of user-pass, |
---|
323 | except not limited to 76 char/line> |
---|
324 | <iref item="user-pass" primary="true" |
---|
325 | /> user-pass = userid ":" password |
---|
326 | <iref item="userid" primary="true" |
---|
327 | /> userid = *<TEXT excluding ":"> |
---|
328 | <iref item="password" primary="true" |
---|
329 | /> password = *TEXT |
---|
330 | </artwork></figure> |
---|
331 | <t> |
---|
332 | Userids might be case sensitive. |
---|
333 | </t> |
---|
334 | <t> |
---|
335 | If the user agent wishes to send the userid "Aladdin" and password |
---|
336 | "open sesame", it would use the following header field: |
---|
337 | </t> |
---|
338 | <figure><artwork type="example"> |
---|
339 | Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
---|
340 | </artwork></figure> |
---|
341 | <t> |
---|
342 | A client &SHOULD; assume that all paths at or deeper than the depth of |
---|
343 | the last symbolic element in the path field of the Request-URI also |
---|
344 | are within the protection space specified by the Basic realm value of |
---|
345 | the current challenge. A client &MAY; preemptively send the |
---|
346 | corresponding Authorization header with requests for resources in |
---|
347 | that space without receipt of another challenge from the server. |
---|
348 | Similarly, when a client sends a request to a proxy, it may reuse a |
---|
349 | userid and password in the Proxy-Authorization header field without |
---|
350 | receiving another challenge from the proxy server. See <xref target="security.considerations"/> for |
---|
351 | security considerations associated with Basic authentication. |
---|
352 | </t> |
---|
353 | </section> |
---|
354 | |
---|
355 | <section title="Digest Access Authentication Scheme"> |
---|
356 | |
---|
357 | <section title="Introduction"> |
---|
358 | |
---|
359 | <section title="Purpose"> |
---|
360 | <t> |
---|
361 | The protocol referred to as "HTTP/1.0" includes the specification for |
---|
362 | a Basic Access Authentication scheme<xref target="RFC1945"/>. That scheme is not |
---|
363 | considered to be a secure method of user authentication, as the user |
---|
364 | name and password are passed over the network in an unencrypted form. |
---|
365 | This section provides the specification for a scheme that does not |
---|
366 | send the password in cleartext, referred to as "Digest Access |
---|
367 | Authentication". |
---|
368 | </t> |
---|
369 | <t> |
---|
370 | The Digest Access Authentication scheme is not intended to be a |
---|
371 | complete answer to the need for security in the World Wide Web. This |
---|
372 | scheme provides no encryption of message content. The intent is |
---|
373 | simply to create an access authentication method that avoids the most |
---|
374 | serious flaws of Basic authentication. |
---|
375 | </t> |
---|
376 | </section> |
---|
377 | |
---|
378 | <section title="Overall Operation"> |
---|
379 | <t> |
---|
380 | Like Basic Access Authentication, the Digest scheme is based on a |
---|
381 | simple challenge-response paradigm. The Digest scheme challenges |
---|
382 | using a nonce value. A valid response contains a checksum (by |
---|
383 | default, the MD5 checksum) of the username, the password, the given |
---|
384 | nonce value, the HTTP method, and the requested URI. In this way, the |
---|
385 | password is never sent in the clear. Just as with the Basic scheme, |
---|
386 | the username and password must be prearranged in some fashion not |
---|
387 | addressed by this document. |
---|
388 | </t> |
---|
389 | </section> |
---|
390 | |
---|
391 | <section title="Representation of digest values"> |
---|
392 | <t> |
---|
393 | An optional header allows the server to specify the algorithm used to |
---|
394 | create the checksum or digest. By default the MD5 algorithm is used |
---|
395 | and that is the only algorithm described in this document. |
---|
396 | </t> |
---|
397 | <t> |
---|
398 | For the purposes of this document, an MD5 digest of 128 bits is |
---|
399 | represented as 32 ASCII printable characters. The bits in the 128 bit |
---|
400 | digest are converted from most significant to least significant bit, |
---|
401 | four bits at a time to their ASCII presentation as follows. Each four |
---|
402 | bits is represented by its familiar hexadecimal notation from the |
---|
403 | characters 0123456789abcdef. That is, binary 0000 gets represented by |
---|
404 | the character '0', 0001, by '1', and so on up to the representation |
---|
405 | of 1111 as 'f'. |
---|
406 | </t> |
---|
407 | </section> |
---|
408 | |
---|
409 | <section title="Limitations"> |
---|
410 | <t> |
---|
411 | The Digest authentication scheme described in this document suffers |
---|
412 | from many known limitations. It is intended as a replacement for |
---|
413 | Basic authentication and nothing more. It is a password-based system |
---|
414 | and (on the server side) suffers from all the same problems of any |
---|
415 | password system. In particular, no provision is made in this protocol |
---|
416 | for the initial secure arrangement between user and server to |
---|
417 | establish the user's password. |
---|
418 | </t> |
---|
419 | <t> |
---|
420 | Users and implementors should be aware that this protocol is not as |
---|
421 | secure as Kerberos, and not as secure as any client-side private-key |
---|
422 | scheme. Nevertheless it is better than nothing, better than what is |
---|
423 | commonly used with telnet and ftp, and better than Basic |
---|
424 | authentication. |
---|
425 | </t> |
---|
426 | </section> |
---|
427 | </section> |
---|
428 | |
---|
429 | <section title="Specification of Digest Headers" anchor="specification.of.digest.headers"> |
---|
430 | <t> |
---|
431 | The Digest Access Authentication scheme is conceptually similar to |
---|
432 | the Basic scheme. The formats of the modified WWW-Authenticate header |
---|
433 | line and the Authorization header line are specified below. In |
---|
434 | addition, a new header, Authentication-Info, is specified. |
---|
435 | </t> |
---|
436 | |
---|
437 | <section title="The WWW-Authenticate Response Header" anchor="the.www-authenticate.response.header"> |
---|
438 | <iref item="Headers" subitem="WWW-Authenticate" primary="true"/> |
---|
439 | <iref item="WWW-Authenticate header" primary="true"/> |
---|
440 | <t> |
---|
441 | If a server receives a request for an access-protected object, and an |
---|
442 | acceptable Authorization header is not sent, the server responds with |
---|
443 | a "401 Unauthorized" status code, and a WWW-Authenticate header as |
---|
444 | per the framework defined above, which for the digest scheme is |
---|
445 | utilized as follows: |
---|
446 | </t> |
---|
447 | <figure><artwork type="abnf2616"> |
---|
448 | <iref item="challenge" |
---|
449 | /> challenge = "Digest" digest-challenge |
---|
450 | |
---|
451 | <iref item="digest-challenge" primary="true" |
---|
452 | /> digest-challenge = 1#( realm | [ domain ] | nonce | |
---|
453 | [ opaque ] |[ stale ] | [ algorithm ] | |
---|
454 | [ qop-options ] | [auth-param] ) |
---|
455 | |
---|
456 | |
---|
457 | <iref item="domain" primary="true" |
---|
458 | /> domain = "domain" "=" <"> URI ( 1*SP URI ) <"> |
---|
459 | <iref item="URI" primary="true" |
---|
460 | /> URI = absoluteURI | abs_path |
---|
461 | <iref item="nonce" primary="true" |
---|
462 | /> nonce = "nonce" "=" nonce-value |
---|
463 | <iref item="nonce-value" primary="true" |
---|
464 | /> nonce-value = quoted-string |
---|
465 | <iref item="opaque" primary="true" |
---|
466 | /> opaque = "opaque" "=" quoted-string |
---|
467 | <iref item="stale" primary="true" |
---|
468 | /> stale = "stale" "=" ( "true" | "false" ) |
---|
469 | <iref item="algorithm" primary="true" |
---|
470 | /> algorithm = "algorithm" "=" ( "MD5" | "MD5-sess" | |
---|
471 | token ) |
---|
472 | <iref item="qop-options" primary="true" |
---|
473 | /> qop-options = "qop" "=" <"> 1#qop-value <"> |
---|
474 | <iref item="qop-value" primary="true" |
---|
475 | /> qop-value = "auth" | "auth-int" | token |
---|
476 | </artwork></figure> |
---|
477 | <t> |
---|
478 | The meanings of the values of the directives used above are as |
---|
479 | follows: |
---|
480 | </t> |
---|
481 | <t> |
---|
482 | realm |
---|
483 | <list><t> |
---|
484 | A string to be displayed to users so they know which username and |
---|
485 | password to use. This string should contain at least the name of |
---|
486 | the host performing the authentication and might additionally |
---|
487 | indicate the collection of users who might have access. An example |
---|
488 | might be "registered_users@gotham.news.com". |
---|
489 | </t></list> |
---|
490 | </t> |
---|
491 | <t> |
---|
492 | domain |
---|
493 | <list><t> |
---|
494 | A quoted, space-separated list of URIs, as specified in RFC XURI |
---|
495 | <xref target="RFC2396"/>, that define the protection space. If a URI is an abs_path, it |
---|
496 | is relative to the canonical root URL (see <xref target="access.authentication.framework"/> above) of |
---|
497 | the server being accessed. An absoluteURI in this list may refer to |
---|
498 | a different server than the one being accessed. The client can use |
---|
499 | this list to determine the set of URIs for which the same |
---|
500 | authentication information may be sent: any URI that has a URI in |
---|
501 | this list as a prefix (after both have been made absolute) may be |
---|
502 | assumed to be in the same protection space. If this directive is |
---|
503 | omitted or its value is empty, the client should assume that the |
---|
504 | protection space consists of all URIs on the responding server. |
---|
505 | This directive is not meaningful in Proxy-Authenticate headers, for |
---|
506 | which the protection space is always the entire proxy; if present |
---|
507 | it should be ignored. |
---|
508 | </t></list> |
---|
509 | </t> |
---|
510 | <t> |
---|
511 | nonce |
---|
512 | <list><t> |
---|
513 | A server-specified data string which should be uniquely generated |
---|
514 | each time a 401 response is made. It is recommended that this |
---|
515 | string be base64 or hexadecimal data. Specifically, since the |
---|
516 | string is passed in the header lines as a quoted string, the |
---|
517 | double-quote character is not allowed. |
---|
518 | </t> |
---|
519 | <t> |
---|
520 | The contents of the nonce are implementation dependent. The quality |
---|
521 | of the implementation depends on a good choice. A nonce might, for |
---|
522 | example, be constructed as the base 64 encoding of |
---|
523 | </t> |
---|
524 | <t><figure><artwork type="code"> |
---|
525 | time-stamp H(time-stamp ":" ETag ":" private-key) |
---|
526 | </artwork></figure></t> |
---|
527 | <t> |
---|
528 | where time-stamp is a server-generated time or other non-repeating |
---|
529 | value, ETag is the value of the HTTP ETag header associated with |
---|
530 | the requested entity, and private-key is data known only to the |
---|
531 | server. With a nonce of this form a server would recalculate the |
---|
532 | hash portion after receiving the client authentication header and |
---|
533 | reject the request if it did not match the nonce from that header |
---|
534 | or if the time-stamp value is not recent enough. In this way the |
---|
535 | server can limit the time of the nonce's validity. The inclusion of |
---|
536 | the ETag prevents a replay request for an updated version of the |
---|
537 | resource. (Note: including the IP address of the client in the |
---|
538 | nonce would appear to offer the server the ability to limit the |
---|
539 | reuse of the nonce to the same client that originally got it. |
---|
540 | However, that would break proxy farms, where requests from a single |
---|
541 | user often go through different proxies in the farm. Also, IP |
---|
542 | address spoofing is not that hard.) |
---|
543 | </t> |
---|
544 | <t> |
---|
545 | An implementation might choose not to accept a previously used |
---|
546 | nonce or a previously used digest, in order to protect against a |
---|
547 | replay attack. Or, an implementation might choose to use one-time |
---|
548 | nonces or digests for POST or PUT requests and a time-stamp for GET |
---|
549 | requests. For more details on the issues involved see <xref target="security.considerations"/> |
---|
550 | of this document. |
---|
551 | </t> |
---|
552 | <t> |
---|
553 | The nonce is opaque to the client. |
---|
554 | </t></list></t> |
---|
555 | <t> |
---|
556 | opaque |
---|
557 | <list><t> |
---|
558 | A string of data, specified by the server, which should be returned |
---|
559 | by the client unchanged in the Authorization header of subsequent |
---|
560 | requests with URIs in the same protection space. It is recommended |
---|
561 | that this string be base64 or hexadecimal data. |
---|
562 | </t></list> |
---|
563 | </t> |
---|
564 | <t> |
---|
565 | stale |
---|
566 | <list><t> |
---|
567 | A flag, indicating that the previous request from the client was |
---|
568 | rejected because the nonce value was stale. If stale is TRUE |
---|
569 | (case-insensitive), the client may wish to simply retry the request |
---|
570 | with a new encrypted response, without reprompting the user for a |
---|
571 | new username and password. The server should only set stale to TRUE |
---|
572 | if it receives a request for which the nonce is invalid but with a |
---|
573 | valid digest for that nonce (indicating that the client knows the |
---|
574 | correct username/password). If stale is FALSE, or anything other |
---|
575 | than TRUE, or the stale directive is not present, the username |
---|
576 | and/or password are invalid, and new values must be obtained. |
---|
577 | </t></list> |
---|
578 | </t> |
---|
579 | <t> |
---|
580 | algorithm |
---|
581 | <list><t> |
---|
582 | A string indicating a pair of algorithms used to produce the digest |
---|
583 | and a checksum. If this is not present it is assumed to be "MD5". |
---|
584 | If the algorithm is not understood, the challenge should be ignored |
---|
585 | (and a different one used, if there is more than one). |
---|
586 | </t> |
---|
587 | <t> |
---|
588 | In this document the string obtained by applying the digest |
---|
589 | algorithm to the data "data" with secret "secret" will be denoted |
---|
590 | by KD(secret, data), and the string obtained by applying the |
---|
591 | checksum algorithm to the data "data" will be denoted H(data). The |
---|
592 | notation unq(X) means the value of the quoted-string X without the |
---|
593 | surrounding quotes. |
---|
594 | </t> |
---|
595 | <t> |
---|
596 | For the "MD5" and "MD5-sess" algorithms |
---|
597 | </t> |
---|
598 | <t><figure><artwork type="code"> |
---|
599 | H(data) = MD5(data) |
---|
600 | </artwork></figure></t> |
---|
601 | <t> |
---|
602 | and |
---|
603 | </t> |
---|
604 | <t><figure><artwork type="code"> |
---|
605 | KD(secret, data) = H(concat(secret, ":", data)) |
---|
606 | </artwork></figure></t> |
---|
607 | <t> |
---|
608 | i.e., the digest is the MD5 of the secret concatenated with a colon |
---|
609 | concatenated with the data. The "MD5-sess" algorithm is intended to |
---|
610 | allow efficient 3rd party authentication servers; for the |
---|
611 | difference in usage, see the description in <xref target="A1"/>. |
---|
612 | </t></list> |
---|
613 | </t> |
---|
614 | <t> |
---|
615 | qop-options |
---|
616 | <list><t> |
---|
617 | This directive is optional, but is made so only for backward |
---|
618 | compatibility with RFC 2069 <xref target="RFC2069"/>; it &SHOULD; be used by all |
---|
619 | implementations compliant with this version of the Digest scheme. |
---|
620 | If present, it is a quoted string of one or more tokens indicating |
---|
621 | the "quality of protection" values supported by the server. The |
---|
622 | value "auth" indicates authentication; the value "auth-int" |
---|
623 | indicates authentication with integrity protection; see the |
---|
624 | descriptions below for calculating the response directive value for |
---|
625 | the application of this choice. Unrecognized options &MUST; be |
---|
626 | ignored. |
---|
627 | </t></list> |
---|
628 | </t> |
---|
629 | <t> |
---|
630 | auth-param |
---|
631 | <list><t> |
---|
632 | This directive allows for future extensions. Any unrecognized |
---|
633 | directive &MUST; be ignored. |
---|
634 | </t></list> |
---|
635 | </t> |
---|
636 | </section> |
---|
637 | |
---|
638 | <section title="The Authorization Request Header" anchor="the.authorization.request.header"> |
---|
639 | <iref item="Headers" subitem="Authorization" primary="true"/> |
---|
640 | <iref item="Authorization header" primary="true"/> |
---|
641 | <t> |
---|
642 | The client is expected to retry the request, passing an Authorization |
---|
643 | header line, which is defined according to the framework above, |
---|
644 | utilized as follows. |
---|
645 | </t> |
---|
646 | <figure><artwork type="abnf2616"> |
---|
647 | <iref item="credentials" |
---|
648 | /> credentials = "Digest" digest-response |
---|
649 | <iref item="digest-response" primary="true" |
---|
650 | /> digest-response = 1#( username | realm | nonce | digest-uri |
---|
651 | | response | [ algorithm ] | [cnonce] | |
---|
652 | [opaque] | [message-qop] | |
---|
653 | [nonce-count] | [auth-param] ) |
---|
654 | |
---|
655 | <iref item="username" primary="true" |
---|
656 | /> username = "username" "=" username-value |
---|
657 | <iref item="username-value" primary="true" |
---|
658 | /> username-value = quoted-string |
---|
659 | <iref item="digest-uri" primary="true" |
---|
660 | /> digest-uri = "uri" "=" digest-uri-value |
---|
661 | <iref item="digest-uri-value" primary="true" |
---|
662 | /> digest-uri-value = request-uri ; As specified by HTTP/1.1 |
---|
663 | <iref item="message-qop" primary="true" |
---|
664 | /> message-qop = "qop" "=" qop-value |
---|
665 | <iref item="cnonce" primary="true" |
---|
666 | /> cnonce = "cnonce" "=" cnonce-value |
---|
667 | <iref item="cnonce-value" primary="true" |
---|
668 | /> cnonce-value = nonce-value |
---|
669 | <iref item="nonce-count" primary="true" |
---|
670 | /> nonce-count = "nc" "=" nc-value |
---|
671 | <iref item="nc-value" primary="true" |
---|
672 | /> nc-value = 8LHEX |
---|
673 | <iref item="response" primary="true" |
---|
674 | /> response = "response" "=" request-digest |
---|
675 | <iref item="request-digest" primary="true" |
---|
676 | /> request-digest = <"> 32LHEX <"> |
---|
677 | <iref item="LHEX" primary="true" |
---|
678 | /> LHEX = "0" | "1" | "2" | "3" | |
---|
679 | "4" | "5" | "6" | "7" | |
---|
680 | "8" | "9" | "a" | "b" | |
---|
681 | "c" | "d" | "e" | "f" |
---|
682 | </artwork></figure> |
---|
683 | <t> |
---|
684 | The values of the opaque and algorithm fields must be those supplied |
---|
685 | in the WWW-Authenticate response header for the entity being |
---|
686 | requested. |
---|
687 | </t> |
---|
688 | <t> |
---|
689 | response |
---|
690 | <list><t> |
---|
691 | A string of 32 hex digits computed as defined below, which proves |
---|
692 | that the user knows a password |
---|
693 | </t></list> |
---|
694 | </t> |
---|
695 | <t> |
---|
696 | username |
---|
697 | <list><t> |
---|
698 | The user's name in the specified realm. |
---|
699 | </t></list> |
---|
700 | </t> |
---|
701 | <t> |
---|
702 | digest-uri |
---|
703 | <list><t> |
---|
704 | The URI from Request-URI of the Request-Line; duplicated here |
---|
705 | because proxies are allowed to change the Request-Line in transit. |
---|
706 | </t></list> |
---|
707 | </t> |
---|
708 | <t> |
---|
709 | qop |
---|
710 | <list><t> |
---|
711 | Indicates what "quality of protection" the client has applied to |
---|
712 | the message. If present, its value &MUST; be one of the alternatives |
---|
713 | the server indicated it supports in the WWW-Authenticate header. |
---|
714 | These values affect the computation of the request-digest. Note |
---|
715 | that this is a single token, not a quoted list of alternatives as |
---|
716 | in WWW-Authenticate. This directive is optional in order to |
---|
717 | preserve backward compatibility with a minimal implementation of |
---|
718 | RFC 2069 <xref target="RFC2069"/>, but &SHOULD; be used if the server indicated that qop |
---|
719 | is supported by providing a qop directive in the WWW-Authenticate |
---|
720 | header field. |
---|
721 | </t></list> |
---|
722 | </t> |
---|
723 | <t> |
---|
724 | cnonce |
---|
725 | <list><t> |
---|
726 | This &MUST; be specified if a qop directive is sent (see above), and |
---|
727 | &MUST-NOT; be specified if the server did not send a qop directive in |
---|
728 | the WWW-Authenticate header field. The cnonce-value is an opaque |
---|
729 | quoted string value provided by the client and used by both client |
---|
730 | and server to avoid chosen plaintext attacks, to provide mutual |
---|
731 | authentication, and to provide some message integrity protection. |
---|
732 | See the descriptions below of the calculation of the response-digest |
---|
733 | and request-digest values. |
---|
734 | </t></list> |
---|
735 | </t> |
---|
736 | <t> |
---|
737 | nonce-count |
---|
738 | <list><t> |
---|
739 | This &MUST; be specified if a qop directive is sent (see above), and |
---|
740 | &MUST-NOT; be specified if the server did not send a qop directive in |
---|
741 | the WWW-Authenticate header field. The nc-value is the hexadecimal |
---|
742 | count of the number of requests (including the current request) |
---|
743 | that the client has sent with the nonce value in this request. For |
---|
744 | example, in the first request sent in response to a given nonce |
---|
745 | value, the client sends "nc=00000001". The purpose of this |
---|
746 | directive is to allow the server to detect request replays by |
---|
747 | maintaining its own copy of this count - if the same nc-value is |
---|
748 | seen twice, then the request is a replay. See the description |
---|
749 | below of the construction of the request-digest value. |
---|
750 | </t></list> |
---|
751 | </t> |
---|
752 | <t> |
---|
753 | auth-param |
---|
754 | <list><t> |
---|
755 | This directive allows for future extensions. Any unrecognized |
---|
756 | directive &MUST; be ignored. |
---|
757 | </t></list> |
---|
758 | </t> |
---|
759 | <t> |
---|
760 | If a directive or its value is improper, or required directives are |
---|
761 | missing, the proper response is 400 Bad Request. If the request-digest |
---|
762 | is invalid, then a login failure should be logged, since |
---|
763 | repeated login failures from a single client may indicate an attacker |
---|
764 | attempting to guess passwords. |
---|
765 | </t> |
---|
766 | <t> |
---|
767 | The definition of request-digest above indicates the encoding for its |
---|
768 | value. The following definitions show how the value is computed. |
---|
769 | </t> |
---|
770 | |
---|
771 | <section title="Request-Digest" anchor="request-digest"> |
---|
772 | <t> |
---|
773 | If the "qop" value is "auth" or "auth-int": |
---|
774 | </t> |
---|
775 | <figure><artwork type="abnf2616"> |
---|
776 | request-digest = <"> < KD ( H(A1), unq(nonce-value) |
---|
777 | ":" nc-value |
---|
778 | ":" unq(cnonce-value) |
---|
779 | ":" unq(qop-value) |
---|
780 | ":" H(A2) |
---|
781 | ) <"> |
---|
782 | </artwork></figure> |
---|
783 | <t> |
---|
784 | If the "qop" directive is not present (this construction is for |
---|
785 | compatibility with RFC 2069): |
---|
786 | </t> |
---|
787 | <figure><artwork type="abnf2616"> |
---|
788 | request-digest = |
---|
789 | <"> < KD ( H(A1), unq(nonce-value) ":" H(A2) ) > |
---|
790 | <"> |
---|
791 | </artwork></figure> |
---|
792 | <t> |
---|
793 | See below for the definitions for A1 and A2. |
---|
794 | </t> |
---|
795 | </section> |
---|
796 | |
---|
797 | <section title="A1" anchor="A1"> |
---|
798 | <t> |
---|
799 | If the "algorithm" directive's value is "MD5" or is unspecified, then |
---|
800 | A1 is: |
---|
801 | </t> |
---|
802 | <figure><artwork type="abnf2616"> |
---|
803 | A1 = unq(username-value) ":" unq(realm-value) ":" passwd |
---|
804 | </artwork></figure> |
---|
805 | <t> |
---|
806 | where |
---|
807 | </t> |
---|
808 | <figure><artwork type="abnf2616"> |
---|
809 | passwd = < user's password > |
---|
810 | </artwork></figure> |
---|
811 | <t> |
---|
812 | If the "algorithm" directive's value is "MD5-sess", then A1 is |
---|
813 | calculated only once - on the first request by the client following |
---|
814 | receipt of a WWW-Authenticate challenge from the server. It uses the |
---|
815 | server nonce from that challenge, and the first client nonce value to |
---|
816 | construct A1 as follows: |
---|
817 | </t> |
---|
818 | <figure><artwork type="abnf2616"> |
---|
819 | A1 = H( unq(username-value) ":" unq(realm-value) |
---|
820 | ":" passwd ) |
---|
821 | ":" unq(nonce-value) ":" unq(cnonce-value) |
---|
822 | </artwork></figure> |
---|
823 | <t> |
---|
824 | This creates a 'session key' for the authentication of subsequent |
---|
825 | requests and responses which is different for each "authentication |
---|
826 | session", thus limiting the amount of material hashed with any one |
---|
827 | key. (Note: see further discussion of the authentication session in |
---|
828 | <xref target="digest.operation"/>) Because the server need only use the hash of the user |
---|
829 | credentials in order to create the A1 value, this construction could |
---|
830 | be used in conjunction with a third party authentication service so |
---|
831 | that the web server would not need the actual password value. The |
---|
832 | specification of such a protocol is beyond the scope of this |
---|
833 | specification. |
---|
834 | </t> |
---|
835 | </section> |
---|
836 | |
---|
837 | <section title="A2"> |
---|
838 | <t> |
---|
839 | If the "qop" directive's value is "auth" or is unspecified, then A2 |
---|
840 | is: |
---|
841 | </t> |
---|
842 | <figure><artwork type="abnf2616"> |
---|
843 | A2 = Method ":" digest-uri-value |
---|
844 | </artwork></figure> |
---|
845 | <t> |
---|
846 | If the "qop" value is "auth-int", then A2 is: |
---|
847 | </t> |
---|
848 | <figure><artwork type="abnf2616"> |
---|
849 | A2 = Method ":" digest-uri-value ":" H(entity-body) |
---|
850 | </artwork></figure> |
---|
851 | </section> |
---|
852 | |
---|
853 | |
---|
854 | <section title="Directive values and quoted-string"> |
---|
855 | <t> |
---|
856 | Note that the value of many of the directives, such as "username-value", |
---|
857 | are defined as a "quoted-string". However, the "unq" notation |
---|
858 | indicates that surrounding quotation marks are removed in forming the |
---|
859 | string A1. Thus if the Authorization header includes the fields |
---|
860 | </t> |
---|
861 | <figure><artwork type="example"> |
---|
862 | username="Mufasa", realm=myhost@testrealm.com |
---|
863 | </artwork></figure> |
---|
864 | <t> |
---|
865 | and the user Mufasa has password "Circle Of Life" then H(A1) would be |
---|
866 | H(Mufasa:myhost@testrealm.com:Circle Of Life) with no quotation marks |
---|
867 | in the digested string. |
---|
868 | </t> |
---|
869 | <t> |
---|
870 | No white space is allowed in any of the strings to which the digest |
---|
871 | function H() is applied unless that white space exists in the quoted |
---|
872 | strings or entity body whose contents make up the string to be |
---|
873 | digested. For example, the string A1 illustrated above must be |
---|
874 | </t> |
---|
875 | <figure><artwork type="example"> |
---|
876 | Mufasa:myhost@testrealm.com:Circle Of Life |
---|
877 | </artwork></figure> |
---|
878 | <t> |
---|
879 | with no white space on either side of the colons, but with the white |
---|
880 | space between the words used in the password value. Likewise, the |
---|
881 | other strings digested by H() must not have white space on either |
---|
882 | side of the colons which delimit their fields unless that white space |
---|
883 | was in the quoted strings or entity body being digested. |
---|
884 | </t> |
---|
885 | <t> |
---|
886 | Also note that if integrity protection is applied (qop=auth-int), the |
---|
887 | H(entity-body) is the hash of the entity body, not the message body - |
---|
888 | it is computed before any transfer encoding is applied by the sender |
---|
889 | and after it has been removed by the recipient. Note that this |
---|
890 | includes multipart boundaries and embedded headers in each part of |
---|
891 | any multipart content-type. |
---|
892 | </t> |
---|
893 | </section> |
---|
894 | |
---|
895 | <section title="Various considerations"> |
---|
896 | <t> |
---|
897 | The "Method" value is the HTTP request method as specified in section |
---|
898 | <xref target="RFC2616" x:fmt="number" x:rel="#method"/> of <xref target="RFC2616"/>. The "request-uri" value is the Request-URI from the |
---|
899 | request line as specified in section <xref target="RFC2616" x:fmt="number" x:rel="#request-uri"/> of <xref target="RFC2616"/>. This may be "*", |
---|
900 | an "absoluteURL" or an "abs_path" as specified in section <xref target="RFC2616" x:fmt="number" x:rel="#request-uri"/> of |
---|
901 | <xref target="RFC2616"/>, but it &MUST; agree with the Request-URI. In particular, it &MUST; |
---|
902 | be an "absoluteURL" if the Request-URI is an "absoluteURL". The |
---|
903 | "cnonce-value" is an optional client-chosen value whose purpose is |
---|
904 | to foil chosen plaintext attacks. |
---|
905 | </t> |
---|
906 | <t> |
---|
907 | The authenticating server must assure that the resource designated by |
---|
908 | the "uri" directive is the same as the resource specified in the |
---|
909 | Request-Line; if they are not, the server &SHOULD; return a 400 Bad |
---|
910 | Request error. (Since this may be a symptom of an attack, server |
---|
911 | implementers may want to consider logging such errors.) The purpose |
---|
912 | of duplicating information from the request URL in this field is to |
---|
913 | deal with the possibility that an intermediate proxy may alter the |
---|
914 | client's Request-Line. This altered (but presumably semantically |
---|
915 | equivalent) request would not result in the same digest as that |
---|
916 | calculated by the client. |
---|
917 | </t> |
---|
918 | <t> |
---|
919 | Implementers should be aware of how authenticated transactions |
---|
920 | interact with shared caches. The HTTP/1.1 protocol specifies that |
---|
921 | when a shared cache (see section <xref target="RFC2616" x:fmt="number" x:rel="#shared.and.non-shared.caches"/> of <xref target="RFC2616"/>) has received a request |
---|
922 | containing an Authorization header and a response from relaying that |
---|
923 | request, it &MUST-NOT; return that response as a reply to any other |
---|
924 | request, unless one of two Cache-Control (see section <xref target="RFC2616" x:fmt="number" x:rel="#header.cache-control"/> of <xref target="RFC2616"/>) |
---|
925 | directives was present in the response. If the original response |
---|
926 | included the "must-revalidate" Cache-Control directive, the cache &MAY; |
---|
927 | use the entity of that response in replying to a subsequent request, |
---|
928 | but &MUST; first revalidate it with the origin server, using the |
---|
929 | request headers from the new request to allow the origin server to |
---|
930 | authenticate the new request. Alternatively, if the original response |
---|
931 | included the "public" Cache-Control directive, the response entity |
---|
932 | &MAY; be returned in reply to any subsequent request. |
---|
933 | </t> |
---|
934 | </section> |
---|
935 | </section> |
---|
936 | |
---|
937 | <section title="The Authentication-Info Header"> |
---|
938 | <iref item="Headers" subitem="Authentication-Info" primary="true"/> |
---|
939 | <iref item="Authentication-Info header" primary="true"/> |
---|
940 | <t> |
---|
941 | The Authentication-Info header is used by the server to communicate |
---|
942 | some information regarding the successful authentication in the |
---|
943 | response. |
---|
944 | </t> |
---|
945 | <figure><artwork type="abnf2616"><iref item="Authentication-Info" primary="true" |
---|
946 | /> AuthenticationInfo = "Authentication-Info" ":" auth-info |
---|
947 | <iref item="auth-info" primary="true" |
---|
948 | /> auth-info = 1#(nextnonce | [ message-qop ] |
---|
949 | | [ response-auth ] | [ cnonce ] |
---|
950 | | [nonce-count] ) |
---|
951 | <iref item="nextnonce" primary="true" |
---|
952 | /> nextnonce = "nextnonce" "=" nonce-value |
---|
953 | <iref item="response-auth" primary="true" |
---|
954 | /> response-auth = "rspauth" "=" response-digest |
---|
955 | <iref item="response-digest" primary="true" |
---|
956 | /> response-digest = <"> *LHEX <"> |
---|
957 | </artwork></figure> |
---|
958 | <t> |
---|
959 | The value of the nextnonce directive is the nonce the server wishes |
---|
960 | the client to use for a future authentication response. The server |
---|
961 | may send the Authentication-Info header with a nextnonce field as a |
---|
962 | means of implementing one-time or otherwise changing nonces. If the |
---|
963 | nextnonce field is present the client &SHOULD; use it when constructing |
---|
964 | the Authorization header for its next request. Failure of the client |
---|
965 | to do so may result in a request to re-authenticate from the server |
---|
966 | with the "stale=TRUE". |
---|
967 | </t> |
---|
968 | <t> |
---|
969 | <list><t> |
---|
970 | Server implementations should carefully consider the performance |
---|
971 | implications of the use of this mechanism; pipelined requests will |
---|
972 | not be possible if every response includes a nextnonce directive |
---|
973 | that must be used on the next request received by the server. |
---|
974 | Consideration should be given to the performance vs. security |
---|
975 | tradeoffs of allowing an old nonce value to be used for a limited |
---|
976 | time to permit request pipelining. Use of the nonce-count can |
---|
977 | retain most of the security advantages of a new server nonce |
---|
978 | without the deleterious affects on pipelining. |
---|
979 | </t></list> |
---|
980 | </t> |
---|
981 | <t> |
---|
982 | message-qop |
---|
983 | </t> |
---|
984 | <t><list><t> |
---|
985 | Indicates the "quality of protection" options applied to the |
---|
986 | response by the server. The value "auth" indicates authentication; |
---|
987 | the value "auth-int" indicates authentication with integrity |
---|
988 | protection. The server &SHOULD; use the same value for the message-qop |
---|
989 | directive in the response as was sent by the client in the |
---|
990 | corresponding request. |
---|
991 | </t></list></t> |
---|
992 | <t> |
---|
993 | The optional response digest in the "response-auth" directive |
---|
994 | supports mutual authentication -- the server proves that it knows the |
---|
995 | user's secret, and with qop=auth-int also provides limited integrity |
---|
996 | protection of the response. The "response-digest" value is calculated |
---|
997 | as for the "request-digest" in the Authorization header, except that |
---|
998 | if "qop=auth" or is not specified in the Authorization header for the |
---|
999 | request, A2 is |
---|
1000 | </t> |
---|
1001 | <figure><artwork type="abnf2616"> |
---|
1002 | A2 = ":" digest-uri-value |
---|
1003 | </artwork></figure> |
---|
1004 | <t> |
---|
1005 | and if "qop=auth-int", then A2 is |
---|
1006 | </t> |
---|
1007 | <figure><artwork type="abnf2616"> |
---|
1008 | A2 = ":" digest-uri-value ":" H(entity-body) |
---|
1009 | </artwork></figure> |
---|
1010 | <t> |
---|
1011 | where "digest-uri-value" is the value of the "uri" directive on the |
---|
1012 | Authorization header in the request. The "cnonce-value" and "nc-value" |
---|
1013 | &MUST; be the ones for the client request to which this message |
---|
1014 | is the response. The "response-auth", "cnonce", and "nonce-count" |
---|
1015 | directives &MUST; BE present if "qop=auth" or "qop=auth-int" is |
---|
1016 | specified. |
---|
1017 | </t> |
---|
1018 | <t> |
---|
1019 | The Authentication-Info header is allowed in the trailer of an HTTP |
---|
1020 | message transferred via chunked transfer-coding. |
---|
1021 | </t> |
---|
1022 | </section> |
---|
1023 | </section> |
---|
1024 | |
---|
1025 | <section title="Digest Operation" anchor="digest.operation"> |
---|
1026 | <t> |
---|
1027 | Upon receiving the Authorization header, the server may check its |
---|
1028 | validity by looking up the password that corresponds to the submitted |
---|
1029 | username. Then, the server must perform the same digest operation |
---|
1030 | (e.g., MD5) performed by the client, and compare the result to the |
---|
1031 | given request-digest value. |
---|
1032 | </t> |
---|
1033 | <t> |
---|
1034 | Note that the HTTP server does not actually need to know the user's |
---|
1035 | cleartext password. As long as H(A1) is available to the server, the |
---|
1036 | validity of an Authorization header may be verified. |
---|
1037 | </t> |
---|
1038 | <t> |
---|
1039 | The client response to a WWW-Authenticate challenge for a protection |
---|
1040 | space starts an authentication session with that protection space. |
---|
1041 | The authentication session lasts until the client receives another |
---|
1042 | WWW-Authenticate challenge from any server in the protection space. A |
---|
1043 | client should remember the username, password, nonce, nonce count and |
---|
1044 | opaque values associated with an authentication session to use to |
---|
1045 | construct the Authorization header in future requests within that |
---|
1046 | protection space. The Authorization header may be included |
---|
1047 | preemptively; doing so improves server efficiency and avoids extra |
---|
1048 | round trips for authentication challenges. The server may choose to |
---|
1049 | accept the old Authorization header information, even though the |
---|
1050 | nonce value included might not be fresh. Alternatively, the server |
---|
1051 | may return a 401 response with a new nonce value, causing the client |
---|
1052 | to retry the request; by specifying stale=TRUE with this response, |
---|
1053 | the server tells the client to retry with the new nonce, but without |
---|
1054 | prompting for a new username and password. |
---|
1055 | </t> |
---|
1056 | <t> |
---|
1057 | Because the client is required to return the value of the opaque |
---|
1058 | directive given to it by the server for the duration of a session, |
---|
1059 | the opaque data may be used to transport authentication session state |
---|
1060 | information. (Note that any such use can also be accomplished more |
---|
1061 | easily and safely by including the state in the nonce.) For example, |
---|
1062 | a server could be responsible for authenticating content that |
---|
1063 | actually sits on another server. It would achieve this by having the |
---|
1064 | first 401 response include a domain directive whose value includes a |
---|
1065 | URI on the second server, and an opaque directive whose value |
---|
1066 | contains the state information. The client will retry the request, at |
---|
1067 | which time the server might respond with a 301/302 redirection, |
---|
1068 | pointing to the URI on the second server. The client will follow the |
---|
1069 | redirection, and pass an Authorization header , including the |
---|
1070 | <opaque> data. |
---|
1071 | </t> |
---|
1072 | <t> |
---|
1073 | As with the basic scheme, proxies must be completely transparent in |
---|
1074 | the Digest access authentication scheme. That is, they must forward |
---|
1075 | the WWW-Authenticate, Authentication-Info and Authorization headers |
---|
1076 | untouched. If a proxy wants to authenticate a client before a request |
---|
1077 | is forwarded to the server, it can be done using the Proxy-Authenticate |
---|
1078 | and Proxy-Authorization headers described in <xref target="proxy-authentication.and.proxy-authorization"/> |
---|
1079 | below. |
---|
1080 | </t> |
---|
1081 | </section> |
---|
1082 | |
---|
1083 | <section title="Security Protocol Negotiation"> |
---|
1084 | <t> |
---|
1085 | It is useful for a server to be able to know which security schemes a |
---|
1086 | client is capable of handling. |
---|
1087 | </t> |
---|
1088 | <t> |
---|
1089 | It is possible that a server may want to require Digest as its |
---|
1090 | authentication method, even if the server does not know that the |
---|
1091 | client supports it. A client is encouraged to fail gracefully if the |
---|
1092 | server specifies only authentication schemes it cannot handle. |
---|
1093 | </t> |
---|
1094 | </section> |
---|
1095 | |
---|
1096 | <section title="Example" anchor="specification.of.digest.headers.example"> |
---|
1097 | <t> |
---|
1098 | The following example assumes that an access-protected document is |
---|
1099 | being requested from the server via a GET request. The URI of the |
---|
1100 | document is "http://www.nowhere.org/dir/index.html". Both client and |
---|
1101 | server know that the username for this document is "Mufasa", and the |
---|
1102 | password is "Circle Of Life" (with one space between each of the |
---|
1103 | three words). |
---|
1104 | </t> |
---|
1105 | <t> |
---|
1106 | The first time the client requests the document, no Authorization |
---|
1107 | header is sent, so the server responds with: |
---|
1108 | </t> |
---|
1109 | <figure><artwork type='message/http; msgytpe="response"'> |
---|
1110 | HTTP/1.1 401 Unauthorized |
---|
1111 | WWW-Authenticate: Digest |
---|
1112 | realm="testrealm@host.com", |
---|
1113 | qop="auth,auth-int", |
---|
1114 | nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", |
---|
1115 | opaque="5ccc069c403ebaf9f0171e9517f40e41" |
---|
1116 | </artwork></figure> |
---|
1117 | <t> |
---|
1118 | The client may prompt the user for the username and password, after |
---|
1119 | which it will respond with a new request, including the following |
---|
1120 | Authorization header: |
---|
1121 | </t> |
---|
1122 | <figure><artwork type="example"> |
---|
1123 | Authorization: Digest username="Mufasa", |
---|
1124 | realm="testrealm@host.com", |
---|
1125 | nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", |
---|
1126 | uri="/dir/index.html", |
---|
1127 | qop=auth, |
---|
1128 | nc=00000001, |
---|
1129 | cnonce="0a4f113b", |
---|
1130 | response="6629fae49393a05397450978507c4ef1", |
---|
1131 | opaque="5ccc069c403ebaf9f0171e9517f40e41" |
---|
1132 | </artwork></figure> |
---|
1133 | </section> |
---|
1134 | |
---|
1135 | <section title="Proxy-Authentication and Proxy-Authorization" anchor="proxy-authentication.and.proxy-authorization"> |
---|
1136 | <t> |
---|
1137 | The digest authentication scheme may also be used for authenticating |
---|
1138 | users to proxies, proxies to proxies, or proxies to origin servers by |
---|
1139 | use of the Proxy-Authenticate and Proxy-Authorization headers. These |
---|
1140 | headers are instances of the Proxy-Authenticate and Proxy-Authorization |
---|
1141 | headers specified in sections <xref target="RFC2616" x:fmt="number" x:sec="10.33"/> and <xref target="RFC2616" x:fmt="number" x:sec="10.34"/> of the |
---|
1142 | HTTP/1.1 specification <xref target="RFC2616"/> and their behavior is subject to |
---|
1143 | restrictions described there. The transactions for proxy |
---|
1144 | authentication are very similar to those already described. Upon |
---|
1145 | receiving a request which requires authentication, the proxy/server |
---|
1146 | must issue the "407 Proxy Authentication Required" response with a |
---|
1147 | "Proxy-Authenticate" header. The digest-challenge used in the |
---|
1148 | Proxy-Authenticate header is the same as that for the WWW-Authenticate |
---|
1149 | header as defined above in <xref target="the.www-authenticate.response.header"/>. |
---|
1150 | </t> |
---|
1151 | <t> |
---|
1152 | The client/proxy must then re-issue the request with a Proxy-Authorization |
---|
1153 | header, with directives as specified for the |
---|
1154 | Authorization header in <xref target="the.authorization.request.header"/> above. |
---|
1155 | </t> |
---|
1156 | <t> |
---|
1157 | On subsequent responses, the server sends Proxy-Authentication-Info |
---|
1158 | with directives the same as those for the Authentication-Info header |
---|
1159 | field. |
---|
1160 | </t> |
---|
1161 | <t> |
---|
1162 | Note that in principle a client could be asked to authenticate itself |
---|
1163 | to both a proxy and an end-server, but never in the same response. |
---|
1164 | </t> |
---|
1165 | </section> |
---|
1166 | </section> |
---|
1167 | |
---|
1168 | <section title="Security Considerations" anchor="security.considerations"> |
---|
1169 | |
---|
1170 | <section title="Authentication of Clients using Basic Authentication"> |
---|
1171 | <t> |
---|
1172 | The Basic authentication scheme is not a secure method of user |
---|
1173 | authentication, nor does it in any way protect the entity, which is |
---|
1174 | transmitted in cleartext across the physical network used as the |
---|
1175 | carrier. HTTP does not prevent additional authentication schemes and |
---|
1176 | encryption mechanisms from being employed to increase security or the |
---|
1177 | addition of enhancements (such as schemes to use one-time passwords) |
---|
1178 | to Basic authentication. |
---|
1179 | </t> |
---|
1180 | <t> |
---|
1181 | The most serious flaw in Basic authentication is that it results in |
---|
1182 | the essentially cleartext transmission of the user's password over |
---|
1183 | the physical network. It is this problem which Digest Authentication |
---|
1184 | attempts to address. |
---|
1185 | </t> |
---|
1186 | <t> |
---|
1187 | Because Basic authentication involves the cleartext transmission of |
---|
1188 | passwords it &SHOULD-NOT; be used (without enhancements) to protect |
---|
1189 | sensitive or valuable information. |
---|
1190 | </t> |
---|
1191 | <t> |
---|
1192 | A common use of Basic authentication is for identification purposes |
---|
1193 | -- requiring the user to provide a user name and password as a means |
---|
1194 | of identification, for example, for purposes of gathering accurate |
---|
1195 | usage statistics on a server. When used in this way it is tempting to |
---|
1196 | think that there is no danger in its use if illicit access to the |
---|
1197 | protected documents is not a major concern. This is only correct if |
---|
1198 | the server issues both user name and password to the users and in |
---|
1199 | particular does not allow the user to choose his or her own password. |
---|
1200 | The danger arises because naive users frequently reuse a single |
---|
1201 | password to avoid the task of maintaining multiple passwords. |
---|
1202 | </t> |
---|
1203 | <t> |
---|
1204 | If a server permits users to select their own passwords, then the |
---|
1205 | threat is not only unauthorized access to documents on the server but |
---|
1206 | also unauthorized access to any other resources on other systems that |
---|
1207 | the user protects with the same password. Furthermore, in the |
---|
1208 | server's password database, many of the passwords may also be users' |
---|
1209 | passwords for other sites. The owner or administrator of such a |
---|
1210 | system could therefore expose all users of the system to the risk of |
---|
1211 | unauthorized access to all those sites if this information is not |
---|
1212 | maintained in a secure fashion. |
---|
1213 | </t> |
---|
1214 | <t> |
---|
1215 | Basic Authentication is also vulnerable to spoofing by counterfeit |
---|
1216 | servers. If a user can be led to believe that he is connecting to a |
---|
1217 | host containing information protected by Basic authentication when, |
---|
1218 | in fact, he is connecting to a hostile server or gateway, then the |
---|
1219 | attacker can request a password, store it for later use, and feign an |
---|
1220 | error. This type of attack is not possible with Digest |
---|
1221 | Authentication. Server implementers &SHOULD; guard against the |
---|
1222 | possibility of this sort of counterfeiting by gateways or CGI |
---|
1223 | scripts. In particular it is very dangerous for a server to simply |
---|
1224 | turn over a connection to a gateway. That gateway can then use the |
---|
1225 | persistent connection mechanism to engage in multiple transactions |
---|
1226 | with the client while impersonating the original server in a way that |
---|
1227 | is not detectable by the client. |
---|
1228 | </t> |
---|
1229 | </section> |
---|
1230 | |
---|
1231 | <section title="Authentication of Clients using Digest Authentication"> |
---|
1232 | <t> |
---|
1233 | Digest Authentication does not provide a strong authentication |
---|
1234 | mechanism, when compared to public key based mechanisms, for example. |
---|
1235 | However, it is significantly stronger than (e.g.) CRAM-MD5, which has |
---|
1236 | been proposed for use with LDAP <xref target="ref10"/>, POP and IMAP (see RFC 2195 |
---|
1237 | <xref target="RFC2195"/>). It is intended to replace the much weaker and even more |
---|
1238 | dangerous Basic mechanism. |
---|
1239 | </t> |
---|
1240 | <t> |
---|
1241 | Digest Authentication offers no confidentiality protection beyond |
---|
1242 | protecting the actual password. All of the rest of the request and |
---|
1243 | response are available to an eavesdropper. |
---|
1244 | </t> |
---|
1245 | <t> |
---|
1246 | Digest Authentication offers only limited integrity protection for |
---|
1247 | the messages in either direction. If qop=auth-int mechanism is used, |
---|
1248 | those parts of the message used in the calculation of the WWW-Authenticate |
---|
1249 | and Authorization header field response directive values |
---|
1250 | (see <xref target="specification.of.digest.headers"/> above) are protected. Most header fields and their |
---|
1251 | values could be modified as a part of a man-in-the-middle attack. |
---|
1252 | </t> |
---|
1253 | <t> |
---|
1254 | Many needs for secure HTTP transactions cannot be met by Digest |
---|
1255 | Authentication. For those needs TLS or SHTTP are more appropriate |
---|
1256 | protocols. In particular Digest authentication cannot be used for any |
---|
1257 | transaction requiring confidentiality protection. Nevertheless many |
---|
1258 | functions remain for which Digest authentication is both useful and |
---|
1259 | appropriate. Any service in present use that uses Basic should be |
---|
1260 | switched to Digest as soon as practical. |
---|
1261 | </t> |
---|
1262 | </section> |
---|
1263 | |
---|
1264 | <section title="Limited Use Nonce Values"> |
---|
1265 | <t> |
---|
1266 | The Digest scheme uses a server-specified nonce to seed the |
---|
1267 | generation of the request-digest value (as specified in <xref target="request-digest"/> |
---|
1268 | above). As shown in the example nonce in <xref target="the.www-authenticate.response.header"/>, the |
---|
1269 | server is free to construct the nonce such that it may only be used |
---|
1270 | from a particular client, for a particular resource, for a limited |
---|
1271 | period of time or number of uses, or any other restrictions. Doing |
---|
1272 | so strengthens the protection provided against, for example, replay |
---|
1273 | attacks (see <xref target="replay.attacks" format="counter"/>). However, it should be noted that the method |
---|
1274 | chosen for generating and checking the nonce also has performance and |
---|
1275 | resource implications. For example, a server may choose to allow |
---|
1276 | each nonce value to be used only once by maintaining a record of |
---|
1277 | whether or not each recently issued nonce has been returned and |
---|
1278 | sending a next-nonce directive in the Authentication-Info header |
---|
1279 | field of every response. This protects against even an immediate |
---|
1280 | replay attack, but has a high cost checking nonce values, and perhaps |
---|
1281 | more important will cause authentication failures for any pipelined |
---|
1282 | requests (presumably returning a stale nonce indication). Similarly, |
---|
1283 | incorporating a request-specific element such as the Etag value for a |
---|
1284 | resource limits the use of the nonce to that version of the resource |
---|
1285 | and also defeats pipelining. Thus it may be useful to do so for |
---|
1286 | methods with side effects but have unacceptable performance for those |
---|
1287 | that do not. |
---|
1288 | </t> |
---|
1289 | </section> |
---|
1290 | |
---|
1291 | <section title="Comparison of Digest with Basic Authentication"> |
---|
1292 | <t> |
---|
1293 | Both Digest and Basic Authentication are very much on the weak end of |
---|
1294 | the security strength spectrum. But a comparison between the two |
---|
1295 | points out the utility, even necessity, of replacing Basic by Digest. |
---|
1296 | </t> |
---|
1297 | <t> |
---|
1298 | The greatest threat to the type of transactions for which these |
---|
1299 | protocols are used is network snooping. This kind of transaction |
---|
1300 | might involve, for example, online access to a database whose use is |
---|
1301 | restricted to paying subscribers. With Basic authentication an |
---|
1302 | eavesdropper can obtain the password of the user. This not only |
---|
1303 | permits him to access anything in the database, but, often worse, |
---|
1304 | will permit access to anything else the user protects with the same |
---|
1305 | password. |
---|
1306 | </t> |
---|
1307 | <t> |
---|
1308 | By contrast, with Digest Authentication the eavesdropper only gets |
---|
1309 | access to the transaction in question and not to the user's password. |
---|
1310 | The information gained by the eavesdropper would permit a replay |
---|
1311 | attack, but only with a request for the same document, and even that |
---|
1312 | may be limited by the server's choice of nonce. |
---|
1313 | </t> |
---|
1314 | </section> |
---|
1315 | |
---|
1316 | <section title="Replay Attacks" anchor="replay.attacks"> |
---|
1317 | <t> |
---|
1318 | A replay attack against Digest authentication would usually be |
---|
1319 | pointless for a simple GET request since an eavesdropper would |
---|
1320 | already have seen the only document he could obtain with a replay. |
---|
1321 | This is because the URI of the requested document is digested in the |
---|
1322 | client request and the server will only deliver that document. By |
---|
1323 | contrast under Basic Authentication once the eavesdropper has the |
---|
1324 | user's password, any document protected by that password is open to |
---|
1325 | him. |
---|
1326 | </t> |
---|
1327 | <t> |
---|
1328 | Thus, for some purposes, it is necessary to protect against replay |
---|
1329 | attacks. A good Digest implementation can do this in various ways. |
---|
1330 | The server created "nonce" value is implementation dependent, but if |
---|
1331 | it contains a digest of the client IP, a time-stamp, the resource |
---|
1332 | ETag, and a private server key (as recommended above) then a replay |
---|
1333 | attack is not simple. An attacker must convince the server that the |
---|
1334 | request is coming from a false IP address and must cause the server |
---|
1335 | to deliver the document to an IP address different from the address |
---|
1336 | to which it believes it is sending the document. An attack can only |
---|
1337 | succeed in the period before the time-stamp expires. Digesting the |
---|
1338 | client IP and time-stamp in the nonce permits an implementation which |
---|
1339 | does not maintain state between transactions. |
---|
1340 | </t> |
---|
1341 | <t> |
---|
1342 | For applications where no possibility of replay attack can be |
---|
1343 | tolerated the server can use one-time nonce values which will not be |
---|
1344 | honored for a second use. This requires the overhead of the server |
---|
1345 | remembering which nonce values have been used until the nonce time-stamp |
---|
1346 | (and hence the digest built with it) has expired, but it |
---|
1347 | effectively protects against replay attacks. |
---|
1348 | </t> |
---|
1349 | <t> |
---|
1350 | An implementation must give special attention to the possibility of |
---|
1351 | replay attacks with POST and PUT requests. Unless the server employs |
---|
1352 | one-time or otherwise limited-use nonces and/or insists on the use of |
---|
1353 | the integrity protection of qop=auth-int, an attacker could replay |
---|
1354 | valid credentials from a successful request with counterfeit form |
---|
1355 | data or other message body. Even with the use of integrity protection |
---|
1356 | most metadata in header fields is not protected. Proper nonce |
---|
1357 | generation and checking provides some protection against replay of |
---|
1358 | previously used valid credentials, but see 4.8. |
---|
1359 | </t> |
---|
1360 | </section> |
---|
1361 | |
---|
1362 | <section title="Weakness Created by Multiple Authentication Schemes"> |
---|
1363 | <t> |
---|
1364 | An HTTP/1.1 server may return multiple challenges with a 401 |
---|
1365 | (Authenticate) response, and each challenge may use a different |
---|
1366 | auth-scheme. A user agent &MUST; choose to use the strongest auth-scheme |
---|
1367 | it understands and request credentials from the user based |
---|
1368 | upon that challenge. |
---|
1369 | </t> |
---|
1370 | <t> |
---|
1371 | <list><t> |
---|
1372 | Note that many browsers will only recognize Basic and will require |
---|
1373 | that it be the first auth-scheme presented. Servers should only |
---|
1374 | include Basic if it is minimally acceptable. |
---|
1375 | </t></list> |
---|
1376 | </t> |
---|
1377 | <t> |
---|
1378 | When the server offers choices of authentication schemes using the |
---|
1379 | WWW-Authenticate header, the strength of the resulting authentication |
---|
1380 | is only as good as that of the of the weakest of the authentication |
---|
1381 | schemes. See <xref target="man.in.the.middle"/> below for discussion of particular attack |
---|
1382 | scenarios that exploit multiple authentication schemes. |
---|
1383 | </t> |
---|
1384 | </section> |
---|
1385 | |
---|
1386 | <section title="Online dictionary attacks"> |
---|
1387 | <t> |
---|
1388 | If the attacker can eavesdrop, then it can test any overheard |
---|
1389 | nonce/response pairs against a list of common words. Such a list is |
---|
1390 | usually much smaller than the total number of possible passwords. The |
---|
1391 | cost of computing the response for each password on the list is paid |
---|
1392 | once for each challenge. |
---|
1393 | </t> |
---|
1394 | <t> |
---|
1395 | The server can mitigate this attack by not allowing users to select |
---|
1396 | passwords that are in a dictionary. |
---|
1397 | </t> |
---|
1398 | </section> |
---|
1399 | |
---|
1400 | <section title="Man in the Middle" anchor="man.in.the.middle"> |
---|
1401 | <t> |
---|
1402 | Both Basic and Digest authentication are vulnerable to "man in the |
---|
1403 | middle" (MITM) attacks, for example, from a hostile or compromised |
---|
1404 | proxy. Clearly, this would present all the problems of eavesdropping. |
---|
1405 | But it also offers some additional opportunities to the attacker. |
---|
1406 | </t> |
---|
1407 | <t> |
---|
1408 | A possible man-in-the-middle attack would be to add a weak |
---|
1409 | authentication scheme to the set of choices, hoping that the client |
---|
1410 | will use one that exposes the user's credentials (e.g. password). For |
---|
1411 | this reason, the client should always use the strongest scheme that |
---|
1412 | it understands from the choices offered. |
---|
1413 | </t> |
---|
1414 | <t> |
---|
1415 | An even better MITM attack would be to remove all offered choices, |
---|
1416 | replacing them with a challenge that requests only Basic |
---|
1417 | authentication, then uses the cleartext credentials from the Basic |
---|
1418 | authentication to authenticate to the origin server using the |
---|
1419 | stronger scheme it requested. A particularly insidious way to mount |
---|
1420 | such a MITM attack would be to offer a "free" proxy caching service |
---|
1421 | to gullible users. |
---|
1422 | </t> |
---|
1423 | <t> |
---|
1424 | User agents should consider measures such as presenting a visual |
---|
1425 | indication at the time of the credentials request of what |
---|
1426 | authentication scheme is to be used, or remembering the strongest |
---|
1427 | authentication scheme ever requested by a server and produce a |
---|
1428 | warning message before using a weaker one. It might also be a good |
---|
1429 | idea for the user agent to be configured to demand Digest |
---|
1430 | authentication in general, or from specific sites. |
---|
1431 | </t> |
---|
1432 | <t> |
---|
1433 | Or, a hostile proxy might spoof the client into making a request the |
---|
1434 | attacker wanted rather than one the client wanted. Of course, this is |
---|
1435 | still much harder than a comparable attack against Basic |
---|
1436 | Authentication. |
---|
1437 | </t> |
---|
1438 | </section> |
---|
1439 | |
---|
1440 | <section title="Chosen plaintext attacks"> |
---|
1441 | <t> |
---|
1442 | With Digest authentication, a MITM or a malicious server can |
---|
1443 | arbitrarily choose the nonce that the client will use to compute the |
---|
1444 | response. This is called a "chosen plaintext" attack. The ability to |
---|
1445 | choose the nonce is known to make cryptanalysis much easier <xref target="ref8"/>. |
---|
1446 | </t> |
---|
1447 | <t> |
---|
1448 | However, no way to analyze the MD5 one-way function used by Digest |
---|
1449 | using chosen plaintext is currently known. |
---|
1450 | </t> |
---|
1451 | <t> |
---|
1452 | The countermeasure against this attack is for clients to be |
---|
1453 | configured to require the use of the optional "cnonce" directive; |
---|
1454 | this allows the client to vary the input to the hash in a way not |
---|
1455 | chosen by the attacker. |
---|
1456 | </t> |
---|
1457 | </section> |
---|
1458 | |
---|
1459 | <section title="Precomputed dictionary attacks"> |
---|
1460 | <t> |
---|
1461 | With Digest authentication, if the attacker can execute a chosen |
---|
1462 | plaintext attack, the attacker can precompute the response for many |
---|
1463 | common words to a nonce of its choice, and store a dictionary of |
---|
1464 | (response, password) pairs. Such precomputation can often be done in |
---|
1465 | parallel on many machines. It can then use the chosen plaintext |
---|
1466 | attack to acquire a response corresponding to that challenge, and |
---|
1467 | just look up the password in the dictionary. Even if most passwords |
---|
1468 | are not in the dictionary, some might be. Since the attacker gets to |
---|
1469 | pick the challenge, the cost of computing the response for each |
---|
1470 | password on the list can be amortized over finding many passwords. A |
---|
1471 | dictionary with 100 million password/response pairs would take about |
---|
1472 | 3.2 gigabytes of disk storage. |
---|
1473 | </t> |
---|
1474 | <t> |
---|
1475 | The countermeasure against this attack is to for clients to be |
---|
1476 | configured to require the use of the optional "cnonce" directive. |
---|
1477 | </t> |
---|
1478 | </section> |
---|
1479 | |
---|
1480 | <section title="Batch brute force attacks"> |
---|
1481 | <t> |
---|
1482 | With Digest authentication, a MITM can execute a chosen plaintext |
---|
1483 | attack, and can gather responses from many users to the same nonce. |
---|
1484 | It can then find all the passwords within any subset of password |
---|
1485 | space that would generate one of the nonce/response pairs in a single |
---|
1486 | pass over that space. It also reduces the time to find the first |
---|
1487 | password by a factor equal to the number of nonce/response pairs |
---|
1488 | gathered. This search of the password space can often be done in |
---|
1489 | parallel on many machines, and even a single machine can search large |
---|
1490 | subsets of the password space very quickly -- reports exist of |
---|
1491 | searching all passwords with six or fewer letters in a few hours. |
---|
1492 | </t> |
---|
1493 | <t> |
---|
1494 | The countermeasure against this attack is to for clients to be |
---|
1495 | configured to require the use of the optional "cnonce" directive. |
---|
1496 | </t> |
---|
1497 | </section> |
---|
1498 | |
---|
1499 | <section title="Spoofing by Counterfeit Servers"> |
---|
1500 | <t> |
---|
1501 | Basic Authentication is vulnerable to spoofing by counterfeit |
---|
1502 | servers. If a user can be led to believe that she is connecting to a |
---|
1503 | host containing information protected by a password she knows, when |
---|
1504 | in fact she is connecting to a hostile server, then the hostile |
---|
1505 | server can request a password, store it away for later use, and feign |
---|
1506 | an error. This type of attack is more difficult with Digest |
---|
1507 | Authentication -- but the client must know to demand that Digest |
---|
1508 | authentication be used, perhaps using some of the techniques |
---|
1509 | described above to counter "man-in-the-middle" attacks. Again, the |
---|
1510 | user can be helped in detecting this attack by a visual indication of |
---|
1511 | the authentication mechanism in use with appropriate guidance in |
---|
1512 | interpreting the implications of each scheme. |
---|
1513 | </t> |
---|
1514 | </section> |
---|
1515 | |
---|
1516 | <section title="Storing passwords"> |
---|
1517 | <t> |
---|
1518 | Digest authentication requires that the authenticating agent (usually |
---|
1519 | the server) store some data derived from the user's name and password |
---|
1520 | in a "password file" associated with a given realm. Normally this |
---|
1521 | might contain pairs consisting of username and H(A1), where H(A1) is |
---|
1522 | the digested value of the username, realm, and password as described |
---|
1523 | above. |
---|
1524 | </t> |
---|
1525 | <t> |
---|
1526 | The security implications of this are that if this password file is |
---|
1527 | compromised, then an attacker gains immediate access to documents on |
---|
1528 | the server using this realm. Unlike, say a standard UNIX password |
---|
1529 | file, this information need not be decrypted in order to access |
---|
1530 | documents in the server realm associated with this file. On the other |
---|
1531 | hand, decryption, or more likely a brute force attack, would be |
---|
1532 | necessary to obtain the user's password. This is the reason that the |
---|
1533 | realm is part of the digested data stored in the password file. It |
---|
1534 | means that if one Digest authentication password file is compromised, |
---|
1535 | it does not automatically compromise others with the same username |
---|
1536 | and password (though it does expose them to brute force attack). |
---|
1537 | </t> |
---|
1538 | <t> |
---|
1539 | There are two important security consequences of this. First the |
---|
1540 | password file must be protected as if it contained unencrypted |
---|
1541 | passwords, because for the purpose of accessing documents in its |
---|
1542 | realm, it effectively does. |
---|
1543 | </t> |
---|
1544 | <t> |
---|
1545 | A second consequence of this is that the realm string should be |
---|
1546 | unique among all realms which any single user is likely to use. In |
---|
1547 | particular a realm string should include the name of the host doing |
---|
1548 | the authentication. The inability of the client to authenticate the |
---|
1549 | server is a weakness of Digest Authentication. |
---|
1550 | </t> |
---|
1551 | </section> |
---|
1552 | |
---|
1553 | <section title="Summary"> |
---|
1554 | <t> |
---|
1555 | By modern cryptographic standards Digest Authentication is weak. But |
---|
1556 | for a large range of purposes it is valuable as a replacement for |
---|
1557 | Basic Authentication. It remedies some, but not all, weaknesses of |
---|
1558 | Basic Authentication. Its strength may vary depending on the |
---|
1559 | implementation. In particular the structure of the nonce (which is |
---|
1560 | dependent on the server implementation) may affect the ease of |
---|
1561 | mounting a replay attack. A range of server options is appropriate |
---|
1562 | since, for example, some implementations may be willing to accept the |
---|
1563 | server overhead of one-time nonces or digests to eliminate the |
---|
1564 | possibility of replay. Others may satisfied with a nonce like the one |
---|
1565 | recommended above restricted to a single IP address and a single ETag |
---|
1566 | or with a limited lifetime. |
---|
1567 | </t> |
---|
1568 | <t> |
---|
1569 | The bottom line is that *any* compliant implementation will be |
---|
1570 | relatively weak by cryptographic standards, but *any* compliant |
---|
1571 | implementation will be far superior to Basic Authentication. |
---|
1572 | </t> |
---|
1573 | </section> |
---|
1574 | </section> |
---|
1575 | |
---|
1576 | <section title="Sample implementation"> |
---|
1577 | <t> |
---|
1578 | The following code implements the calculations of H(A1), H(A2), |
---|
1579 | request-digest and response-digest, and a test program which computes |
---|
1580 | the values used in the example of <xref target="specification.of.digest.headers.example"/>. It uses the MD5 |
---|
1581 | implementation from RFC 1321. |
---|
1582 | </t> |
---|
1583 | <figure><preamble> |
---|
1584 | File "digcalc.h": |
---|
1585 | </preamble><artwork type="code" name="digcalc.h"> |
---|
1586 | #define HASHLEN 16 |
---|
1587 | typedef char HASH[HASHLEN]; |
---|
1588 | #define HASHHEXLEN 32 |
---|
1589 | typedef char HASHHEX[HASHHEXLEN+1]; |
---|
1590 | #define IN |
---|
1591 | #define OUT |
---|
1592 | |
---|
1593 | /* calculate H(A1) as per HTTP Digest spec */ |
---|
1594 | void DigestCalcHA1( |
---|
1595 | IN char * pszAlg, |
---|
1596 | IN char * pszUserName, |
---|
1597 | IN char * pszRealm, |
---|
1598 | IN char * pszPassword, |
---|
1599 | IN char * pszNonce, |
---|
1600 | IN char * pszCNonce, |
---|
1601 | OUT HASHHEX SessionKey |
---|
1602 | ); |
---|
1603 | |
---|
1604 | /* calculate request-digest/response-digest as per HTTP Digest spec */ |
---|
1605 | void DigestCalcResponse( |
---|
1606 | IN HASHHEX HA1, /* H(A1) */ |
---|
1607 | IN char * pszNonce, /* nonce from server */ |
---|
1608 | IN char * pszNonceCount, /* 8 hex digits */ |
---|
1609 | IN char * pszCNonce, /* client nonce */ |
---|
1610 | IN char * pszQop, /* qop-value: "", "auth", "auth-int" */ |
---|
1611 | IN char * pszMethod, /* method from the request */ |
---|
1612 | IN char * pszDigestUri, /* requested URL */ |
---|
1613 | IN HASHHEX HEntity, /* H(entity body) if qop="auth-int" */ |
---|
1614 | OUT HASHHEX Response /* request-digest or response-digest */ |
---|
1615 | ); |
---|
1616 | </artwork></figure> |
---|
1617 | <figure><preamble> |
---|
1618 | File "digcalc.c": |
---|
1619 | </preamble><artwork type="example" name="digcalc.c"> |
---|
1620 | #include <global.h> |
---|
1621 | #include <md5.h> |
---|
1622 | #include <string.h> |
---|
1623 | #include "digcalc.h" |
---|
1624 | |
---|
1625 | void CvtHex( |
---|
1626 | IN HASH Bin, |
---|
1627 | OUT HASHHEX Hex |
---|
1628 | ) |
---|
1629 | { |
---|
1630 | unsigned short i; |
---|
1631 | unsigned char j; |
---|
1632 | |
---|
1633 | for (i = 0; i < HASHLEN; i++) { |
---|
1634 | j = (Bin[i] >> 4) & 0xf; |
---|
1635 | if (j <= 9) |
---|
1636 | Hex[i*2] = (j + '0'); |
---|
1637 | else |
---|
1638 | Hex[i*2] = (j + 'a' - 10); |
---|
1639 | j = Bin[i] & 0xf; |
---|
1640 | if (j <= 9) |
---|
1641 | Hex[i*2+1] = (j + '0'); |
---|
1642 | else |
---|
1643 | Hex[i*2+1] = (j + 'a' - 10); |
---|
1644 | }; |
---|
1645 | Hex[HASHHEXLEN] = '\0'; |
---|
1646 | }; |
---|
1647 | |
---|
1648 | /* calculate H(A1) as per spec */ |
---|
1649 | void DigestCalcHA1( |
---|
1650 | IN char * pszAlg, |
---|
1651 | IN char * pszUserName, |
---|
1652 | IN char * pszRealm, |
---|
1653 | IN char * pszPassword, |
---|
1654 | IN char * pszNonce, |
---|
1655 | IN char * pszCNonce, |
---|
1656 | OUT HASHHEX SessionKey |
---|
1657 | ) |
---|
1658 | { |
---|
1659 | MD5_CTX Md5Ctx; |
---|
1660 | HASH HA1; |
---|
1661 | |
---|
1662 | MD5Init(&Md5Ctx); |
---|
1663 | MD5Update(&Md5Ctx, pszUserName, strlen(pszUserName)); |
---|
1664 | MD5Update(&Md5Ctx, ":", 1); |
---|
1665 | MD5Update(&Md5Ctx, pszRealm, strlen(pszRealm)); |
---|
1666 | MD5Update(&Md5Ctx, ":", 1); |
---|
1667 | MD5Update(&Md5Ctx, pszPassword, strlen(pszPassword)); |
---|
1668 | MD5Final(HA1, &Md5Ctx); |
---|
1669 | if (stricmp(pszAlg, "md5-sess") == 0) { |
---|
1670 | MD5Init(&Md5Ctx); |
---|
1671 | MD5Update(&Md5Ctx, HA1, HASHLEN); |
---|
1672 | MD5Update(&Md5Ctx, ":", 1); |
---|
1673 | MD5Update(&Md5Ctx, pszNonce, strlen(pszNonce)); |
---|
1674 | MD5Update(&Md5Ctx, ":", 1); |
---|
1675 | MD5Update(&Md5Ctx, pszCNonce, strlen(pszCNonce)); |
---|
1676 | MD5Final(HA1, &Md5Ctx); |
---|
1677 | }; |
---|
1678 | CvtHex(HA1, SessionKey); |
---|
1679 | }; |
---|
1680 | |
---|
1681 | /* calculate request-digest/response-digest as per HTTP Digest spec */ |
---|
1682 | void DigestCalcResponse( |
---|
1683 | IN HASHHEX HA1, /* H(A1) */ |
---|
1684 | IN char * pszNonce, /* nonce from server */ |
---|
1685 | IN char * pszNonceCount, /* 8 hex digits */ |
---|
1686 | IN char * pszCNonce, /* client nonce */ |
---|
1687 | IN char * pszQop, /* qop-value: "", "auth", "auth-int" */ |
---|
1688 | IN char * pszMethod, /* method from the request */ |
---|
1689 | IN char * pszDigestUri, /* requested URL */ |
---|
1690 | IN HASHHEX HEntity, /* H(entity body) if qop="auth-int" */ |
---|
1691 | OUT HASHHEX Response /* request-digest or response-digest */ |
---|
1692 | ) |
---|
1693 | { |
---|
1694 | MD5_CTX Md5Ctx; |
---|
1695 | HASH HA2; |
---|
1696 | HASH RespHash; |
---|
1697 | HASHHEX HA2Hex; |
---|
1698 | |
---|
1699 | // calculate H(A2) |
---|
1700 | MD5Init(&Md5Ctx); |
---|
1701 | MD5Update(&Md5Ctx, pszMethod, strlen(pszMethod)); |
---|
1702 | MD5Update(&Md5Ctx, ":", 1); |
---|
1703 | MD5Update(&Md5Ctx, pszDigestUri, strlen(pszDigestUri)); |
---|
1704 | if (stricmp(pszQop, "auth-int") == 0) { |
---|
1705 | MD5Update(&Md5Ctx, ":", 1); |
---|
1706 | MD5Update(&Md5Ctx, HEntity, HASHHEXLEN); |
---|
1707 | }; |
---|
1708 | MD5Final(HA2, &Md5Ctx); |
---|
1709 | CvtHex(HA2, HA2Hex); |
---|
1710 | |
---|
1711 | // calculate response |
---|
1712 | MD5Init(&Md5Ctx); |
---|
1713 | MD5Update(&Md5Ctx, HA1, HASHHEXLEN); |
---|
1714 | MD5Update(&Md5Ctx, ":", 1); |
---|
1715 | MD5Update(&Md5Ctx, pszNonce, strlen(pszNonce)); |
---|
1716 | MD5Update(&Md5Ctx, ":", 1); |
---|
1717 | if (*pszQop) { |
---|
1718 | MD5Update(&Md5Ctx, pszNonceCount, strlen(pszNonceCount)); |
---|
1719 | MD5Update(&Md5Ctx, ":", 1); |
---|
1720 | MD5Update(&Md5Ctx, pszCNonce, strlen(pszCNonce)); |
---|
1721 | MD5Update(&Md5Ctx, ":", 1); |
---|
1722 | MD5Update(&Md5Ctx, pszQop, strlen(pszQop)); |
---|
1723 | MD5Update(&Md5Ctx, ":", 1); |
---|
1724 | }; |
---|
1725 | MD5Update(&Md5Ctx, HA2Hex, HASHHEXLEN); |
---|
1726 | MD5Final(RespHash, &Md5Ctx); |
---|
1727 | CvtHex(RespHash, Response); |
---|
1728 | }; |
---|
1729 | </artwork></figure> |
---|
1730 | <figure><preamble> |
---|
1731 | File "digtest.c": |
---|
1732 | </preamble><artwork type="example" name="digtest.c"> |
---|
1733 | #include <stdio.h> |
---|
1734 | #include "digcalc.h" |
---|
1735 | |
---|
1736 | void main(int argc, char ** argv) { |
---|
1737 | |
---|
1738 | char * pszNonce = "dcd98b7102dd2f0e8b11d0f600bfb0c093"; |
---|
1739 | char * pszCNonce = "0a4f113b"; |
---|
1740 | char * pszUser = "Mufasa"; |
---|
1741 | char * pszRealm = "testrealm@host.com"; |
---|
1742 | char * pszPass = "Circle Of Life"; |
---|
1743 | char * pszAlg = "md5"; |
---|
1744 | char szNonceCount[9] = "00000001"; |
---|
1745 | char * pszMethod = "GET"; |
---|
1746 | char * pszQop = "auth"; |
---|
1747 | char * pszURI = "/dir/index.html"; |
---|
1748 | HASHHEX HA1; |
---|
1749 | HASHHEX HA2 = ""; |
---|
1750 | HASHHEX Response; |
---|
1751 | |
---|
1752 | DigestCalcHA1(pszAlg, pszUser, pszRealm, pszPass, pszNonce, |
---|
1753 | pszCNonce, HA1); |
---|
1754 | DigestCalcResponse(HA1, pszNonce, szNonceCount, pszCNonce, pszQop, |
---|
1755 | pszMethod, pszURI, HA2, Response); |
---|
1756 | printf("Response = %s\n", Response); |
---|
1757 | }; |
---|
1758 | </artwork></figure> |
---|
1759 | </section> |
---|
1760 | |
---|
1761 | <section title="Acknowledgments"> |
---|
1762 | <t> |
---|
1763 | Eric W. Sink, of AbiSource, Inc., was one of the original authors |
---|
1764 | before the specification underwent substantial revision. |
---|
1765 | </t> |
---|
1766 | <t> |
---|
1767 | In addition to the authors, valuable discussion instrumental in |
---|
1768 | creating this document has come from Peter J. Churchyard, Ned Freed, |
---|
1769 | and David M. Kristol. |
---|
1770 | </t> |
---|
1771 | <t> |
---|
1772 | Jim Gettys and Larry Masinter edited this document for update. |
---|
1773 | </t> |
---|
1774 | </section> |
---|
1775 | </middle> |
---|
1776 | <back> |
---|
1777 | |
---|
1778 | <references> |
---|
1779 | |
---|
1780 | <reference anchor='RFC1945'> |
---|
1781 | <front> |
---|
1782 | <title abbrev='HTTP/1.0'>Hypertext Transfer Protocol -- HTTP/1.0</title> |
---|
1783 | <author initials='T.' surname='Berners-Lee' fullname='Tim Berners-Lee'> |
---|
1784 | <organization>MIT, Laboratory for Computer Science</organization> |
---|
1785 | <address> |
---|
1786 | <postal> |
---|
1787 | <street>545 Technology Square</street> |
---|
1788 | <city>Cambridge</city> |
---|
1789 | <region>MA</region> |
---|
1790 | <code>02139</code> |
---|
1791 | <country>US</country></postal> |
---|
1792 | <facsimile>+1 617 258 8682</facsimile> |
---|
1793 | <email>timbl@w3.org</email></address></author> |
---|
1794 | <author initials='R.T.' surname='Fielding' fullname='Roy T. Fielding'> |
---|
1795 | <organization>University of California, Irvine, Department of Information and Computer Science</organization> |
---|
1796 | <address> |
---|
1797 | <postal> |
---|
1798 | <street /> |
---|
1799 | <city>Irvine</city> |
---|
1800 | <region>CA</region> |
---|
1801 | <code>92717-3425</code> |
---|
1802 | <country>US</country></postal> |
---|
1803 | <facsimile>+1 714 824 4056</facsimile> |
---|
1804 | <email>fielding@ics.uci.edu</email></address></author> |
---|
1805 | <author initials='H.F.' surname='Nielsen' fullname='Henrik Frystyk Nielsen'> |
---|
1806 | <organization>W3 Consortium, MIT Laboratory for Computer Science</organization> |
---|
1807 | <address> |
---|
1808 | <postal> |
---|
1809 | <street>545 Technology Square</street> |
---|
1810 | <city>Cambridge</city> |
---|
1811 | <region>MA</region> |
---|
1812 | <code>02139</code> |
---|
1813 | <country>US</country></postal> |
---|
1814 | <facsimile>+1 617 258 8682</facsimile> |
---|
1815 | <email>frystyk@w3.org</email></address></author> |
---|
1816 | <date year='1996' month='May' /> |
---|
1817 | </front> |
---|
1818 | <seriesInfo name='RFC' value='1945' /> |
---|
1819 | </reference> |
---|
1820 | |
---|
1821 | <reference anchor="RFC2616"> |
---|
1822 | |
---|
1823 | <front> |
---|
1824 | <title abbrev="HTTP/1.1">Hypertext Transfer Protocol -- HTTP/1.1</title> |
---|
1825 | <author initials="R.T." surname="Fielding" fullname="Roy T. Fielding"> |
---|
1826 | <organization>University of California, Irvine, Information and Computer Science</organization> |
---|
1827 | <address> |
---|
1828 | <postal> |
---|
1829 | <street/> |
---|
1830 | <city>Irvine</city> |
---|
1831 | <region>CA</region> |
---|
1832 | <code>92697-3425</code> |
---|
1833 | <country>US</country></postal> |
---|
1834 | <phone>+1 949 824 1715</phone> |
---|
1835 | <email>fielding@ics.uci.edu</email></address></author> |
---|
1836 | <author initials="J." surname="Gettys" fullname="James Gettys"> |
---|
1837 | <organization>World Wide Web Consortium, MIT Laboratory for Computer Science</organization> |
---|
1838 | <address> |
---|
1839 | <postal> |
---|
1840 | <street>545 Technology Square</street> |
---|
1841 | <city>Cambridge</city> |
---|
1842 | <region>MA</region> |
---|
1843 | <code>02139</code> |
---|
1844 | <country>US</country></postal> |
---|
1845 | <phone/> |
---|
1846 | <facsimile>+1 617 258 8682</facsimile> |
---|
1847 | <email>jg@w3.org</email></address></author> |
---|
1848 | <author initials="J.C." surname="Mogul" fullname="Jeffrey C. Mogul"> |
---|
1849 | <organization>Compaq Computer Corporation, Western Research Laboratory</organization> |
---|
1850 | <address> |
---|
1851 | <postal> |
---|
1852 | <street>250 University Avenue</street> |
---|
1853 | <city>Palo Alto</city> |
---|
1854 | <region>CA</region> |
---|
1855 | <code>94301</code> |
---|
1856 | <country>US</country></postal> |
---|
1857 | <phone/> |
---|
1858 | <email>mogul@wrl.dec.com</email></address></author> |
---|
1859 | <author initials="H.F." surname="Nielsen" fullname="Henrik Frystyk Nielsen"> |
---|
1860 | <organization>World Wide Web Consortium, MIT Laboratory for Computer Science</organization> |
---|
1861 | <address> |
---|
1862 | <postal> |
---|
1863 | <street>545 Technology Square</street> |
---|
1864 | <city>Cambridge</city> |
---|
1865 | <region>MA</region> |
---|
1866 | <code>02139</code> |
---|
1867 | <country>US</country></postal> |
---|
1868 | <phone/> |
---|
1869 | <facsimile>+1 617 258 8682</facsimile> |
---|
1870 | <email>frystyk@w3.org</email></address></author> |
---|
1871 | <author initials="L." surname="Masinter" fullname="Larry Masinter"> |
---|
1872 | <organization>Xerox Corporation</organization> |
---|
1873 | <address> |
---|
1874 | <postal> |
---|
1875 | <street>3333 Coyote Hill Road</street> |
---|
1876 | <city>Palo Alto</city> |
---|
1877 | <region>CA</region> |
---|
1878 | <code>94034</code> |
---|
1879 | <country>US</country></postal> |
---|
1880 | <phone/> |
---|
1881 | <email>masinter@parc.xerox.com</email></address></author> |
---|
1882 | <author initials="P.J." surname="Leach" fullname="Paul J. Leach"> |
---|
1883 | <organization>Microsoft Corporation</organization> |
---|
1884 | <address> |
---|
1885 | <postal> |
---|
1886 | <street>1 Microsoft Way</street> |
---|
1887 | <city>Redmond</city> |
---|
1888 | <region>WA</region> |
---|
1889 | <code>98052</code> |
---|
1890 | <country>US</country></postal> |
---|
1891 | <phone/> |
---|
1892 | <email>paulle@microsoft.com</email></address></author> |
---|
1893 | <author initials="T." surname="Berners-Lee" fullname="Tim Berners-Lee"> |
---|
1894 | <organization>World Wide Web Consortium, MIT Laboratory for Computer Science</organization> |
---|
1895 | <address> |
---|
1896 | <postal> |
---|
1897 | <street>545 Technology Square</street> |
---|
1898 | <city>Cambridge</city> |
---|
1899 | <region>MA</region> |
---|
1900 | <code>02139</code> |
---|
1901 | <country>US</country></postal> |
---|
1902 | <phone>+1 617 258 8682</phone> |
---|
1903 | <facsimile/> |
---|
1904 | <email>timbl@w3.org</email></address></author> |
---|
1905 | <date month="June" year="1999"/> |
---|
1906 | </front> |
---|
1907 | <seriesInfo name="RFC" value="2616"/> |
---|
1908 | |
---|
1909 | <x:source href="rfc2616.xml"/> |
---|
1910 | </reference> |
---|
1911 | |
---|
1912 | <reference anchor='RFC1321'> |
---|
1913 | <front> |
---|
1914 | <title abbrev='MD5 Message-Digest Algorithm'>The MD5 Message-Digest Algorithm</title> |
---|
1915 | <author initials='R.' surname='Rivest' fullname='Ronald L. Rivest'> |
---|
1916 | <organization>Massachusetts Institute of Technology, (MIT) Laboratory for Computer Science</organization> |
---|
1917 | <address> |
---|
1918 | <postal> |
---|
1919 | <street>545 Technology Square</street> |
---|
1920 | <street>NE43-324</street> |
---|
1921 | <city>Cambridge</city> |
---|
1922 | <region>MA</region> |
---|
1923 | <code>02139-1986</code> |
---|
1924 | <country>US</country></postal> |
---|
1925 | <phone>+1 617 253 5880</phone> |
---|
1926 | <email>rivest@theory.lcs.mit.edu</email></address></author> |
---|
1927 | <date year='1992' month='April' /></front> |
---|
1928 | <seriesInfo name='RFC' value='1321' /> |
---|
1929 | </reference> |
---|
1930 | |
---|
1931 | <reference anchor='RFC2045'> |
---|
1932 | <front> |
---|
1933 | <title abbrev='Internet Message Bodies'>Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies</title> |
---|
1934 | <author initials='N.' surname='Freed' fullname='Ned Freed'> |
---|
1935 | <organization>Innosoft International, Inc.</organization> |
---|
1936 | <address> |
---|
1937 | <postal> |
---|
1938 | <street>1050 East Garvey Avenue South</street> |
---|
1939 | <city>West Covina</city> |
---|
1940 | <region>CA</region> |
---|
1941 | <code>91790</code> |
---|
1942 | <country>US</country></postal> |
---|
1943 | <phone>+1 818 919 3600</phone> |
---|
1944 | <facsimile>+1 818 919 3614</facsimile> |
---|
1945 | <email>ned@innosoft.com</email></address></author> |
---|
1946 | <author initials='N.S.' surname='Borenstein' fullname='Nathaniel S. Borenstein'> |
---|
1947 | <organization>First Virtual Holdings</organization> |
---|
1948 | <address> |
---|
1949 | <postal> |
---|
1950 | <street>25 Washington Avenue</street> |
---|
1951 | <city>Morristown</city> |
---|
1952 | <region>NJ</region> |
---|
1953 | <code>07960</code> |
---|
1954 | <country>US</country></postal> |
---|
1955 | <phone>+1 201 540 8967</phone> |
---|
1956 | <facsimile>+1 201 993 3032</facsimile> |
---|
1957 | <email>nsb@nsb.fv.com</email></address></author> |
---|
1958 | <date year='1996' month='November' /> |
---|
1959 | </front> |
---|
1960 | <seriesInfo name='RFC' value='2045' /> |
---|
1961 | </reference> |
---|
1962 | |
---|
1963 | <reference anchor='RFC2246'> |
---|
1964 | <front> |
---|
1965 | <title>The TLS Protocol Version 1.0</title> |
---|
1966 | <author initials='T.' surname='Dierks' fullname='Tim Dierks'> |
---|
1967 | <organization>Certicom</organization> |
---|
1968 | <address> |
---|
1969 | <email>tdierks@certicom.com</email></address></author> |
---|
1970 | <author initials='C.' surname='Allen' fullname='Christopher Allen'> |
---|
1971 | <organization>Certicom</organization> |
---|
1972 | <address> |
---|
1973 | <email>callen@certicom.com</email></address></author> |
---|
1974 | <date year='1999' month='January' /> |
---|
1975 | </front> |
---|
1976 | <seriesInfo name='RFC' value='2246' /> |
---|
1977 | <format type='TXT' octets='170401' target='ftp://ftp.isi.edu/in-notes/rfc2246.txt' /> |
---|
1978 | </reference> |
---|
1979 | |
---|
1980 | |
---|
1981 | <reference anchor='RFC2069'> |
---|
1982 | <front> |
---|
1983 | <title abbrev='Digest Access Authentication'>An Extension to HTTP : Digest Access Authentication</title> |
---|
1984 | <author initials='J.' surname='Franks' fullname='John Franks'> |
---|
1985 | <organization>Northwestern University, Department of Mathematics</organization> |
---|
1986 | <address> |
---|
1987 | <postal> |
---|
1988 | <street /> |
---|
1989 | <city>Evanston</city> |
---|
1990 | <region>IL</region> |
---|
1991 | <code>60208-2730</code> |
---|
1992 | <country>US</country></postal> |
---|
1993 | <email>john@math.nwu.edu</email></address></author> |
---|
1994 | <author initials='P.' surname='Hallam-Baker' fullname='Phillip M. Hallam-Baker'> |
---|
1995 | <organization>CERN</organization> |
---|
1996 | <address> |
---|
1997 | <postal> |
---|
1998 | <street /> |
---|
1999 | <city>Geneva</city> |
---|
2000 | <country>CH</country></postal> |
---|
2001 | <email>hallam@w3.org</email></address></author> |
---|
2002 | <author initials='J.' surname='Hostetler' fullname='Jeffery L. Hostetler'> |
---|
2003 | <organization>Spyglass, Inc.</organization> |
---|
2004 | <address> |
---|
2005 | <postal> |
---|
2006 | <street>3200 Farber Drive</street> |
---|
2007 | <city>Champaign</city> |
---|
2008 | <region>IL</region> |
---|
2009 | <code>61821</code> |
---|
2010 | <country>US</country></postal> |
---|
2011 | <email>jeff@spyglass.com</email></address></author> |
---|
2012 | <author initials='P.' surname='Leach' fullname='Paul J. Leach'> |
---|
2013 | <organization>Microsoft Corporation</organization> |
---|
2014 | <address> |
---|
2015 | <postal> |
---|
2016 | <street>1 Microsoft Way</street> |
---|
2017 | <city>Redmond</city> |
---|
2018 | <region>WA</region> |
---|
2019 | <code>98052</code> |
---|
2020 | <country>US</country></postal> |
---|
2021 | <email>paulle@microsoft.com</email></address></author> |
---|
2022 | <author initials='A.' surname='Luotonen' fullname='Ari Luotonen'> |
---|
2023 | <organization>Netscape Communications Corporation</organization> |
---|
2024 | <address> |
---|
2025 | <postal> |
---|
2026 | <street>501 East Middlefield Road</street> |
---|
2027 | <city>Mountain View</city> |
---|
2028 | <region>CA</region> |
---|
2029 | <code>94043</code> |
---|
2030 | <country>US</country></postal> |
---|
2031 | <email>luotonen@netscape.com</email></address></author> |
---|
2032 | <author initials='E.' surname='Sink' fullname='Eric W. Sink'> |
---|
2033 | <organization>Spyglass, Inc.</organization> |
---|
2034 | <address> |
---|
2035 | <postal> |
---|
2036 | <street>3200 Farber Drive</street> |
---|
2037 | <city>Champaign</city> |
---|
2038 | <region>IL</region> |
---|
2039 | <code>61821</code> |
---|
2040 | <country>US</country></postal> |
---|
2041 | <email>eric@spyglass.com</email></address></author> |
---|
2042 | <author initials='L.' surname='Stewart' fullname='Lawrence C. Stewart'> |
---|
2043 | <organization>Open Market, Inc.</organization> |
---|
2044 | <address> |
---|
2045 | <postal> |
---|
2046 | <street>215 First Street</street> |
---|
2047 | <city>Cambridge</city> |
---|
2048 | <region>MA</region> |
---|
2049 | <code>02142</code> |
---|
2050 | <country>US</country></postal> |
---|
2051 | <email>stewart@OpenMarket.com</email></address></author> |
---|
2052 | <date year='1997' month='January' /> |
---|
2053 | </front> |
---|
2054 | <seriesInfo name='RFC' value='2069' /> |
---|
2055 | </reference> |
---|
2056 | |
---|
2057 | <reference anchor="RFC2396"> |
---|
2058 | <front> |
---|
2059 | <title abbrev="URI Generic Syntax">Uniform Resource Identifiers (URI): Generic Syntax</title> |
---|
2060 | <author initials="T." surname="Berners-Lee" fullname="Tim Berners-Lee"> |
---|
2061 | <organization>World Wide Web Consortium</organization> |
---|
2062 | <address> |
---|
2063 | <email>timbl@w3.org</email></address> |
---|
2064 | </author> |
---|
2065 | <author initials="R.T." surname="Fielding" fullname="Roy T. Fielding"> |
---|
2066 | <organization>Department of Information and Computer Science</organization> |
---|
2067 | <address> |
---|
2068 | <email>fielding@ics.uci.edu</email> |
---|
2069 | </address> |
---|
2070 | </author> |
---|
2071 | <author initials="L." surname="Masinter" fullname="Larry Masinter"> |
---|
2072 | <organization>Xerox PARC</organization> |
---|
2073 | <address> |
---|
2074 | <email>masinter@parc.xerox.com</email> |
---|
2075 | </address> |
---|
2076 | </author> |
---|
2077 | <date month="August" year="1998"/> |
---|
2078 | </front> |
---|
2079 | <seriesInfo name="RFC" value="2396"/> |
---|
2080 | </reference> |
---|
2081 | |
---|
2082 | <reference anchor="ref8" target="http://www.rsa.com/rsalabs/pubs/cryptobytes/spring95/md5.htm"> |
---|
2083 | <front> |
---|
2084 | <title>Message Authentication with MD5</title> |
---|
2085 | <author initials="B." surname="Kaliski"> |
---|
2086 | <organization/> |
---|
2087 | </author> |
---|
2088 | <author initials="M." surname="Robshaw"> |
---|
2089 | <organization/> |
---|
2090 | </author> |
---|
2091 | <date year="1995"/> |
---|
2092 | </front> |
---|
2093 | <annotation>CryptoBytes, Spring 1995</annotation> |
---|
2094 | </reference> |
---|
2095 | |
---|
2096 | <reference anchor='RFC2195'> |
---|
2097 | <front> |
---|
2098 | <title abbrev='IMAP/POP AUTHorize Extension'>IMAP/POP AUTHorize Extension for Simple Challenge/Response</title> |
---|
2099 | <author initials='J.C.' surname='Klensin' fullname='John C. Klensin'> |
---|
2100 | <organization>MCI</organization> |
---|
2101 | <address> |
---|
2102 | <postal> |
---|
2103 | <street>800 Boylston</street> |
---|
2104 | <street>7th floor</street> |
---|
2105 | <street>Boston</street> |
---|
2106 | <street>MA 02199</street> |
---|
2107 | <country>USA</country></postal> |
---|
2108 | <phone>+1 617 960 1011</phone> |
---|
2109 | <email>klensin@mci.net</email></address></author> |
---|
2110 | <author initials='R.' surname='Catoe' fullname='Randy Catoe'> |
---|
2111 | <organization>MCI</organization> |
---|
2112 | <address> |
---|
2113 | <postal> |
---|
2114 | <street>2100 Reston Parkway</street> |
---|
2115 | <street>Reston</street> |
---|
2116 | <street>VA 22091</street> |
---|
2117 | <country>USA</country></postal> |
---|
2118 | <phone>+1 703 715 7366</phone> |
---|
2119 | <email>randy@mci.net</email></address></author> |
---|
2120 | <author initials='P.' surname='Krumviede' fullname='Paul Krumviede'> |
---|
2121 | <organization>MCI</organization> |
---|
2122 | <address> |
---|
2123 | <postal> |
---|
2124 | <street>2100 Reston Parkway</street> |
---|
2125 | <street>Reston</street> |
---|
2126 | <street>VA 22091</street> |
---|
2127 | <country>USA</country></postal> |
---|
2128 | <phone>+1 703 715 7251</phone> |
---|
2129 | <email>paul@mci.net</email></address></author> |
---|
2130 | <date year='1997' month='September' /> |
---|
2131 | <area>Applications</area> |
---|
2132 | <keyword>IMAP</keyword> |
---|
2133 | <keyword>authentication</keyword> |
---|
2134 | <keyword>internet message access protocol</keyword> |
---|
2135 | <keyword>post office protocol</keyword> |
---|
2136 | <keyword>security</keyword> |
---|
2137 | </front> |
---|
2138 | <seriesInfo name='RFC' value='2195' /> |
---|
2139 | </reference> |
---|
2140 | |
---|
2141 | <reference anchor="ref10"> |
---|
2142 | <front> |
---|
2143 | <title>Authentication Methods for LDAP</title> |
---|
2144 | <author initials="B." surname="Morgan"> |
---|
2145 | <organization/> |
---|
2146 | </author> |
---|
2147 | <author initials="H." surname="Alvestrand"> |
---|
2148 | <organization/> |
---|
2149 | </author> |
---|
2150 | <author initials="J." surname="Hodges"> |
---|
2151 | <organization/> |
---|
2152 | </author> |
---|
2153 | <author initials="M." surname="Wahl"> |
---|
2154 | <organization/> |
---|
2155 | </author> |
---|
2156 | <date/> |
---|
2157 | </front> |
---|
2158 | <annotation>Work in progress.</annotation> |
---|
2159 | </reference> |
---|
2160 | </references> |
---|
2161 | |
---|
2162 | </back> |
---|
2163 | </rfc> |
---|