|No such thing as a small change|
In addition to the great info that tinman has provided, a semi-popular way of making doing this is called S/Key.
With S/Key, the person makes a request to the server, the server makes a challenge to them based on the number of S/Key challenges and a secret that they have already securely put into the machine to begin with. Using this secure secret information and the sequence number, the S/Key challenge is calculated by the server. The client then enters the S/Key challenge and the shared secret into their S/Key calculator (several are available as open source), which generates the response to their challenge.
If they respond correctly, the server authenticates them. If not, it doesn't.
This is one of many shared-secret types of authentication. Pretty nifty, too. The downside is, there has to be a way of getting the secret securely to you, and storing it securely which may present unique challenges all of their own.
If you're interested still, an implementation of S/Key called OPIE (Onetime Passwords In Everything) has Perl modules available on CPAN called Authen::OPIE. Give it a look. :)
Hope this helps!
-><- -><- -><- -><- -><- All things are Perfect To every last Flaw And bound in accord With Eris's Law - HBT; The Book of Advice, 1:7
Update: Fixed link...