Ensuring that someone seeking to use some computer service is actually who they claim to be, or that the provider of
the service is actually who it claims to be. Such schemes work with a shared secret such as a password or a private key.
In some schemes, the actual secret need not be exchanged, just proof that other end knows the secret, e.g. by encrypting
a random message with the private key. You can do web authentication with basic authentication where the browser brings
up a dialog box for user name and password, form-based where the user fills in a form with username and password and
perhaps other information, certificate based where the browser presents an X.509 certificate to the server to request
access, and digest authorisation where the password is digested before being sent to the server to avoid it being
snooped on.
Basic Scheme Authentication
when your Applet or JWS application tries to access something restricted on the server it gets a message back from the
server telling it the realm (domain or subdomain) and the name of the password scheme the server wants to use, e.g.
basic or digest. Your Applet then retries the request embedding the userid and password information in the requested way.
In Java 1.2+, in your client code, you can use the java.net.Authenticator class to handle
the details. You extend the class overriding the getPasswordAuthentication method like this:
Then you then register your custom Authenticator with
import java.net.Authenticator;
Authenticator.setDefault( new MyAuthenticator() );
You then do your GETs ignoring logons! Your Authenticator magically kicks in when
needed and logs you in to the server. See the File I/O amanuensis or
the CMP HTTP package for how. The technique reputedly works for HTTP and proxies.
It may work for HTTPS. It even works for digest passwords. I don’t see how it could work for certificate style
authentication, however, but who knows…
JDK 1.1-
If you are using an older Java, you will have to do it the Smith-Barney way (obscure reference to the late John Houseman):
Digest Scheme Authentication
For the more secure digest-style authentication, the protocol is more complex. It requires nine subfields. It is
described in RFC 2617. Java Authenticator uses this method when the server
specifies scheme= "digest". It works by sending an MD5
digest with each transaction, and changing the digest periodically. Your Applet
does not need to get involved with the details of how it works. Authenticator handles it all
transparently. You can fine tune how it works with networking properties:
http.auth.digest.validateServer=false
http.auth.digest.validateProxy=false
http.auth.digest.cnonceRepeat=5
Sun does not document which schemes Authenticator supports. It may support others besides basic,
digest and ntlm. It does not work with cookies.
Under the Hood
You might wonder how after the login is complete that the server can tell if messages coming in from the Internet are
from people who are already logged in. There are a number of ways of doing it. Some you might think would work don’t.
- By IP. You might think the server could just check if an IP in a message header was from someone logged in. This does
not work because IPs are shared. Everyone in your home on the LAN, when the access the Internet comes from the same IP,
the IP of your router.
- By TCP/IP session. You might think the server would just check that the message came in on the same TCP/IP session as
the user logged in on. This won’t work since you often connect with multiple sessions, and you would not want to
have to relogin just because a session tanked.
- Basic. The server sends you id/password with every request that is restricted. This method is not secure since the id/password
pair is in plain text for any snoop to see.
- NTLM. This is a Microsoft proprietary protocol than will only work with Microsoft servers and clients. I don’t
know how it works. Java supports it.
- By Cookie. The server sends a cookie at login time, and the user includes this cookie with each message to the server.
This method is not secure since anyone snooping can spoof the user by just copying the invariant cookie. Further, the
client’s browser must be configured to accept cookies, a practice which invites all manner of malicious spying.
- URL rewriting. The server sends unique URLs to different users. When they come back the server knows they could only
have come from the client they were sent to.
- By HTTP auth digest. RFC 2617 Here each incoming message is digitally signed in an unforgeable way. The
disadvantage of this approach is it takes a bit more CPU time to compute the digests and requires the more transmission
overhead. The advantage is it is the most secure method without resorting to a fully encrypted data stream.
Learning More
Sun’s Javadoc on the
Authenticator class : available:
Sun’s Javadoc on the
PasswordAuthentication class : available: