Hard passwords
I quite dislike when sites try to impose what kind of password I should use, but it all depends on the site... however, sites should always enforce an absolute minimum password quality (at least 6-8 chars, different from username)
Storing passwords:
As said in first reply, store passwords using a one-way hash function. to compare them just hash the password again.
For better security when storing the hashed passwords, prepend a "salt" string to them:
instead of storing sha1("password"), store sha1("somesalt":"password").
This will makes password cracking exponentially harder if by some chance the hash is obtained by a malicious user, and in a way eases the need for strong passwords.
Forgotten password requests
To handle password requests, create a new password token and send a "regenerate password" link to the requesting user's email. when such link is accessed, create (or allow user to choose) a new password, and invalidate (delete) the token.
Also, tokens should not be guessable or brute-forced (use at least 8 random hex/base64 chars)
Other
Obviously, every security aspect will fall back to the weakest link so specific implementation details should take security in account, like using https for logins, etc...