Consider this approach:
Let H be a hashing function and p be the users password. In the database you store a nounce n, and H(H(p⊕n)). When authenticating the server sends n, and client responds with x=H(p⊕n). Now server can compute H(x) and compare with the stored value to authenticate the client. Finally, after it has been authenticated, the client generates a new nounce n', and sends H(H(p⊕n')) and n' to the server, which is stored in the database for the next log in.
Replace the outer H with a proper key derivation function for extra credits.
This avoids sending any secret value over to the server, so no server side logging will cause a problem.
Replace the outer H with a proper key derivation function for extra credits.
This avoids sending any secret value over to the server, so no server side logging will cause a problem.