Qual é a melhor maneira de enviar dados de autenticação formulário web através de HTTP?

StackOverflow https://stackoverflow.com/questions/715348

  •  23-08-2019
  •  | 
  •  

Pergunta

A empresa que eu sei está em negociações para firmar sua política de segurança de senha em todos os seus produtos de aplicação web.

Agora que eles estão enviando a autenticação de usuário / senha em formas POST através de HTTP, e assim, eles estão sendo enviados texto simples.

A solução mais simples para o problema é simplesmente para exigir HTTPS para logon em todos os nossos aplicativos, certo?

Bem, há alguma discussão interna sobre em vez de fazer algum tipo de criptografia roll-a-próprio do lado do cliente de senhas (+ sal senha, etc.).

Existe uma solução HTTP-only aceito?

As opiniões são como ... bem, todo mundo tem uma opinião, então eu estou olhando para a literatura de segurança credível que possa apoiar a sua recomendação. Não apenas google e me mandar para um post ... Eu já fiz isso e ainda mais.

Eu encontrei recomendações do OWASP: http://www.owasp.org/index.php/Top_10_2007-A7# proteção

Assim como Microsoft de: http://msdn.microsoft.com/en-us/library/aa302420. aspx

EDIT: Dando a sua recomendação para o uso de SSL não é suficiente. Eu preciso de algum tipo de documentação de apoio. EU SEI que rolar nossa própria criptografia do lado do cliente é ruim. Eu preciso ser capaz de vender de forma credível que a colegas de trabalho e de gestão.

Além disso, HTTP Digest foi mencionado. Parece bom, mas Digest é apenas para HTTP autenticação, e não para os dados enviados por POST.

Foi útil?

Solução

1 o Mehrdad resposta . Ir em frente com criptografia home-grown é arriscado.

Falando da experiência aqui, depois de ter vulnerabilidades visto em soluções de criptografia do lado do cliente home-grown. A maioria das vulnerabilidades são devido à mesma razão - a transferência de dados foi protegido por criptografia com uma chave secreta, mas a chave em si foi trocado de forma insegura

.

TLS / SSL resolve o problema de não apenas garantir a troca de chaves, mas também de transferência segura de dados.

TLS / SSL protege suas informações confidenciais usando criptografia de chave assimétrica para trocar a chave simétrica usada para criptografar informações e para trás, uma vez que a sessão de TLS / SSL foi estabelecida. A chave simétrica é gerada em tempo de execução, e é um segredo compartilhado entre o cliente eo servidor; é esta chave que é usada para criptografar todo o tráfego assim que a sessão está pronto para transferência de dados.

chaves públicas e privadas do servidor são utilizados apenas para trocar esse segredo compartilhado. A única maneira conhecida para comprometer a chave compartilhada é comprometer a chave privada do servidor (de modo que a chave secreta pode ser decifrada). Na realidade, ele requer negligência ou dolo por parte do administrador do servidor.

Se você rolar sua própria solução de criptografia, você deve trocar a chave simétrica, de uma maneira segura A maneira mais fácil de fazer isso é usar TLS / SSL.; a maneira mais difícil é implementar sua própria solução de troca de criptografia de chave assimétrica.

Outras dicas

Eu altamente recomendo contra indo com sua própria solução (em ambientes sensíveis de segurança). Vá com SSL. É uma tecnologia comprovada e é fácil de implementar.

Rolando suas próprias soluções de segurança pode ser muito perigoso e mesmo que seja implementado corretamente (0.000001% de chance), ele ser caro.

Se os dados em si não é muito sensível, mas as senhas são, eu sugiro usar HTTP digest autenticação (que é uma besta diferente de HTTP autenticação básica). É sejam bastante seguros HTTP sobre em linha reta, e não de todo difícil de implementar no servidor. Nada é enviado através do fio que poderia revelar qual é a senha, apenas informações que permite que o cliente para demonstrar para o servidor que eles têm a senha correta.

Se você quer uma explicação razoável de como implementar HTTP autenticação Digest em seu aplicativo, Paul James tem um excelente artigo sobre ele .

O único verdadeiro problema com a autenticação HTTP é nos próprios navegadores: a interface do usuário é terrível, mas que pode ser superar com algum Javascript .

Você pode armazenar as senhas com segurança armazenando o hash A1.

UPDATE:. Como mencionado em outras respostas, enquanto o servidor pode evitar ataques MITM por não aceitar autenticação básica, o cliente ainda é vulnerável porque ele vai

