Senha em texto simples por HTTPS

90

Atualmente estou trabalhando em um provedor PHP OpenID que funcionará em HTTPS (portanto, criptografado com SSL).
É errado transmitir a senha em texto simples? HTTPS em teoria, não pode ser interceptado, então não vejo nada de errado. Ou isso é inseguro em algum nível e não estou conseguindo ver isso?

WhyNotHugo
fonte

Respostas:

126

É seguro. É assim que toda a web funciona. Todas as senhas em formulários são sempre enviadas em texto simples, portanto, cabe ao HTTPS protegê-lo.

Eduardo scoz
fonte
20
Pequenos detalhes: alguns formulários de login usam JavaScript para hash a senha em vez de enviá-la em texto simples.
Thorarin
5
@Thorarin se eles realmente fizerem hash, significa que o servidor está armazenando a senha em texto simples para que possa fazer hash com o mesmo sal para verificar. Ick! Enviar a senha em texto embrulhado SSL é melhor, pois o servidor não precisa armazenar a senha em texto simples.
DGM
11
@DGM: hashing duplo também é uma opção, portanto, as senhas em texto simples não são estritamente necessárias.
Thorarin
3
@Denis: o hashing do lado do cliente não ajuda muito. Pode tornar as coisas um pouco mais difíceis do que texto simples, mas alguém que realmente deseja roubar uma senha pode fazer isso sem problemas. Só funcionaria com segurança se você enviar pelo menos um token único por meio de um canal seguro (ssl); nesse caso, você também pode enviar a senha em SSL para começar.
Eduardo Scoz
4
Só estou dizendo que o Yahoo sentiu que o hashing do lado do cliente era seguro o suficiente até que eles pudessem se dar ao luxo de migrar para SSL. Mas ei, eu sou totalmente a favor de https :)
Denis
73

Você ainda precisa certificar-se de enviá-lo via solicitação POST, não GET. Se você enviá-lo por meio de uma solicitação GET, ele pode ser salvo em texto simples nos registros de histórico do navegador do usuário ou nos registros de acesso do servidor web.

ninguém
fonte
7
Sim, eu sabia, mas ainda é um bom comentário para deixar para os outros que vierem procurar aqui. :)
WhyNotHugo
ou enviá-lo em um cabeçalho
James
22

Se o HTTP estiver desabilitado e você usar apenas HTTPS, então você não está realmente transmitindo a senha como texto simples.

Can Berk Güder
fonte
4
No entanto, o servidor faz ter acesso à sua senha de texto, eles podem armazená-lo como texto simples, registrá-lo incorretamente como texto simples etc. Ou seja, sua senha não ficar no lado do cliente, o servidor também vê exatamente o que é.
xref
12

Hash do lado do cliente. Por quê? Deixe-me contar sobre um pequeno experimento. Vá até o computador no refeitório da empresa. Abra o navegador para acessar a página de login do site da empresa (https). Pressione F12, clique na guia de rede, marque o log de persistência, minimize o console, mas deixe a página da web aberta para a página de login. Sente-se e almoce. Observe o funcionário depois que ele se conecta ao site da empresa e, sendo um bom trabalhador, faz o logout ao terminar. Termine o almoço, sente-se no computador, abra a guia de rede e veja cada nome de usuário e senha em texto simples no corpo do formulário.

Sem ferramentas especiais, sem conhecimento especial, sem hardware sofisticado de hackers, sem keyloggers, apenas o bom e velho F12.

Mas ei, continue pensando que tudo que você precisa é SSL. Os bandidos vão adorar você por isso.

CodeDog
fonte
6
Seu comentário na cafeteria não faz nenhum sentido, não importa o quanto eu o reli. Por que as pessoas simplesmente iriam até um computador e digitariam suas credenciais? O que você está tentando provar? Além disso, o hashing não tornará isso mais inseguro, de forma alguma. Era comum fazer hash de senhas e transmiti-las por HTTP de texto simples quando esta pergunta foi escrita, em 2009.
WhyNotHugo
4
Eu votei positivamente em ambas porque, sim, a resposta aceita está sendo lida muitos anos depois. Seria bom se @CodeDog apontasse para alguma estratégia de mitigação. E sim, as pessoas irão apenas até PCs aleatórios, por exemplo, na biblioteca local, e inserir seus dados!
JoeAC
3
Eu criptografo as senhas do lado do cliente com uma chave pública e, a seguir, posto apenas a senha criptografada no formulário. É uma chave assimétrica, portanto, ter a chave pública do lado do cliente é inútil para os invasores. A cada log, ele gera um novo par de chaves, portanto, os ataques de repetição também não funcionam. A chave muda até mesmo nas tentativas de login falhadas. Os pares de chaves são gerados no lado do servidor quando os usuários chegam na tela de login. Apenas a chave pública é fornecida ao código do lado do cliente.
CodeDog
Aliás, eu vi esse hack sendo usado em um business center de hotel pela equipe para coletar senhas para números de quartos. Eles usariam a senha para entrar no wireless e usar os PCs do business center e a cobrança seria feita no quarto.
CodeDog
Eu mesmo realizei esse experimento logando em minha conta bancária e devo concordar com @CodeDog - a carga útil da solicitação inclui meu login e senha em texto simples.
Artur Michajluk
6

