Não sem SSL
Isso não é seguro se a senha for enviada pela rede em texto sem formatação. Hashing da senha no lado do servidor também não é seguro se a senha for enviada pela rede em texto sem formatação.
Como a <input type="password"/>
tag HTML envia seu conteúdo em texto sem formatação, isso será um problema, independentemente de como você armazena a senha no servidor, a menos que o site use SSL para transmitir a senha.
(A autenticação HTTP, que abre uma caixa de diálogo no navegador solicitando uma senha, pode ou não ser um texto não criptografado, dependendo de quais mecanismos de autenticação o servidor e o navegador têm em comum. Portanto, isso pode ser uma maneira de evitar isso sem usar SSL.)
Não se os administradores do site forem suspeitos
Agora, supondo que você esteja usando HTTPS para fazer o site, isso pode ser seguro se você confiar nos administradores do site (que podem ler senhas em texto sem formatação) e em outras pessoas que têm acesso à máquina para se comportarem corretamente. Agora, pode ser óbvio que eles podem fazer o que quiserem com seu site (uma vez que o administram), mas, se puderem ler a senha, também poderão usar os pares de login / senha roubados nos sites de outras pessoas.
Uma maneira de manter as senhas protegidas do administrador
Uma maneira segura de armazenar e verificar senhas é a seguinte:
def change_password user, new_password
salt = random(65536).to_s(16) #will be 4 characters long
password_hash = salt + hash(salt + new_password)
store(user,password_hash)
end
def does_password_match? user, entered_password
correct_password_hash = retrieve(user)
salt = correct_password_hash[0...4]
entered_password_hash = salt + hash(salt + entered_password)
return correct_password_hash == entered_password_hash
end
Para a função hash, tente usar algo forte e algo que ainda não tenha boas tabelas de arco-íris. Você pode alterar o comprimento do sal, se necessário, contornar as tabelas do arco-íris.
Dependendo do ambiente em que você está, da variabilidade na latência da rede e se os nomes de usuário devem ser conhecidos publicamente, convém ter outro caminho de código computado hash('0000'+entered_password)
se o usuário não existir, para impedir que invasores determinar quais nomes de usuário são válidos com base no tempo que leva para determinar se a senha está incorreta.