Reputation: 15782
How does Digest Authentication differ from Basic Authentication other than sending credentials as plain text?
Upvotes: 145
Views: 151224
Reputation: 3973
The main difference is that it doesn't require sending the username and password across the wire in plaintext. It is also immune to replay-attacks, as it uses a one-time number from the server.
The server gives the client a one-time use number (a nonce) that it combines with the username, realm, password and the URI request. The client runs all of those fields through an MD5 hashing method to produce a hash key.
It sends this hash key to the server along with the username and the realm to attempt to authenticate.
Server-side the same method is used to generate a hashkey, only instead of using the password typed in to the browser the server looks up the expected password for the user from its user DB. It looks up the stored password for this username, runs in through the same algorithm and compares it to what the client sent. If they match then access is granted, otherwise it can send back a 401 Unauthorized (no login or failed login) or a 403 Forbidden (access denied).
Digest authentication is standardized in RFC2617. There's a nice overview of it on Wikipedia:
You can think of it like this:
Upvotes: 244
Reputation: 31
The only way to get the hash HA1 of the credentials is to know the password. The server knows HA1 but not the password that generated it. If HA1 was known to an attacker it could get in to the system. So it is not sent down the wire. A further hash based on nonce, etc. is done before doing this, and this must agree with a similar calculation done on the server. Thus, as long as the server keeps HA1 private the system is secure.
Upvotes: 3
Reputation: 117017
A hash of the credentials is sent over the wire.
HA1 = MD5(username:realm:password)
Wikipedia has an excellent article on this topic
Upvotes: 19