1 |
wakaba |
1.1 |
|
2 |
|
|
HTTP Working Group John Franks |
3 |
|
|
INTERNET-DRAFT Philip Hallam-Baker |
4 |
|
|
<draft-ietf-http-digest-aa-04.txt> Jeffery L. Hostetler |
5 |
|
|
Paul Leach |
6 |
|
|
Ari Luotonen |
7 |
|
|
Eric W. Sink |
8 |
|
|
Lawrence C. Stewart |
9 |
|
|
|
10 |
|
|
Expires SIX MONTHS FROM---> June 6, 1996 |
11 |
|
|
|
12 |
|
|
|
13 |
|
|
A Proposed Extension to HTTP : Digest Access Authentication |
14 |
|
|
|
15 |
|
|
|
16 |
|
|
Status of this Memo |
17 |
|
|
|
18 |
|
|
This document is an Internet-Draft. Internet-Drafts are working |
19 |
|
|
documents of the Internet Engineering Task Force (IETF), its areas, |
20 |
|
|
and its working groups. Note that other groups may also distribute |
21 |
|
|
working documents as Internet-Drafts. |
22 |
|
|
|
23 |
|
|
Internet-Drafts are draft documents valid for a maximum of six months |
24 |
|
|
and may be updated, replaced, or obsoleted by other documents at any |
25 |
|
|
time. It is inappropriate to use Internet-Drafts as reference |
26 |
|
|
material or to cite them other than as "work in progress." |
27 |
|
|
|
28 |
|
|
To learn the current status of any Internet-Draft, please check the |
29 |
|
|
"1id-abstracts.txt" listing contained in the Internet-Drafts Shadow |
30 |
|
|
Directories on ds.internic.net (US East Coast), nic.nordu.net |
31 |
|
|
(Europe), ftp.isi.edu (US West Coast), or munnari.oz.au (Pacific |
32 |
|
|
Rim). |
33 |
|
|
|
34 |
|
|
Distribution of this document is unlimited. Please send comments to |
35 |
|
|
the HTTP working group at <http-wg@cuckoo.hpl.hp.com>. |
36 |
|
|
Discussions of the working group are archived at |
37 |
|
|
<URL:http://www.ics.uci.edu/pub/ietf/http/>. General discussions |
38 |
|
|
about HTTP and the applications which use HTTP should take place on |
39 |
|
|
the <www-talk@www10.w3.org> mailing list. |
40 |
|
|
|
41 |
|
|
|
42 |
|
|
Abstract |
43 |
|
|
|
44 |
|
|
The protocol referred to as "HTTP/1.0" includes specification for a |
45 |
|
|
Basic Access Authentication scheme. This scheme is not considered to |
46 |
|
|
be a secure method of user authentication, as the user name and |
47 |
|
|
password are passed over the network in an unencrypted form. A |
48 |
|
|
specification for a new authentication scheme is needed for future |
49 |
|
|
versions of the HTTP protocol. This document provides specification |
50 |
|
|
for such a scheme, referred to as "Digest Access Authentication". |
51 |
|
|
The digesting method used by default is the RSA Data Security, Inc. |
52 |
|
|
MD5 Message-Digest Algorithm [3]. |
53 |
|
|
|
54 |
|
|
|
55 |
|
|
|
56 |
|
|
|
57 |
|
|
Table of Contents |
58 |
|
|
|
59 |
|
|
STATUS OF THIS MEMO.................................................... |
60 |
|
|
|
61 |
|
|
|
62 |
|
|
ABSTRACT............................................................... |
63 |
|
|
|
64 |
|
|
|
65 |
|
|
TABLE OF CONTENTS...................................................... |
66 |
|
|
|
67 |
|
|
|
68 |
|
|
INTRODUCTION........................................................... |
69 |
|
|
|
70 |
|
|
1.1 PURPOSE ......................................................... |
71 |
|
|
1.2 OVERALL OPERATION ............................................... |
72 |
|
|
1.3 REPRESENTATION OF DIGEST VALUES ................................. |
73 |
|
|
1.4 LIMITATIONS ..................................................... |
74 |
|
|
|
75 |
|
|
2. DIGEST ACCESS AUTHENTICATION SCHEME................................. |
76 |
|
|
|
77 |
|
|
2.1 SPECIFICATION OF DIGEST HEADERS .................................. |
78 |
|
|
2.1.1 THE WWW-AUTHENTICATE RESPONSE HEADER .......................... |
79 |
|
|
2.1.2 THE AUTHORIZATION REQUEST HEADER .............................. |
80 |
|
|
2.1.3 THE AUTHENTICATION-INFO HEADER ................................ |
81 |
|
|
2.2 DIGEST OPERATION ................................................. |
82 |
|
|
2.3 SECURITY PROTOCOL NEGOTIATION .................................... |
83 |
|
|
2.4 EXAMPLE .......................................................... |
84 |
|
|
2.5 PROXY-AUTHENTICATION AND PROXY-AUTHORIZATION ..................... |
85 |
|
|
|
86 |
|
|
3. SECURITY CONSIDERATIONS............................................ |
87 |
|
|
|
88 |
|
|
3.1 COMPARISON WITH BASIC AUTHENTICATION ............................ |
89 |
|
|
3.2 REPLAY ATTACKS .................................................. |
90 |
|
|
3.3 MAN IN THE MIDDLE ............................................... |
91 |
|
|
3.4 SPOOFING BY COUNTERFEIT SERVERS ................................. |
92 |
|
|
3.5 STORING PASSWORDS ............................................... |
93 |
|
|
3.6 SUMMARY ......................................................... |
94 |
|
|
|
95 |
|
|
4. ACKNOWLEDGMENTS................................................... |
96 |
|
|
|
97 |
|
|
|
98 |
|
|
5. REFERENCES......................................................... |
99 |
|
|
|
100 |
|
|
|
101 |
|
|
6. AUTHORS ADDRESSES.................................................. |
102 |
|
|
|
103 |
|
|
|
104 |
|
|
|
105 |
|
|
Introduction |
106 |
|
|
|
107 |
|
|
|
108 |
|
|
1.1 Purpose |
109 |
|
|
|
110 |
|
|
The protocol referred to as "HTTP/1.0" includes specification for a |
111 |
|
|
Basic Access Authentication scheme[1]. This scheme is not considered |
112 |
|
|
to be a secure method of user authentication, as the user name and |
113 |
|
|
password are passed over the network in an unencrypted form. A |
114 |
|
|
specification for a new authentication scheme is needed for future |
115 |
|
|
versions of the HTTP protocol. This document provides specification |
116 |
|
|
for such a scheme, referred to as "Digest Access Authentication". |
117 |
|
|
|
118 |
|
|
The Digest Access Authentication scheme is not intended to be a |
119 |
|
|
complete answer to the need for security in the World Wide Web. This |
120 |
|
|
scheme provides no encryption of object content. The intent is |
121 |
|
|
simply to facilitate secure access authentication. |
122 |
|
|
|
123 |
|
|
It is proposed that this access authentication scheme be included in |
124 |
|
|
the proposed HTTP/1.1 specification. |
125 |
|
|
|
126 |
|
|
|
127 |
|
|
1.2 Overall Operation |
128 |
|
|
|
129 |
|
|
Like Basic Access Authentication, the Digest scheme is based on a |
130 |
|
|
simple challenge-response paradigm. The Digest scheme challenges |
131 |
|
|
using a nonce value. A valid response contains a checksum (by |
132 |
|
|
default the MD5 checksum) of the username, the password, the given |
133 |
|
|
|
134 |
|
|
nonce value, the HTTP method, and the requested URI. In this way, the |
135 |
|
|
password is never sent in the clear. Just as with the Basic scheme, |
136 |
|
|
the username and password must be prearranged in some fashion which is |
137 |
|
|
not addressed by this document. |
138 |
|
|
|
139 |
|
|
|
140 |
|
|
1.3 Representation of digest values |
141 |
|
|
|
142 |
|
|
An optional header allows the server to specify the algorithm used to |
143 |
|
|
create the checksum or digest. By default the MD5 algorithm is used |
144 |
|
|
and that is the only algorithm described in this document. |
145 |
|
|
|
146 |
|
|
For the purposes of this document, an MD5 digest of 128 bits is |
147 |
|
|
represented as 32 ASCII printable characters. The bits in the 128 |
148 |
|
|
bit digest are converted from most significant to least significant |
149 |
|
|
bit, four bits at a time to their ASCII presentation as follows. |
150 |
|
|
Each four bits is represented by its familiar hexadecimal notation |
151 |
|
|
from the characters 0123456789abcdef. That is, binary 0000 gets |
152 |
|
|
represented by the character '0', 0001, by '1', and so on up to the |
153 |
|
|
representation of 1111 as 'f'. |
154 |
|
|
|
155 |
|
|
|
156 |
|
|
1.4 Limitations |
157 |
|
|
|
158 |
|
|
The digest authentication scheme described in this document suffers |
159 |
|
|
from many known limitations. It is intended as a replacement for |
160 |
|
|
basic authentication and nothing more. It is a password-based system |
161 |
|
|
and (on the server side) suffers from all the same problems of any |
162 |
|
|
password system. In particular, no provision is made in this protocol |
163 |
|
|
for the initial secure arrangement between user and server to |
164 |
|
|
establish the user's password. |
165 |
|
|
|
166 |
|
|
Users and implementors should be aware that this protocol is not as |
167 |
|
|
secure as kerberos, and not as secure as any client-side private-key |
168 |
|
|
scheme. Nevertheless it is better than nothing, better than what is |
169 |
|
|
commonly used with telnet and ftp, and better than Basic |
170 |
|
|
authentication. |
171 |
|
|
|
172 |
|
|
Some keyword-value pairs occurring in headers described below are |
173 |
|
|
required to have values which are of the type "quoted-string" as |
174 |
|
|
defined in section 2.2 of the HTTP/1.1 specification [2]. A |
175 |
|
|
consequence is that these values represent strings in the US-ASCII |
176 |
|
|
character set. An unfortunate side effect of this is that digest |
177 |
|
|
authentication is not capable of handling either user names or realm |
178 |
|
|
names (see 2.1.1 below) which are not expressed in this character set. |
179 |
|
|
|
180 |
|
|
|
181 |
|
|
|
182 |
|
|
2. Digest Access Authentication Scheme |
183 |
|
|
|
184 |
|
|
|
185 |
|
|
2.1 Specification of Digest Headers |
186 |
|
|
|
187 |
|
|
The Digest Access Authentication scheme is conceptually similar to |
188 |
|
|
the Basic scheme. The formats of the modified WWW-Authenticate |
189 |
|
|
header line and the Authorization header line are specified below, |
190 |
|
|
using the extended BNF defined in the HTTP/1.1 specification, section |
191 |
|
|
2.1. In addition, a new header, Authentication-info, is specified. |
192 |
|
|
|
193 |
|
|
|
194 |
|
|
|
195 |
|
|
2.1.1 The WWW-Authenticate Response Header |
196 |
|
|
|
197 |
|
|
If a server receives a request for an access-protected object, and an |
198 |
|
|
acceptable Authorization header is not sent, the server responds with |
199 |
|
|
a "401 Unauthorized" status code, and a WWW-Authenticate header, |
200 |
|
|
which is defined as follows: |
201 |
|
|
|
202 |
|
|
WWW-Authenticate = "WWW-Authenticate" ":" "Digest" |
203 |
|
|
digest-challenge |
204 |
|
|
|
205 |
|
|
digest-challenge = 1#( realm | [ domain ] | nonce | |
206 |
|
|
[ digest-opaque ] |[ stale ] | [ algorithm ] ) |
207 |
|
|
|
208 |
|
|
realm = "realm" "=" realm-value |
209 |
|
|
realm-value = quoted-string |
210 |
|
|
domain = "domain" "=" <"> 1#URI <"> |
211 |
|
|
nonce = "nonce" "=" nonce-value |
212 |
|
|
nonce-value = quoted-string |
213 |
|
|
opaque = "opaque" "=" quoted-string |
214 |
|
|
stale = "stale" "=" ( "true" | "false" ) |
215 |
|
|
algorithm = "algorithm" "=" ( "MD5" | token ) |
216 |
|
|
|
217 |
|
|
The meanings of the values of the parameters used above are as |
218 |
|
|
follows: |
219 |
|
|
|
220 |
|
|
realm |
221 |
|
|
A string to be displayed to users so they know which username and |
222 |
|
|
password to use. This string should contain at least the name of |
223 |
|
|
the host performing the authentication and might additionally |
224 |
|
|
indicate the collection of users who might have access. An example |
225 |
|
|
might be "registered_users@gotham.news.com". The realm is a |
226 |
|
|
"quoted-string" as specified in section 2.2 of the HTTP/1.1 |
227 |
|
|
specification [2]. |
228 |
|
|
|
229 |
|
|
domain |
230 |
|
|
A comma-separated list of URIs, as specified for HTTP/1.0. The |
231 |
|
|
intent is that the client could use this information to know the |
232 |
|
|
set of URIs for which the same authentication information should be |
233 |
|
|
sent. The URIs in this list may exist on different servers. If |
234 |
|
|
this keyword is omitted or empty, the client should assume that the |
235 |
|
|
domain consists of all URIs on the responding server. |
236 |
|
|
|
237 |
|
|
nonce |
238 |
|
|
A server-specified data string which may be uniquely generated each |
239 |
|
|
time a 401 response is made. It is recommended that this string be |
240 |
|
|
base64 or hexadecimal data. Specifically, since the string is |
241 |
|
|
passed in the header lines as a quoted string, the double-quote |
242 |
|
|
character is not allowed. |
243 |
|
|
|
244 |
|
|
The contents of the nonce are implementation dependent. The |
245 |
|
|
quality of the implementation depends on a good choice. A |
246 |
|
|
recommended nonce would include |
247 |
|
|
|
248 |
|
|
H(client-IP ":" time-stamp ":" private-key ) |
249 |
|
|
|
250 |
|
|
Where client-IP is the dotted quad IP address of the client making |
251 |
|
|
the request, time-stamp is a server-generated time value, private- |
252 |
|
|
key is data known only to the server. With a nonce of this form a |
253 |
|
|
server would normally recalculate the nonce after receiving the |
254 |
|
|
client authentication header and reject the request if it did not |
255 |
|
|
match the nonce from that header. In this way the server can limit |
256 |
|
|
the reuse of a nonce to the IP address to which it was issued and |
257 |
|
|
limit the time of the nonce's validity. Further discussion of the |
258 |
|
|
rationale for nonce construction is in section 3.2 below. |
259 |
|
|
|
260 |
|
|
An implementation might choose not to accept a previously used |
261 |
|
|
nonce or a previously used digest to protect against a replay |
262 |
|
|
attack. Or, an implementation might choose to use one-time nonces |
263 |
|
|
or digests for POST or PUT requests and a time-stamp for GET |
264 |
|
|
requests. For more details on the issues involved see section 3. |
265 |
|
|
of this document. |
266 |
|
|
|
267 |
|
|
The nonce is opaque to the client. |
268 |
|
|
|
269 |
|
|
opaque |
270 |
|
|
A string of data, specified by the server, which should be returned by |
271 |
|
|
the client unchanged. It is recommended that this string be base64 |
272 |
|
|
or hexadecimal data. This field is a "quoted-string" as specified |
273 |
|
|
in section 2.2 of the HTTP/1.1 specification [2]. |
274 |
|
|
|
275 |
|
|
stale |
276 |
|
|
A flag, indicating that the previous request from the client was |
277 |
|
|
rejected because the nonce value was stale. If stale is TRUE (in |
278 |
|
|
upper or lower case), the client may wish to simply retry the |
279 |
|
|
request with a new encrypted response, without reprompting the user |
280 |
|
|
for a new username and password. The server should only set stale |
281 |
|
|
to true if it receives a request for which the nonce is invalid but |
282 |
|
|
with a valid digest for that nonce (indicating that the client knows |
283 |
|
|
the correct username/password). |
284 |
|
|
|
285 |
|
|
algorithm |
286 |
|
|
|
287 |
|
|
A string indicating a pair of algorithms used to produce the digest |
288 |
|
|
and a checksum. If this not present it is assumed to be "MD5". In |
289 |
|
|
this document the string obtained by applying the digest algorithm to |
290 |
|
|
the data "data" with secret "secret" will be denoted by KD(secret, |
291 |
|
|
data), and the string obtained by applying the checksum algorithm to |
292 |
|
|
the data "data" will be denoted H(data). |
293 |
|
|
|
294 |
|
|
For the "MD5" algorithm |
295 |
|
|
|
296 |
|
|
H(data) = MD5(data) |
297 |
|
|
|
298 |
|
|
and |
299 |
|
|
|
300 |
|
|
KD(secret, data) = H(concat(secret, ":", data)) |
301 |
|
|
|
302 |
|
|
i.e., the digest is the MD5 of the secret concatenated with a colon |
303 |
|
|
concatenated with the data. |
304 |
|
|
|
305 |
|
|
|
306 |
|
|
|
307 |
|
|
|
308 |
|
|
|
309 |
|
|
2.1.2 The Authorization Request Header |
310 |
|
|
|
311 |
|
|
The client is expected to retry the request, passing an Authorization |
312 |
|
|
header line, which is defined as follows. |
313 |
|
|
|
314 |
|
|
Authorization = "Authorization" ":" "Digest" digest-response |
315 |
|
|
|
316 |
|
|
digest-response = 1#( username | realm | nonce | digest-uri | |
317 |
|
|
response | [ digest ] | [ algorithm ] | |
318 |
|
|
opaque ) |
319 |
|
|
|
320 |
|
|
username = "username" "=" username-value |
321 |
|
|
username-value = quoted-string |
322 |
|
|
digest-uri = "uri" "=" digest-uri-value |
323 |
|
|
digest-uri-value = request-uri ; As specified by HTTP/1.1 |
324 |
|
|
response = "response" "=" response-digest |
325 |
|
|
digest = "digest" "=" entity-digest |
326 |
|
|
|
327 |
|
|
response-digest = <"> *LHEX <"> |
328 |
|
|
entity-digest = <"> *LHEX <"> |
329 |
|
|
LHEX = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | |
330 |
|
|
"8" | "9" | "a" | "b" | "c" | "d" | "e" | "f" |
331 |
|
|
|
332 |
|
|
|
333 |
|
|
The definitions of response-digest and entity-digest above indicate |
334 |
|
|
the encoding for their values. The following definitions show how the value |
335 |
|
|
is computed: |
336 |
|
|
|
337 |
|
|
response-digest = |
338 |
|
|
<"> < KD ( H(A1), unquoted nonce-value ":" H(A2) > <"> |
339 |
|
|
|
340 |
|
|
A1 = unquoted username-value ":" unquoted realm-value |
341 |
|
|
":" password |
342 |
|
|
password = < user's password > |
343 |
|
|
A2 = Method ":" digest-uri-value |
344 |
|
|
|
345 |
|
|
|
346 |
|
|
|
347 |
|
|
The "username-value" field is a "quoted-string" as specified in section |
348 |
|
|
2.2 of the HTTP/1.1 specification [2]. However, the surrounding quotation |
349 |
|
|
marks are removed in forming the string A1. Thus if the Authorization |
350 |
|
|
header includes the fields |
351 |
|
|
|
352 |
|
|
username="Mufasa", realm="myhost@testrealm.com" |
353 |
|
|
|
354 |
|
|
and the user Mufasa has password "CircleOfLife" then H(A1) would be |
355 |
|
|
H(Mufasa:myhost@testrealm.com:CircleOfLife) with no quotation marks in |
356 |
|
|
the digested string. |
357 |
|
|
|
358 |
|
|
No white space is allowed in any of the strings to which the digest |
359 |
|
|
function H() is applied unless that white space exists in the quoted |
360 |
|
|
strings or entity body whose contents make up the string to be |
361 |
|
|
digested. For example, the string A1 in the illustrated above must be |
362 |
|
|
Mufasa:myhost@testrealm.com:CircleOfLife with no white space on either |
363 |
|
|
side of the colons. Likewise, the other strings digested by H() must |
364 |
|
|
not have white space on either side of the colons which delimit their |
365 |
|
|
fields unless that white space was in the quoted strings or entity |
366 |
|
|
body being digested. |
367 |
|
|
|
368 |
|
|
"Method" is the HTTP request method as specified in section 5.1 of |
369 |
|
|
[2]. The "request-uri" value is the Request-URI from the request line |
370 |
|
|
as specified in section 5.1 of [2]. This may be "*", an "absoluteURL" |
371 |
|
|
or an "abs_path" as specified in section 5.1.2 of [2], but it MUST |
372 |
|
|
agree with the Request-URI. In particular, it MUST be an "absoluteURL" |
373 |
|
|
if the Request-URI is an "absoluteURL". |
374 |
|
|
|
375 |
|
|
The authenticating server must assure that the document designated |
376 |
|
|
by the "uri" parameter is the same as the document served. The |
377 |
|
|
purpose of duplicating information from the request URL in this |
378 |
|
|
field is to deal with the possibility that an intermediate proxy may |
379 |
|
|
alter the client's request. This altered (but presumably semantically |
380 |
|
|
equivalent) request would not result in the same digest as that |
381 |
|
|
calculated by the client. |
382 |
|
|
|
383 |
|
|
The optional "digest" field contains a digest of the entity body and |
384 |
|
|
some of the associated entity headers. This digest can be useful in |
385 |
|
|
both request and response transactions. In a request it can insure the |
386 |
|
|
integrity of POST data or data being PUT to the server. In a response |
387 |
|
|
it insures the integrity of the served document. The value of the |
388 |
|
|
"digest" field is an <entity-digest> which is defined as follows. |
389 |
|
|
|
390 |
|
|
entity-digest = <"> KD (H(A1), unquoted nonce-value ":" Method ":" |
391 |
|
|
date ":" entity-info ":" H(entity-body)) <"> |
392 |
|
|
; format is <"> *LHEX <"> |
393 |
|
|
|
394 |
|
|
date = = rfc1123-date ; see section 3.3.1 of [2] |
395 |
|
|
entity-info = H( |
396 |
|
|
digest-uri-value ":" |
397 |
|
|
media-type ":" ; Content-type, see section 3.7 of [2] |
398 |
|
|
*DIGIT ":" ; Content length, see 10.12 of [2] |
399 |
|
|
content-coding ":" ; Content-encoding, see 3.5 of [2] |
400 |
|
|
last-modified ":" ; last modified date, see 10.25 of [2] |
401 |
|
|
expires ; expiration date; see 10.19 of [2] |
402 |
|
|
) |
403 |
|
|
|
404 |
|
|
last-modified = rfc1123-date ; see section 3.3.1 of [2] |
405 |
|
|
expires = rfc1123-date |
406 |
|
|
|
407 |
|
|
|
408 |
|
|
The entity-info elements incorporate the values of the URI used to |
409 |
|
|
request the entity as well as the associated entity headers |
410 |
|
|
Content-type, Content-length, Content-encoding, Last-modified, and |
411 |
|
|
Expires. These headers are all end-to-end headers (see section TBS of [2]) |
412 |
|
|
which must not be modified by proxy caches. The "entity-body" is as |
413 |
|
|
specified by section 10.13 of [2] or RFC 1864. |
414 |
|
|
|
415 |
|
|
Note that not all entities will have an associated URI or all of |
416 |
|
|
these headers. For example, an entity which is the data of a |
417 |
|
|
POST request will typically not have a digest-uri-value or |
418 |
|
|
Last-modified or Expires headers. If an entity does not have a |
419 |
|
|
digest-uri-value or a header corresponding to one of the entity-info |
420 |
|
|
fields, then that field is left empty in the computation of |
421 |
|
|
entity-info. All the colons specified above are present, however. |
422 |
|
|
For example the value of the entity-info associated with POST data |
423 |
|
|
which has content-type "text/plain", no content-encoding and a length |
424 |
|
|
of 255 bytes would be H(:text/plain:255:::). Similarly a request may |
425 |
|
|
not have a "Date" header. In this case the date field of the |
426 |
|
|
entity-digest should be empty. |
427 |
|
|
|
428 |
|
|
In the entity-info and entity-digest computations, except for the |
429 |
|
|
blank after the comma in "rfc1123-date", there must be no white space |
430 |
|
|
between "words" and "tspecials", and exactly one blank between "words" |
431 |
|
|
(see section 2.2 of [2]). |
432 |
|
|
|
433 |
|
|
Implementors should be aware of how authenticated transactions |
434 |
|
|
interact with proxy caches. The HTTP/1.1 protocol specifies that when |
435 |
|
|
a shared cache (see section 13.10 of [2]) has received a request |
436 |
|
|
containing an Authorization header and a response from relaying that |
437 |
|
|
request, it MUST NOT return that response as a reply to any other |
438 |
|
|
request, unless one of two Cache-control (see TBS) directives was |
439 |
|
|
present in the response. If the original response included the |
440 |
|
|
``must-revalidate'' Cache-control directive, the cache MAY use the |
441 |
|
|
entity of that response in replying to a subsequent request, but MUST |
442 |
|
|
first revalidate it with the origin server, using the request headers |
443 |
|
|
from the new request to allow the origin server to authenticate the |
444 |
|
|
new request. Alternatively, if the original response included the |
445 |
|
|
``public'' Cache-control directive, the response entity MAY be |
446 |
|
|
returned in reply to any subsequent request. |
447 |
|
|
|
448 |
|
|
|
449 |
|
|
|
450 |
|
|
2.1.3 The AuthenticationInfo Header |
451 |
|
|
|
452 |
|
|
When authentication succeeds, the Server may optionally provide a |
453 |
|
|
Authentication-info header indicating that the server wants to |
454 |
|
|
communicate some information regarding the successful authentication |
455 |
|
|
(such as an entity digest or a new nonce to be used for the next |
456 |
|
|
transaction). It has two fields, digest and nextnonce. Both |
457 |
|
|
are optional. |
458 |
|
|
|
459 |
|
|
|
460 |
|
|
AuthenticationInfo = "Authentication-info" ":" |
461 |
|
|
1#( digest | nextnonce ) |
462 |
|
|
|
463 |
|
|
nextnonce = "nextnonce" "=" nonce-value |
464 |
|
|
|
465 |
|
|
digest = "digest" "=" entity-digest |
466 |
|
|
|
467 |
|
|
|
468 |
|
|
|
469 |
|
|
The optional digest allows the client to verify that the body |
470 |
|
|
of the response has not been changed en-route. The server would |
471 |
|
|
probably only send this when it has the document and can compute it. |
472 |
|
|
The server would probably not bother generating this header for CGI |
473 |
|
|
output. The value of the "digested-entity" is an <entity-digest> which |
474 |
|
|
is computed as described above. |
475 |
|
|
|
476 |
|
|
The value of the nextnonce parameter is the nonce the server wishes |
477 |
|
|
the client to use for the next authentication response. Note that |
478 |
|
|
either field is optional. In particular the server may send the |
479 |
|
|
Authentication-info header with only the nextnonce field as a means of |
480 |
|
|
implementing one-time nonces. If the nextnonce field is present the |
481 |
|
|
client is strongly encouraged to use it for the next WWW-Authenticate |
482 |
|
|
header. Failure of the client to do so may result in a request to |
483 |
|
|
re-authenticate from the server with the "stale=TRUE." |
484 |
|
|
|
485 |
|
|
|
486 |
|
|
|
487 |
|
|
|
488 |
|
|
|
489 |
|
|
2.2 Digest Operation |
490 |
|
|
|
491 |
|
|
Upon receiving the Authorization header, the server may check |
492 |
|
|
its validity by looking up its known password which corresponds to |
493 |
|
|
the submitted username. Then, the server must perform the same MD5 |
494 |
|
|
operation performed by the client, and compare the result to the |
495 |
|
|
given response-digest. |
496 |
|
|
|
497 |
|
|
Note that the HTTP server does not actually need to know the user's |
498 |
|
|
clear text password. As long as H(A1) is available to the server, |
499 |
|
|
the validity of an Authorization header may be verified. |
500 |
|
|
|
501 |
|
|
A client may remember the username, password and nonce values, so |
502 |
|
|
that future requests within the specified <domain> may include the |
503 |
|
|
Authorization header preemptively. The server may choose to accept the |
504 |
|
|
old Authorization header information, even though the nonce value |
505 |
|
|
included might not be fresh. Alternatively, the server could return a |
506 |
|
|
401 response with a new nonce value, causing the client to retry the |
507 |
|
|
request. By specifying stale=TRUE with this response, the server |
508 |
|
|
hints to the client that the request should be retried with the new |
509 |
|
|
nonce, without reprompting the user for a new username and password. |
510 |
|
|
|
511 |
|
|
The opaque data is useful for transporting state information around. |
512 |
|
|
For example, a server could be responsible for authenticating content |
513 |
|
|
which actually sits on another server. The first 401 response would |
514 |
|
|
include a domain field which includes the URI on the second server, |
515 |
|
|
and the opaque field for specifying state information. The client |
516 |
|
|
will retry the request, at which time the server may respond with a |
517 |
|
|
301/302 redirection, pointing to the URI on the second server. The |
518 |
|
|
client will follow the redirection, and pass the same Authorization |
519 |
|
|
header, including the <opaque> data which the second server may |
520 |
|
|
require. |
521 |
|
|
|
522 |
|
|
As with the basic scheme, proxies must be completely transparent in |
523 |
|
|
the Digest access authentication scheme. That is, they must forward |
524 |
|
|
the WWW-Authenticate, Authentication-info and Authorization headers |
525 |
|
|
untouched. If a proxy wants to authenticate a client before a request |
526 |
|
|
is forwarded to the server, it can be done using the Proxy- |
527 |
|
|
Authenticate and Proxy-Authorization headers described in section |
528 |
|
|
2.5 below.. |
529 |
|
|
|
530 |
|
|
|
531 |
|
|
2.3 Security Protocol Negotiation |
532 |
|
|
|
533 |
|
|
It is useful for a server to be able to know which security schemes a |
534 |
|
|
client is capable of handling. |
535 |
|
|
|
536 |
|
|
If this proposal is accepted as a required part of the HTTP/1.1 |
537 |
|
|
specification, then a server may assume Digest support when a client |
538 |
|
|
identifies itself as HTTP/1.1 compliant. |
539 |
|
|
|
540 |
|
|
It is possible that a server may want to require Digest as its |
541 |
|
|
authentication method, even if the server does not know that the |
542 |
|
|
client supports it. A client is encouraged to fail gracefully if the |
543 |
|
|
server specifies any authentication scheme it cannot handle. |
544 |
|
|
|
545 |
|
|
|
546 |
|
|
|
547 |
|
|
|
548 |
|
|
|
549 |
|
|
2.4 Example |
550 |
|
|
|
551 |
|
|
The following example assumes that an access-protected document is |
552 |
|
|
being requested from the server. The URI of the document is |
553 |
|
|
"http://www.nowhere.org/dir/index.html". Both client and server know |
554 |
|
|
that the username for this document is "Mufasa", and the password is |
555 |
|
|
"CircleOfLife". |
556 |
|
|
|
557 |
|
|
The first time the client requests the document, no Authorization |
558 |
|
|
header is sent, so the server responds with: |
559 |
|
|
|
560 |
|
|
HTTP/1.1 401 Unauthorized |
561 |
|
|
WWW-Authenticate: Digest realm="testrealm@host.com", |
562 |
|
|
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", |
563 |
|
|
opaque="5ccc069c403ebaf9f0171e9517f40e41" |
564 |
|
|
|
565 |
|
|
The client may prompt the user for the username and password, after |
566 |
|
|
which it will respond with a new request, including the following |
567 |
|
|
Authorization header: |
568 |
|
|
|
569 |
|
|
Authorization: Digest username="Mufasa", |
570 |
|
|
realm="testrealm@host.com", |
571 |
|
|
nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", |
572 |
|
|
uri="/dir/index.html", |
573 |
|
|
response="e966c932a9242554e42c8ee200cec7f6", |
574 |
|
|
opaque="5ccc069c403ebaf9f0171e9517f40e41" |
575 |
|
|
|
576 |
|
|
|
577 |
|
|
|
578 |
|
|
2.5 Proxy-Authentication and Proxy-Authorization |
579 |
|
|
|
580 |
|
|
The digest authentication scheme may also be used for authenticating |
581 |
|
|
users to proxies, proxies to proxies, or proxies to end servers by use |
582 |
|
|
of the Proxy-Authenticate and Proxy-Authorization headers. These headers |
583 |
|
|
are instances of the general Proxy-Authenticate and Proxy-Authorization |
584 |
|
|
headers specified in sections 10.30 and 10.31 of the HTTP/1.1 |
585 |
|
|
specification [2] and their behavior is subject to restrictions |
586 |
|
|
described there. The transactions for proxy authentication are very |
587 |
|
|
similar to those already described. Upon receiving a request which |
588 |
|
|
requires authentication, the proxy/server must issue the "HTTP/1.1 401 |
589 |
|
|
Unauthorized" header followed by a "Proxy-Authenticate" header of the |
590 |
|
|
form |
591 |
|
|
|
592 |
|
|
Proxy-Authentication = "Proxy-Authentication" ":" "Digest" |
593 |
|
|
digest-challenge |
594 |
|
|
|
595 |
|
|
where digest-challenge is as defined above in section 2.1. The |
596 |
|
|
client/proxy must then re-issue the request with a Proxy-Authenticate |
597 |
|
|
header of the form |
598 |
|
|
|
599 |
|
|
Proxy-Authorization = "Proxy-Authorization" ":" |
600 |
|
|
digest-response |
601 |
|
|
|
602 |
|
|
where digest-response is as defined above in section 2.1. When |
603 |
|
|
authentication succeeds, the Server may optionally provide a Proxy- |
604 |
|
|
Authentication-info header of the form |
605 |
|
|
|
606 |
|
|
Proxy-Authentication-info = "Proxy-Authentication-info" ":" nextnonce |
607 |
|
|
|
608 |
|
|
where nextnonce has the same semantics as the nextnonce field in the |
609 |
|
|
Authentication-info header described above in section 2.1. |
610 |
|
|
|
611 |
|
|
Note that in principle a client could be asked to authenticate itself |
612 |
|
|
to both a proxy and an end-server. It might receive an "HTTP/1.1 401 |
613 |
|
|
Unauthorized" header followed by both a WWW-Authenticate and a Proxy- |
614 |
|
|
Authenticate header. However, it can never receive more than one |
615 |
|
|
Proxy-Authenticate header since such headers are only for immediate |
616 |
|
|
connections and must not be passed on by proxies. If the client |
617 |
|
|
receives both headers, it must respond with both the Authorization and |
618 |
|
|
Proxy-Authorization headers as described above, which will likely |
619 |
|
|
involve different combinations of username, password, nonce, etc. |
620 |
|
|
|
621 |
|
|
|
622 |
|
|
3. Security Considerations |
623 |
|
|
|
624 |
|
|
Digest Authentication does not provide a strong authentication |
625 |
|
|
mechanism. That is not its intent. It is intended solely to replace |
626 |
|
|
a much weaker and even more dangerous authentication mechanism: Basic |
627 |
|
|
Authentication. An important design constraint is that the new |
628 |
|
|
authentication scheme be free of patent and export restrictions. |
629 |
|
|
|
630 |
|
|
Most needs for secure HTTP transactions cannot be met by Digest |
631 |
|
|
Authentication. For those needs SSL or SHTTP are more appropriate |
632 |
|
|
protocols. In particular digest authentication cannot be used for |
633 |
|
|
any transaction requiring encrypted content. Nevertheless many |
634 |
|
|
functions remain for which digest authentication is both useful and |
635 |
|
|
appropriate. |
636 |
|
|
|
637 |
|
|
|
638 |
|
|
3.1 Comparison with Basic Authentication |
639 |
|
|
|
640 |
|
|
Both Digest and Basic Authentication are very much on the weak end of |
641 |
|
|
the security strength spectrum. But a comparison between the two |
642 |
|
|
points out the utility, even necessity, of replacing Basic by Digest. |
643 |
|
|
|
644 |
|
|
The greatest threat to the type of transactions for which these |
645 |
|
|
protocols are used is network snooping. This kind of transaction |
646 |
|
|
might involve, for example, online access to a database whose use is |
647 |
|
|
restricted to paying subscribers. With Basic authentication an |
648 |
|
|
eavesdropper can obtain the password of the user. This not only |
649 |
|
|
permits him to access anything in the database, but, often worse, |
650 |
|
|
will permit access to anything else the user protects with the same |
651 |
|
|
password. |
652 |
|
|
|
653 |
|
|
By contrast, with Digest Authentication the eavesdropper only gets |
654 |
|
|
access to the transaction in question and not to the user's password. |
655 |
|
|
The information gained by the eavesdropper would permit a replay |
656 |
|
|
attack, but only with a request for the same document, and even that |
657 |
|
|
might be difficult. |
658 |
|
|
|
659 |
|
|
|
660 |
|
|
3.2 Replay Attacks |
661 |
|
|
|
662 |
|
|
A replay attack against digest authentication would usually be |
663 |
|
|
pointless for a simple GET request since an eavesdropper would |
664 |
|
|
already have seen the only document he could obtain with a replay. |
665 |
|
|
This is because the URI of the requested document is digested in the |
666 |
|
|
client response and the server will only deliver that document. By |
667 |
|
|
contrast under Basic Authentication once the eavesdropper has the |
668 |
|
|
user's password, any document protected by that password is open to |
669 |
|
|
him. A GET request containing form data could only be "replayed" |
670 |
|
|
with the identical data. However, this could be problematic if it |
671 |
|
|
caused a CGI script to take some action on the server. |
672 |
|
|
|
673 |
|
|
Thus, for some purposes, it is necessary to protect against replay |
674 |
|
|
attacks. A good digest implementation can do this in various ways. |
675 |
|
|
The server created "nonce" value is implementation dependent, but if |
676 |
|
|
it contains a digest of the client IP, a time-stamp, and a private |
677 |
|
|
server key (as recommended above) then a replay attack is not simple. |
678 |
|
|
An attacker must convince the server that the request is coming from |
679 |
|
|
a false IP address and must cause the server to deliver the document |
680 |
|
|
to an IP address different from the address to which it believes it |
681 |
|
|
is sending the document. An attack can only succeed in the period |
682 |
|
|
before the time-stamp expires. Digesting the client IP and time-stamp |
683 |
|
|
in the nonce permits an implementation which does not maintain state |
684 |
|
|
between transactions. |
685 |
|
|
|
686 |
|
|
For applications where no possibility of replay attack can be |
687 |
|
|
tolerated the server can use one-time response digests which will not |
688 |
|
|
be honored for a second use. This requires the overhead of the |
689 |
|
|
server remembering which digests have been used until the nonce |
690 |
|
|
time-stamp (and hence the digest built with it) has expired, but it |
691 |
|
|
effectively protects against replay attacks. Instead of maintaining a |
692 |
|
|
list of the values of used digests, a server would hash these values |
693 |
|
|
and require re-authentication whenever a hash collision occurs. |
694 |
|
|
|
695 |
|
|
An implementation must give special attention to the possibility of |
696 |
|
|
replay attacks with POST and PUT requests. A successful replay attack |
697 |
|
|
could result in counterfeit form data or a counterfeit version of a |
698 |
|
|
PUT file. The use of one-time digests or one-time nonces is |
699 |
|
|
recommended. It is also recommended that the optional <digest> be |
700 |
|
|
implemented for use with POST or PUT requests to assure the integrity |
701 |
|
|
of the posted data. Alternatively, a server may choose to allow |
702 |
|
|
digest authentication only with GET requests. Responsible server |
703 |
|
|
implementors will document the risks described here as they pertain to |
704 |
|
|
a given implementation. |
705 |
|
|
|
706 |
|
|
|
707 |
|
|
3.3 Man in the Middle |
708 |
|
|
|
709 |
|
|
Both Basic and Digest authentication are vulnerable to "man in the |
710 |
|
|
middle" attacks, for example, from a hostile or compromised proxy. |
711 |
|
|
Clearly, this would present all the problems of eavesdropping. But |
712 |
|
|
it could also offer some additional threats. |
713 |
|
|
|
714 |
|
|
A simple but effective attack would be to replace the Digest challenge |
715 |
|
|
with a Basic challenge, to spoof the client into revealing their |
716 |
|
|
password. To protect against this attack, clients should remember if a |
717 |
|
|
site has used Digest authentication in the past, and warn the user if |
718 |
|
|
the site stops using it. It might also be a good idea for the browser |
719 |
|
|
to be configured to demand Digest authentication in general, or from |
720 |
|
|
specific sites. |
721 |
|
|
|
722 |
|
|
Or, a hostile proxy might spoof the client into making a request the |
723 |
|
|
attacker wanted rather than one the client wanted. Of course, this is |
724 |
|
|
still much harder than a comparable attack against Basic |
725 |
|
|
Authentication. |
726 |
|
|
|
727 |
|
|
There are several attacks on the "digest" field in the |
728 |
|
|
Authentication-info header. A simple but effective attack is just to |
729 |
|
|
remove the field, so that the client will not be able to use it to |
730 |
|
|
detect modifications to the response entity. Sensitive applications |
731 |
|
|
may wish to allow configuration to require that the digest field be |
732 |
|
|
present when appropriate. More subtly, the attacker can alter any of |
733 |
|
|
the entity-headers not incorporated in the computation of the digest, |
734 |
|
|
The attacker can alter most of the request headers in the client's |
735 |
|
|
request, and can alter any response header in the origin-server's |
736 |
|
|
reply, except those headers whose values are incorporated into the |
737 |
|
|
"digest" field. |
738 |
|
|
|
739 |
|
|
Alteration of Accept* or User-Agent request headers can only result |
740 |
|
|
in a denial of service attack that returns content in an unacceptable |
741 |
|
|
media type or language. Alteration of cache control headers also can |
742 |
|
|
only result in denial of service. Alteration of Host will be detected, |
743 |
|
|
if the full URL is in the response-digest. Alteration of Referer or |
744 |
|
|
From is not important, as these are only hints. |
745 |
|
|
|
746 |
|
|
3.4 Spoofing by Counterfeit Servers |
747 |
|
|
|
748 |
|
|
Basic Authentication is vulnerable to spoofing by counterfeit |
749 |
|
|
servers. If a user can be led to believe that she is connecting to a |
750 |
|
|
host containing information protected by a password she knows, when in |
751 |
|
|
fact she is connecting to a hostile server, then the hostile server |
752 |
|
|
can request a password, store it away for later use, and feign an |
753 |
|
|
error. This type of attack is more difficult with Digest |
754 |
|
|
Authentication -- but the client must know to demand that Digest |
755 |
|
|
authentication be used, perhaps using some of the techniques described |
756 |
|
|
above to counter "man-in-the-middle" attacks. |
757 |
|
|
|
758 |
|
|
|
759 |
|
|
3.5 Storing passwords |
760 |
|
|
|
761 |
|
|
Digest authentication requires that the authenticating agent (usually |
762 |
|
|
the server) store some data derived from the user's name and password |
763 |
|
|
in a "password file" associated with a given realm. Normally this |
764 |
|
|
might contain pairs consisting of username and H(A1), where H(A1) is |
765 |
|
|
the digested value of the username, realm, and password as described |
766 |
|
|
above. |
767 |
|
|
|
768 |
|
|
The security implications of this are that if this password file is |
769 |
|
|
compromised, then an attacker gains immediate access to documents on |
770 |
|
|
the server using this realm. Unlike, say a standard UNIX password |
771 |
|
|
file, this information need not be decrypted in order to access |
772 |
|
|
documents in the server realm associated with this file. On the |
773 |
|
|
other hand, decryption, or more likely a brute force attack, would be |
774 |
|
|
necessary to obtain the user's password. This is the reason that the |
775 |
|
|
realm is part of the digested data stored in the password file. It |
776 |
|
|
means that if one digest authentication password file is compromised, |
777 |
|
|
it does not automatically compromise others with the same username |
778 |
|
|
and password (though it does expose them to brute force attack). |
779 |
|
|
|
780 |
|
|
There are two important security consequences of this. First the |
781 |
|
|
password file must be protected as if it contained unencrypted |
782 |
|
|
passwords, because for the purpose of accessing documents in its |
783 |
|
|
realm, it effectively does. |
784 |
|
|
|
785 |
|
|
A second consequence of this is that the realm string should be |
786 |
|
|
unique among all realms which any single user is likely to use. In |
787 |
|
|
particular a realm string should include the name of the host doing |
788 |
|
|
the authentication. The inability of the client to authenticate the |
789 |
|
|
server is a weakness of Digest Authentication. |
790 |
|
|
|
791 |
|
|
|
792 |
|
|
3.6 Summary |
793 |
|
|
|
794 |
|
|
By modern cryptographic standards Digest Authentication is weak. But |
795 |
|
|
for a large range of purposes it is valuable as a replacement for |
796 |
|
|
Basic Authentication. It remedies many, but not all, weaknesses of |
797 |
|
|
Basic Authentication. Its strength may vary depending on the |
798 |
|
|
implementation. In particular the structure of the nonce (which is |
799 |
|
|
dependent on the server implementation) may affect the ease of |
800 |
|
|
mounting a replay attack. A range of server options is appropriate |
801 |
|
|
since, for example, some implementations may be willing to accept the |
802 |
|
|
server overhead of one-time nonces or digests to eliminate the |
803 |
|
|
possibility of replay while others may satisfied with a nonce like |
804 |
|
|
the one recommended above restricted to a single IP address and with |
805 |
|
|
a limited lifetime. |
806 |
|
|
|
807 |
|
|
The bottom line is that *any* compliant implementation will be |
808 |
|
|
relatively weak by cryptographic standards, but *any* compliant |
809 |
|
|
implementation will be far superior to Basic Authentication. |
810 |
|
|
|
811 |
|
|
|
812 |
|
|
|
813 |
|
|
4. Acknowledgments |
814 |
|
|
|
815 |
|
|
In addition to the authors, valuable discussion instrumental in |
816 |
|
|
creating this document has come from Peter J. Churchyard, Ned Freed, |
817 |
|
|
and David M. Kristol. |
818 |
|
|
|
819 |
|
|
|
820 |
|
|
5. References |
821 |
|
|
|
822 |
|
|
[1] T. Berners-Lee, R. T. Fielding, H. Frystyk Nielsen. |
823 |
|
|
"Hypertext Transfer Protocol -- HTTP/1.0" |
824 |
|
|
Internet-Draft (work in progress), UC Irvine, |
825 |
|
|
<URL:http://ds.internic.net/internet-drafts/ |
826 |
|
|
draft-ietf-http-v10-spec-00.txt>, March 1995. |
827 |
|
|
|
828 |
|
|
[2] T. Berners-Lee, R. T. Fielding, H. Frystyk Nielsen... |
829 |
|
|
"Hypertext Transfer Protocol -- HTTP/1.1" |
830 |
|
|
TBS |
831 |
|
|
|
832 |
|
|
|
833 |
|
|
[3] RFC 1321. R.Rivest, "The MD5 Message-Digest Algorithm", |
834 |
|
|
<URL:http://ds.internic.net/rfc/rfc1321.txt>, |
835 |
|
|
April 1992. |
836 |
|
|
|
837 |
|
|
|
838 |
|
|
|
839 |
|
|
|
840 |
|
|
6. Authors Addresses |
841 |
|
|
|
842 |
|
|
John Franks |
843 |
|
|
john@math.nwu.edu |
844 |
|
|
Professor of Mathematics |
845 |
|
|
Department of Mathematics |
846 |
|
|
Northwestern University |
847 |
|
|
Evanston, IL 60208-2730, USA |
848 |
|
|
|
849 |
|
|
Phillip M. Hallam-Baker |
850 |
|
|
hallam@w3.org |
851 |
|
|
European Union Fellow |
852 |
|
|
CERN |
853 |
|
|
Geneva |
854 |
|
|
Switzerland |
855 |
|
|
|
856 |
|
|
Jeffery L. Hostetler |
857 |
|
|
jeff@spyglass.com |
858 |
|
|
Senior Software Engineer |
859 |
|
|
Spyglass, Inc. |
860 |
|
|
3200 Farber Drive |
861 |
|
|
Champaign, IL 61821, USA |
862 |
|
|
|
863 |
|
|
Paul J. Leach |
864 |
|
|
paulle@microsoft.com |
865 |
|
|
Microsoft Corporation |
866 |
|
|
1 Microsoft Way |
867 |
|
|
Redmond, WA 98052, USA |
868 |
|
|
|
869 |
|
|
Ari Luotonen |
870 |
|
|
luotonen@netscape.com |
871 |
|
|
Member of Technical Staff |
872 |
|
|
Netscape Communications Corporation |
873 |
|
|
501 East Middlefield Road |
874 |
|
|
Mountain View, CA 94043, USA |
875 |
|
|
|
876 |
|
|
Eric W. Sink |
877 |
|
|
eric@spyglass.com |
878 |
|
|
Senior Software Engineer |
879 |
|
|
Spyglass, Inc. |
880 |
|
|
3200 Farber Drive |
881 |
|
|
Champaign, IL 61821, USA |
882 |
|
|
|
883 |
|
|
Lawrence C. Stewart |
884 |
|
|
stewart@OpenMarket.com |
885 |
|
|
Open Market, Inc. |
886 |
|
|
215 First Street |
887 |
|
|
Cambridge, MA 02142, USA |
888 |
|
|
|
889 |
|
|
|
890 |
|
|
|
891 |
|
|
|