I am wondering, why web sites do not use one-time passwords generated by hash chain. By that I mean that a client chooses a secret and after being salted, he applies some secure hash function F() on it n times (e.g. n=1000000) in a row.
F(salted secret,n)=F(F(F(...F(salted secret)...)))).
Client then sends the result and the name of the hash function to the server in a secure way.
Then, when he needs to authenticate himself against the server, he applies hash function n-1 times on a his secret in a row F(salted secret,n-1) and use this hash as a one time password for the log in process. The server authenticates the client only if F(F(salted secret, n-1)) == F(secret, n). Next time, the process repeats itself for n-2...