Vamos fazer algumas anotações sobre as respostas anteriores.

Primeiro, provavelmente não é a melhor ideia usar algoritmos de hash no lado do cliente. Se sua senha for salted no lado do servidor, você não será capaz de comparar hashes (pelo menos não se você não armazenar o hash do cliente no banco de dados em uma das camadas de hash da senha, que é a mesma ou pior). E você não quer implementar o algoritmo de hash usado pelo banco de dados no lado do cliente, seria bobagem.

Em segundo lugar, a troca de chaves criptográficas também não é ideal. O MITM poderia teoricamente (considerando que ele tem um certificado raiz instalado no cliente) alterar as chaves criptográficas e alterar com suas próprias chaves:

Conexão original (sem considerar tls) de um servidor teórico que troca chaves:

Cliente solicita chaves públicas> servidor mantém as chaves privadas, gere chaves públicas para cliente> servidor envia chaves públicas para cliente

Agora, em uma abordagem teórica do MITM:

Cliente solicita chaves públicas> MITM gera chaves privadas falsas > Servidor mantém as chaves privadas, gera chaves públicas para o cliente> MITM recebe as chaves públicas do servidor original, agora, estamos livres para enviar nossas chaves públicas falsas para o cliente, e sempre que uma solicitação vier do cliente, iremos descriptografar os dados do cliente com as chaves falsas, alterar a carga útil (ou lê-la) e criptografar com as chaves públicas originais > MITM envia chaves públicas falsas para o cliente.

Esse é o ponto de ter um certificado de CA confiável em TLS e é assim que você recebe uma mensagem do navegador avisando se o certificado não é válido.

Em resposta ao OP: na minha humilde opinião você não pode fazer isso, porque mais cedo ou mais tarde alguém vai querer atacar um usuário do seu serviço e vai tentar quebrar o seu protocolo.

O que você pode fazer, no entanto, é implementar 2FA para evitar que as pessoas tentem fazer login com a mesma senha. Alerta para ataques de repetição, no entanto.

Não sou muito bom com criptografia, corrija-me se estiver errado.

Lucca Ferri
fonte
Lembre-se de que esta discussão é de 2009. Essas eram praticamente as melhores práticas na época.
WhyNotHugo
3
@WhyNotHugo estou ciente. Decidi deixar uma resposta porque a principal resposta do google para essa pergunta me trouxe até aqui, então por que não.
Lucca Ferri
4

Os outros pôsteres estão corretos. Agora que você está usando SSL para criptografar a transmissão da senha, certifique-se de fazer o hash com um bom algoritmo e salt para que fique protegido quando estiver em repouso também ...

Grossvogel
fonte
Sim, eu sei disso, obrigado, estava apenas me referindo à transmissão aqui.
WhyNotHugo
0

O exemplo de @CodeDog tem problemas ..

Sim, posso acreditar que os usuários farão login em uma caixa de cafeteria. Se você está capturando logs de uma cafeteria corporativa, você é a falha de segurança. Caixas de cafeterias corporativas devem ser configuradas desabilitadas, por exemplo, sem termos, sem loggers, sem acesso remoto, etc. Para prevenir você, o hacker interno.

O exemplo é um bom exemplo de segurança de acesso ao computador, e não está realmente relacionado à segurança de rede. É fornecido como justificativa para o hashing do lado do cliente, mas se você tiver acesso ao computador, pode simplesmente usar um registrador de pressionamento de tecla e ignorá-lo. O hash do lado do cliente é novamente irrelevante. O exemplo de @CodeDog é um hack de acesso ao computador e requer técnicas diferentes dos hacks da camada de rede.

Além disso, um hack de computador público é protegido ao incapacitar o sistema de ameaças, conforme mencionado acima. por exemplo, use um Chromebook para um computador público de cafeteria Mas isso é contornado por um hack físico . Durante as horas de folga, vá até a cafeteria e configure uma câmera secreta para gravar os pressionamentos do teclado pelos usuários. Então não importa se o computador da cafeteria está danificado OU que tipo de criptografia é usada.

camada física -> camada do computador -> camada do cliente -> camada de rede -> camada do servidor

Para rede, não importa se você hash no lado do cliente, porque a camada https / ssl criptografará o passwd simples. Portanto, como outros mencionam, o hashing do cliente é redundante se o TLS for seguro.

ramakarl
fonte
1
Embora faça bons pontos, você está respondendo a uma resposta (que por si só não é relevante para a pergunta feita), portanto, não é realmente apropriado para o modelo de perguntas e respostas do Stackoverflow.
Martin