A maneira usual de armazenar a senha é usar uma função de hash na senha, mas sal isso de antemão. É importante "saltar" a senha, para se defender da rainbow table ataques.
Então sua tabela deve ser algo assim
._______._________________.______________.
|user_id|hash |salt |
|-------|-----------------|--------------|
|12 |[email protected]|13%!#tQ!#3t...|
| |... |... |
Ao verificar se uma determinada senha corresponde a um usuário, você deve concatenar o salt para a senha fornecida e calcular a função de hash da string de resultado. Se a saída da função hash corresponder ao
hash
coluna - é a senha correta. É importante entender, no entanto, que a ideia do salt-hash tem uma razão específica - para evitar que qualquer pessoa com acesso ao banco de dados saiba a senha de qualquer pessoa (é considerado um problema difícil reverter uma saída de função hash). Assim, por exemplo, o DBA do banco, não conseguiria fazer login na sua conta bancária, mesmo que tenha acesso a todas as colunas.
Você também deve considerar usá-lo se achar que seus usuários usarão uma senha confidencial (por exemplo, a senha da conta do Gmail) como senha para seu site.
IMHO nem sempre é um recurso de segurança necessário. Então você deve pensar se você quer ou não.
Veja este artigo para um bom resumo deste mecanismo.
Atualização: Vale ressaltar que, para segurança extra contra ataques direcionados para reverter o hash da senha individual, você deve usar bcrypt , que pode ser arbitrariamente difícil de calcular. (Mas a menos que você esteja realmente com medo do misterioso homem de preto visando seu banco de dados específico, acho que sha1 é bom o suficiente. Eu não introduziria outra dependência para meu projeto para essa segurança extra. Dito isso, não há razão para não usar sha1 100 vezes, o que daria um efeito semelhante).