My understanding is as follows:
To securely store a password (e.g. in a database), you use a hashing algorithm designed for this purpose (designed to be slow, e.g. bcrypt), and you use a unique salt for each password. This makes it hard/slow for an attacker with access to the database to recover passwords, because they can't use a rainbow table, and each brute force attempt takes more time than a simple md5 or sha1.
To securely authenticate a password over a plain text protocol (i.e. not SSL), the server sends the client a nonce, and the client combines the password, and the nonce (and maybe also a timestamp), runs a hashing algorithm on them, and transmits that hash to the server, who runs the same algorithm and compares. This avoids sending the password in plain text, and also makes replay attacks impossible, as long as the server can't be tricked into accepting the same nonce twice.
The problem is, for the authentication part of this the server needs to know the actual plaintext password. So you can't store them securely as in #1.
Now, the server could transmit the salt to the client, and the client could calculate the salted, hashed password first and then do #2. But then the salted-hashed password effectively becomes the plaintext password, and so you still don't really have #1.
So my question is, is there a way to do both #1 and #2?