UPDATE:. Você consegue os dados não seguras através POST a menos que você quer (a) fazer criptografia em JavaScript no cliente ou, (b) fazer tudo através de SSL

Você pode , com um pouco de magia, use HTTP auth com formulários. O artigo I link acima é chamado de 'HTTP Auth com formulários HTML', depois de tudo. Mas isso não vai ser feito durante POST.

Se você realmente precisa fazer uso POST, use SSL e sal as senhas em seu banco de dados.

Se você quiser evitar CSRF, eu recomendo usar formkeys , embora a idéia vai por muitos nomes diferentes, eu peguei esse nome de hackers Slashcode para meu próprio uso de alguns anos atrás, que é onde me deparei pela primeira vez.

Você vai gastar mais tempo e dinheiro rolando sua própria solução e não ter a certeza de que é seguro. Indústria SSL padrão é fácil de implementar e muito mais seguro para fora da caixa do que você pode dar ao luxo de fazer sua própria solução.

tempo == dinheiro

Comprar um certificado e gastar seu tempo trabalhando em seu aplicativo em vez de um formulário de login seguro.

criptografia do lado do cliente é impotente contra a maioria dos ataques MITM. Atacante pode simplesmente remover o seu script.

Ele só irá proteger contra sniffing passiva. Se isso é bom o suficiente para você, você pode usar:

  • Hashing implementado em JavaScript. É fácil de implementar desafio-resposta para o login inicial, mas não se esqueça que para cookie de sessão atacante é quase tão bom como senha (você teria que logon limite para único IP e / ou escrita uso para gerar cookie de uma só vez para cada pedido, que eu imagino seria difícil e solução frágil).
  • Autenticação HTTP Digest. Mais seguro, pois ele pode usar hashes de uma só vez, autenticação mútua, etc., mas UI padrão é absolutamente repulsivo.

... apenas uso SSL.

HTTP únicas soluções será sempre suscetível a ataques man-in-the-middle.

EDIT:. Um rastreamento de rede seria uma maneira fácil de provar que HTTP não é seguro

Ok, aqui está a única resposta que você precisa: o seu banco só suporta login / autenticação via SSL. Se houvesse uma maneira melhor de fazê-lo, eles iriam.

Bem, há alguma discussão interna sobre em vez de fazer algum tipo de criptografia do lado do cliente roll-a-próprio de senhas (password + sal, etc.).

A primeira coisa que precisamos endereço é dados em dados relativos ao trânsito vs. em repouso. A partir do OP parece que a grande preocupação é nome de usuário / senha em claro através da Internet. Então, você realmente se preocupam com os dados em trânsito. HTTPS via SSL é um método testado de fazer isso (e é uma correção muito fácil!). Agora, se você realmente quer para rolar seus próprios para dados em repouso (em um db, em um servidor de arquivos, etc.), que é um animal diferente, mas os métodos existentes para a criptografia de dados vai ser melhor do que um rolo seu próprio .

Baseando-se no lado do cliente para a sua segurança é ruim. Período. Em um ambiente corporativo, sim, você pode tanto contar com uma configuração padrão. Mas, em última análise, os usuários são idiotas e você pode se deparar com alguém desativando o JavaScript ou qualquer cliente baseado solução que você rolar para fora, então eles acabam enviando o nome de usuário / senha em texto simples de qualquer maneira (mesmo se seus servidores 'não sabe o que fazer com ele porque ele não está no formato esperado.

Roll-seu-próprio não vai ser sujeita ao escrutínio que uma solução existente tem. Você pode acabar adicionando questões de segurança adicionais na mistura por causa do código.

Nós apenas colocar para fora uma aplicação web / mobile para fazer algumas dessas coisas. Ela cria URLs aleatórios para logins, usando HTTPS e um / método de encriptação AES hash para o armazenamento de dados. Há uma simples API JSON para usá-lo sem o nosso UI, aqui está o nosso writeup, dar-lhe um olhar .. http://blog.primestudiosllc.com/security/send-time-limited-secure-logins-with-timebomb-it

você mencionou fazer a sua própria criptografia mais sal ... Eu sugiro usar javascript md5 (ele também é usado pelo Yahoo em suas páginas não SSL, ou assim ele diz) ...

E você dupla de hash a senha ... alguns podem argumentar que o dobro hashing seria torná-lo propenso a ataques de colisão. Eu tenho que discordar, porque as pessoas têm sido capazes de fazer até agora md5 colisões de assinatura somente em arquivos, onde grande quantidade de dados é md5'ed ...

Se é um grande site corporativo (e não haveria razões para quebrar), não há desculpa para não usar SSL.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top