O guia definitivo para a autenticação de um sítio web baseado em formulários [encerrado]

autenticação por formulários para sítios Web

acreditamos que o excesso de pilha não deve ser apenas um recurso para questões técnicas muito específicas, mas também para orientações gerais sobre como resolver variações em problemas comuns. "Form based authentic for websites" deve ser um bom tópico para tal experiência.

deve incluir tópicos como:

  • Como fazer login em
  • Como sair
  • como permanecer registado
  • gerir cookies (incluindo as configurações recomendadas)
  • encriptação SSL/HTTPS
  • Como conservar as senhas
  • usando perguntas secretas
  • esquecer a funcionalidade de utilizador / Senha
  • utilização de nonces para evitar falsificações de pedidos de localização cruzada (CSRF)
  • OpenID
  • Caixa de cheques" Lembra-te de mim"
  • completação automática do navegador de nomes de utilizador e senhas
  • URLs secretos (public URL protegido pelo digest)
  • a verificar a senha dosagem
  • validação por e-mail
  • e muito mais sobre autenticação baseada no formulário...

não deve incluir coisas como:

  • papéis e autorizações
  • Autenticação Básica de HTTP
Por favor, ajude-nos por:
  1. sugerindo subtópicos
  2. apresentar bons artigos sobre este assunto
  3. editar a resposta oficial
Author: Michiel de Mare, 2008-08-02

12 answers

Parte i: como aceder a

Assumiremos que já sabe como criar um formulário HTML de login+senha que publica os valores num programa do lado do servidor para Autenticação. As secções abaixo abordarão os padrões de boas práticas auth e como evitar as armadilhas de segurança mais comuns.

Para HTTPS ou não para HTTPS?

A menos que a ligação já esteja segura (Isto é, túnel através de HTTPS usando SSL/TLS), os valores do seu formulário de autenticação serão enviados cleartext, que permite que qualquer pessoa que esteja escutando a linha entre navegador e servidor web será capaz de ler logins à medida que eles passam. Este tipo de escutas é feito rotineiramente pelos governos, mas em geral não abordaremos fios "de propriedade" a não ser dizer isto: se você está protegendo alguma coisa importante, use HTTPS.

Em essência, a única forma prática de proteger contra escutas / farejamento de pacotes durante a autenticação é usando HTTPS ou outra encriptação baseada em certificados scheme (for example, TLS) or a proved & tested challenge-response scheme (for example, the Diffie-Hellman-based SRP). qualquer outro método pode ser facilmente contornado por um invasor bisbilhoteiro.

É claro que, se estiver disposto a tornar-se um pouco impraticável, Poderá também utilizar alguma forma de esquema de autenticação de dois factores (por exemplo, o aplicativo do Google autenticador, um livro de códigos físico "estilo da guerra fria" ou um dongle gerador de chaves RSA). Se aplicado correctamente, isso pode funcionar mesmo com uma conexão sem segurança, mas é difícil imaginar que um dev estaria disposto a implementar dois fatores auth, mas não SSL.

(não) rolar a sua própria encriptação/hashing JavaScript

Dado o custo não zero e a dificuldade técnica percebida de configurar um certificado SSL no seu site, alguns programadores estão tentados a rolar os seus próprios esquemas de hashing ou encriptação no navegador, a fim de evitar passar os logins de cleartext por cima de um login não garantido fio.

, Enquanto que este é um nobre pensamento, é essencialmente inútil (e pode ser um falha de segurança) a menos que ele é combinado com um dos acima - isto é, protegendo a linha com criptografia forte ou usando um experimentado e testado o mecanismo de desafio-resposta (se você não sabe o que é, só sei que é um dos mais difíceis de provar, mais difícil de design, e o mais difícil de implementar conceitos de segurança digital).

Embora seja verdade que esmagar o palavra-passe pode ser eficaz contra palavra-passe de divulgação, ele é vulnerável a ataques de repetição, Man-In-The-Middle ataques / sequestros (se um invasor pode injetar alguns bytes em sua inseguro página HTML antes de atingir o seu browser, eles podem simplesmente comentar o hash em JavaScript), ou ataques de força bruta (desde que você está entregando o invasor tanto o nome de usuário, o sal e o hash de senha).

CAPTCHAS contra a humanidade

Os CAPTCHAs são destinado a frustrar uma categoria específica de ataque: dicionário automatizado/força de teste-e-erro de Força bruta Sem operador humano. Não há dúvida de que esta é uma ameaça real, no entanto, existem maneiras de lidar com ela perfeitamente que não exigem um CAPTCHA, especificamente projetados corretamente sistemas de estrangulamento de login serverside - discutiremos esses mais tarde.

Saiba que as implementações CAPTCHA não são criadas da mesma forma; muitas vezes não são solúveis em humanos, a maioria deles são realmente ineficazes contra bots, todos eles são ineficazes contra mão-de-obra barata do Terceiro Mundo (de acordo com OWASP, a taxa atual da fábrica é de US $12 por 500 testes), e algumas implementações podem ser tecnicamente ilegais em alguns países (Ver OWASP Authentication Cheat Sheet). Se você precisa usar um CAPTCHA, use o Google reCAPTCHA , Uma vez que é OCR-hard por definição (uma vez que ele já usa scans de livros OCR-mal classificados) e tenta muito para ser fácil de usar.

Pessoalmente, tenho tendência a encontre CAPTCHAS irritantes, e use-os apenas como um último recurso quando um usuário não logar um número de vezes e os atrasos de estrangulamento estão no máximo. Isso raramente acontecerá o suficiente para ser aceitável, e fortalece o sistema como um todo.

Guardar as senhas / verificar as autenticações

Isto pode finalmente ser do conhecimento geral, depois de todos os hacks altamente publicitados e fugas de dados do utilizador que vimos nos últimos anos, mas tem de ser dito: não guarde senhas em cleartext no seu banco. As bases de dados de usuários são hackeadas, vazadas ou obtidas através de injeção de SQL, e se você estiver armazenando senhas raw, de texto simples, isso é jogo instantâneo para sua segurança de login.

Então, se você não pode armazenar a senha, como você verifica se a combinação de login+senha postada no formulário de login está correta? A resposta é amarrar usando uma função de derivação chave . Sempre que um novo utilizador é criado ou uma senha é alterada, você pega na senha e passa-a através de um KDF, como Argon2, bcrypt, scrypt ou PBKDF2, transformando a senha de cleartext ("correcthorsebatterystaple") em uma longa cadeia de aparência aleatória, que é muito mais seguro para armazenar em sua base de dados. Para verificar um login, você executa a mesma função de hash na senha introduzida, desta vez passando no salt e comparar a cadeia de hash resultante com o valor armazenado em sua base de dados. Argon2, bcrypt e scrypt armazenar o sal com o hash já. Veja este artigo sobre o sec. stackexchange para mais informações informacao.

A razão pela qual um sal é usado é porque o hashing em si não é suficiente -- você vai querer adicionar um chamado 'sal' para proteger a hash contra mesas arco-íris. Um sal impede efetivamente que duas senhas que coincidem exatamente sejam armazenadas como o mesmo valor de hash, impedindo que todo o banco de dados seja digitalizado de uma vez se um atacante estiver executando um ataque de adivinhação de senha.

Não deve ser utilizada uma barra criptográfica para o armazenamento de senhas porque as senhas selecionadas pelo Usuário não são suficientemente fortes (ou seja, geralmente não contêm entropia suficiente) e um ataque de suposição de senha pode ser concluído em um tempo relativamente curto por um atacante com acesso às hashs. É por isso que um KDF é usado-estes efetivamente "esticar a chave" significando que cada senha que um atacante faz envolve iterar o algoritmo de hashing várias vezes, por exemplo 10,000 vezes, fazendo a senha do atacante adivinhar 10,000 vezes lentamente.

Dados da sessão - "você está logado como Spiderman69"

Uma vez que o servidor tenha verificado o login e a senha no seu banco de dados de utilizadores e tenha encontrado uma correspondência, o sistema precisa de uma forma de se lembrar que o navegador foi autenticado. Este fato só deve ser armazenado lado servidor nos dados de sessão.

Se você não está familiarizado com os dados de sessão, aqui está como ele funciona: uma única cadeia gerada aleatoriamente é armazenada em um cookie expirando e usado para referencie uma coleção de dados - os dados de sessão - que é armazenada no servidor. Se você está usando um framework MVC, isso sem dúvida já é tratado.

Se for possível, certifique-se que o cookie da sessão tem as opções seguras e apenas HTTP definidas quando for enviado para o navegador. A bandeira httponly oferece alguma proteção contra o cookie ser lido por um ataque XSS. A bandeira segura garante que o cookie só é enviado de volta através de HTTPS, e, portanto, protege contra o farejamento de rede ataque. O valor do cookie não deve ser previsível. Quando um cookie que refere uma sessão inexistente é apresentado, o seu valor deve ser imediatamente substituído para evitar a fixação de sessão .

Parte II: como permanecer registado - a infame caixa de cheques" Lembra-te de mim "

Os Cookies de Login persistentes (funcionalidade "lembre-se de mim") são uma zona de perigo; por um lado, são tão seguros como os logins convencionais quando os utilizadores entendem como lidar com eles; e, por outro lado, hand, eles são um enorme risco de segurança nas mãos de usuários descuidados, que podem usá-los em computadores públicos e esquecer de sair, e que podem não saber o que são cookies de navegador ou como eliminá-los.

Pessoalmente, gosto de login persistentes para os sites que visito regularmente, mas sei como lidar com eles com segurança. Se você é positivo que seus usuários sabem o mesmo, você pode usar logins persistentes com uma consciência limpa. Se não-bem, então você pode subscrever a filosofia os utilizadores que são descuidados com as suas credenciais de login trouxeram-no a si próprios se forem hackeados. Não é como se fôssemos a casa dos nossos utilizadores e arrancássemos todas aquelas notas Post-It induzidas pelo facepalm com senhas que eles alinharam na borda dos seus monitores. É claro que alguns sistemas não se podem dar ao luxo de ter contas hackeadas; para esses sistemas, não há maneira de justificar ter logins persistentes.

Se você decidir implementar persistente cookies de login, é assim que se faz:

  1. Em primeiro lugar, dedique algum tempo a ler o artigo da iniciativa Paragon sobre o assunto. Você precisa acertar um monte de elementos, e o artigo faz um ótimo trabalho de explicar cada um.

  2. E apenas para reiterar uma das armadilhas mais comuns, não guarde o COOKIE de LOGIN persistente (TOKEN) na sua base de dados, apenas um HASH dele! O token de login é equivalente a senha, por isso, se um atacante tiver o seu mãos em sua base de dados, eles poderiam usar os tokens para entrar em qualquer conta, assim como se fossem combinações de login-senha de cleartext. Por conseguinte, utilizar a amarração (de acordo com https://security.stackexchange.com/a/63438/5002 um hash fraco serve perfeitamente para este fim) ao armazenar fichas de login persistentes.

Parte III: utilização de perguntas secretas

Não implemente "perguntas secretas". O recurso "perguntas secretas" é um anti-padrão de segurança. Ler o papel do link número 4 da lista MUST-READ. Podes perguntar à Sarah Palin sobre isso, depois do seu Yahoo! a conta de E-mail foi hackeada durante uma campanha presidencial anterior porque a resposta para a sua pergunta de segurança foi... "Wasilla High School"!

Mesmo com perguntas especificadas pelo Utilizador, é altamente provável que a maioria dos utilizadores escolha:

  • Uma pergunta secreta "normal", como o nome de solteira da mãe ou o animal de estimação favorito

  • Um simples pedaço de trivialidades que qualquer um poderia levantar de seu blog, Perfil LinkedIn, ou semelhante

  • Qualquer pergunta que seja mais fácil de responder do que adivinhar a sua senha. O que, para qualquer senha decente, é cada pergunta que você pode imaginar

Em conclusão, as questões de segurança são inerentemente inseguras em praticamente todas as suas formas e variações, e não devem ser empregadas em um esquema de autenticação por qualquer razão.

A verdadeira razão pela qual a segurança questiona existem na natureza é que eles convenientemente economizar o custo de algumas chamadas de suporte de usuários que não podem acessar seu e-mail para chegar a um código de reativação. Isto à custa da segurança e da reputação da Sarah Palin. Valeu a pena? Provavelmente não.

Parte IV: funcionalidade de senha esquecida

Já mencionei porque é que nunca deve usar as questões de segurança para lidar com senhas esquecidas/perdidas de Utilizador; também é evidente que nunca deve enviar e-mails aos utilizadores que são os seus utilizadores reais. senha. Existem pelo menos mais duas armadilhas muito comuns a evitar neste domínio:

  1. Não reponha uma senha esquecida a uma senha forte autogenerada - tais senhas são notoriamente difíceis de lembrar, o que significa que o utilizador deve alterá-la ou escrevê-la-digamos, num Post-It amarelo brilhante na borda do seu monitor. Em vez de definir uma nova senha, basta deixar os usuários escolher uma nova imediatamente - que é o que eles querem fazer de qualquer maneira. (Excepcao para isso pode ser se os usuários estão universalmente usando um gerenciador de senha para armazenar/gerenciar senhas que normalmente seriam impossíveis de lembrar sem escrevê-lo).

  2. Anule sempre o código/símbolo de senha perdido na base de dados. outra vez., este código é outro exemplo de uma senha equivalente, então ele deve ser hashed no caso de um atacante ter suas mãos em seu banco de dados. Quando for solicitado um código de senha perdido, envie o código de texto simples para o e-mail do utilizador endereço, depois coloque-o em hash, guarde o hash na sua base de dados -- e deite fora o original . Tal como uma senha ou um login persistente.

Uma nota final: certifique-se sempre de que a sua interface para introduzir o 'código de senha perdido' é pelo menos tão segura quanto o seu próprio formulário de login, ou um atacante irá simplesmente usar isto para obter acesso em vez disso. Assegurar-se de que gera 'códigos de senha perdidos' muito longos (por exemplo, 16 caracteres alfanuméricos sensíveis a maiúsculas) é um bom começo, mas considere adicionar o mesmo esquema de estrangulamento que você faz para o próprio formulário de login.

Parte V: verificação da resistência da senha

Primeiro, vai querer ler este pequeno artigo para uma verificação da realidade: as 500 senhas mais comuns

Ok, então talvez a lista não seja a lista canónicalista das senhas mais comuns em qualquer sistema em qualquer lugar já , mas é uma boa indicação de como as pessoas vão escolher mal as suas senhas quando não há nenhuma política aplicada em vigor. Além disso, a lista parece assustadoramente perto de casa quando a comparas com análises publicamente disponíveis de senhas roubadas recentemente.

Assim: sem requisitos mínimos de resistência à senha, 2% dos utilizadores usam uma das 20 senhas mais comuns. Significa: se um atacante recebe apenas 20 tentativas, 1 em 50 contas em seu site será rachável.

Frustrar isto requer calcular a entropia de uma senha e depois aplicar um limiar. A Nível Nacional A publicação especial 800-63 ([15]) do Instituto de normas e Tecnologia (NIST) tem um conjunto de sugestões muito boas. Que, quando combinado com um dicionário e análise do layout do teclado (por exemplo, 'qwertyuiop' é uma senha ruim), pode rejeitar 99% de todas as senhas mal selecionadas a um nível de 18 bits de entropia. Calcular a força da senha e mostrar um medidor de força visual a um utilizador é bom, mas insuficiente. A menos que seja aplicada, muitos utilizadores irão provavelmente ignorá-lo.

E para uma tomada refrescante da facilidade de utilização das senhas de alta entropia, é altamente recomendada a força de senha de Randall Munroe xkcd.

Parte VI: muito mais - ou: prevenir tentativas de arranque rápido

Primeiro, dê uma olhada nos números: velocidade de recuperação de senha - quanto tempo a sua senha vai ficar de pé

Se você não tem tempo para ver as tabelas nesse link, aqui está a lista de eles:
  1. Quase não é preciso tempo para decifrar uma palavra-passe fraca, mesmo que a decifres com um ábaco.

  2. É preciso virtualmente nenhum tempo para quebrar uma senha alfanumérica de 9 caracteres, se for insensível à capitalização

  3. É preciso virtualmente nenhum tempo para quebrar um intrincado, símbolos-e-letras-e-números, senha de maiúsculas e minúsculas, se for menos de 8 caracteres (um PC de secretária pode procurar em todo o espaço de teclas até 7 caracteres numa questão de dias ou mesmo horas)

  4. Seria, no entanto, necessário uma quantidade excessiva de tempo para quebrar até mesmo uma senha de 6 caracteres, Se você fosse limitado a uma tentativa por segundo!

Então, o que podemos aprender com estes números? Bem, muitos, mas podemos nos concentrar na parte mais importante: o fato de que prevenir um grande número de tentativas sucessivas de login de fogo rápido (ou seja. o bruto a força de ataque não é assim tão difícil. Mas impedir isso não é tão fácil como parece. De um modo geral, você tem três opções que são todas eficazes contra ataques de Força bruta ([18]} (e ataques de dicionário, mas uma vez que você já está empregando uma política forte de senhas, elas não devem ser um problema):
  • Apresentar uma CAPTCHA depois de N tentativas falhadas (irritante como o inferno e muitas vezes ineficaz -- mas estou a repetir-me toma.)

  • Bloquear as contas e exigir a verificação por e-mail depois de N tentativas falhadas (isto é um ataque dos à espera de acontecer)

  • E, finalmente, ligar a estrangular : Isto é, definir um atraso de tempo entre as tentativas após N tentativas falhadas (sim, os ataques DoS ainda são possíveis, mas pelo menos são muito menos prováveis e muito mais complicados de arrancar).

Melhores Práticas #1: um curto atraso de tempo que aumenta com o número de tentativas falhadas, como:

  • 1 tentativa falhada = sem atraso
  • 2 tentativas falhadas = atraso de 2 segundos
  • 3 tentativas falhadas = atraso de 4 segundos 4 tentativas falhadas = atraso de 8 segundos
  • 5 tentativas falhadas = atraso de 16 segundos
  • etc.

Os ataques a este esquema seriam muito impraticáveis, uma vez que o tempo de bloqueio resultante é ligeiramente maior do que a soma dos tempos de bloqueio anteriores.

To clarificar: o atraso é não um atraso antes de devolver a resposta ao navegador. É mais como um tempo-limite ou período refratário durante o qual o login tenta uma conta específica ou a partir de um endereço IP específico não será aceito ou avaliado de todo. Ou seja, as credenciais corretas não retornarão em um login bem sucedido, e as credenciais incorretas não desencadearão um aumento de atraso.

Melhores práticas #2: um atraso de tempo médio que entra em vigor após N tentativas falhadas, como:

  • 1-4 tentativas falhadas = sem atraso
  • 5 tentativas falhadas = 15-30 min de atraso

Os atacar este esquema seria muito impraticável, mas certamente exequível. Além disso, pode ser relevante notar que um atraso tão longo pode ser muito irritante para um usuário legítimo. Usuários esquecidos não gostarão de você.

Melhores Práticas # 3: combinando as duas abordagens - ou um atraso de tempo fixo e curto que entra em vigor após N falhar tentativas, como:

  • 1-4 tentativas falhadas = sem atraso
  • 5 + tentativas falhadas = atraso de 20 segundos

Ou, um atraso crescente com um limite superior fixo, como:

  • 1 tentativa falhada = atraso de 5 segundos
  • 2 tentativas falhadas = atraso de 15 segundos
  • 3 + tentativas falhadas = atraso de 45 segundos
Este esquema final foi retirado das sugestões de melhores práticas da OWASP (link 1 da lista MUST-READ) e deve ser considerado o melhor a prática, mesmo que seja reconhecidamente restritiva.

como regra geral, no entanto, eu diria: quanto mais forte a sua política de senha é, menos você tem que bug usuários com atrasos. Se necessitar de senhas de caracteres fortes (Alfanuméricos sensíveis à capitalização + números e símbolos necessários) 9+, poderá dar aos utilizadores 2 a 4 tentativas de senha não retardadas antes de activar o estrangulamento.

Os que atacarem este esquema de estrangulamento de autenticação final seriam: muito impraticável. E como toque final, sempre permitir que os logins persistentes (cookie) (e / ou um formulário de login verificado pelo CAPTCHA) passem, de modo que os usuários legítimos não serão sequer adiados enquanto o ataque está em andamento. Assim, o ataque dos muito impraticável torna-se um ataque extremamente impraticável.

Além disso, faz sentido fazer um estrangulamento mais agressivo nas contas da administração, uma vez que estes são os pontos de entrada mais atractivos

Parte VII: ataques de Força bruta distribuídos

Assim como um aparte, os atacantes mais avançados tentarão contornar o estrangulamento do login "espalhando as suas actividades": {[[4]}
  • Distribuir as tentativas de um botnet para evitar a marcação de endereços IP

  • Em vez de escolher um usuário e tentar as 50.000 senhas mais comuns (que eles não podem, por causa do nosso estrangulamento), eles vão escolher a senha mais comum e tentar contra 50.000 usuários em vez disso. Por ali, não. apenas eles conseguem contornar as medidas de tentativas máximas como CAPTCHAs e o estrangulamento de login, a sua chance de sucesso também aumenta, uma vez que a senha mais comum número 1 é muito mais provável do que Número 49.995

  • Espaçando os pedidos de login para cada conta de usuário, digamos, 30 segundos de intervalo, para esgueirar-se sob o radar

Aqui, a melhor prática seria registar o número de logins falhados, em todo o sistema, e usar uma média de execução do seu site Bad-login frequency as the basis for an upper limit that you then impose on all users.

Demasiado abstracto? Deixa-me reformular. Diga que o seu site teve uma média de 120 Bad logins por dia nos últimos 3 meses. Usando isso (running average), o seu sistema poderá definir o limite global para 3 vezes o -- ie. 360 tentativas falhadas ao longo de um período de 24 horas. Então, se o número total de tentativas falhadas em todas as contas exceder esse número dentro de um dia (ou ainda melhor, monitorar a taxa de aceleração e trigger em um limiar calculado), ele ativa a aceleração de login em todo o sistema - significando pequenos atrasos para todos os usuários (ainda, com exceção de logins de cookie e/ou logins de backup CAPTCHA). Também coloquei uma pergunta com mais detalhes e uma boa discussão sobre como evitar os traiçoeiros ataques de Força bruta distribuídos.

Parte VIII: fornecedores de autenticação e autenticação com dois factores

As credenciais podem ser comprometido, seja por façanhas, senhas sendo escritas e perdidas, laptops com chaves sendo roubadas, ou usuários entrando logins em sites de phishing. Logins podem ser protegidos com autenticação de dois fatores, que usam fatores fora de banda, como códigos de uso único recebidos de uma chamada de telefone, mensagem SMS, aplicativo ou dongle. Vários provedores oferecem serviços de autenticação de dois fatores.

A autenticação pode ser completamente delegada num serviço de sinal único, onde outro fornecedor lida com a recolha de credenciais. Isso empurra o problema para um terceiro confiável. O Google e o Twitter fornecem serviços SSO baseados em padrões, enquanto o Facebook fornece uma solução proprietária semelhante.

MUST-READ LINKS About Web Authentication

  1. OWASP Guide To Authentication / OWASP Authentication Cheat Sheet
  2. dos and Don'ts of Client Authentication on the Web (very readable MIT research papel)
  3. Wikipédia: 'cookie' de HTTP
  4. questões de conhecimento pessoal para autenticação de retorno: questões de segurança na Era do Facebook (muito legível Berkeley research paper)
 3536
Author: Jens Roland, 2018-07-18 16:31:15

Artigo Definitivo

A enviar as credenciais

A única forma prática de enviar credenciais 100% seguras é usando SSL. Usar JavaScript para hash a senha não é Segura. Armadilhas comuns para a lavagem de senhas do lado do cliente:

  • Se a ligação entre o cliente e o servidor não estiver encriptada, tudo o que faz é vulnerável aos ataques do homem-no-meio . Um atacante poderia substituir o javascript de entrada para quebrar o hashing ou enviar tudo credenciais para o seu servidor, eles poderiam ouvir as respostas dos clientes e personificar os usuários perfeitamente, etc. etc. SSL com autoridades de certificados confiáveis é projetado para evitar ataques MitM.
  • a senha tracejada recebida pelo servidor é menos segura Se não fizer trabalho adicional e redundante no servidor.

Existe outro método seguro chamado SRP , mas é patenteado (embora seja livremente licenciado ) e existem poucos bons implementações disponíveis.

Guardar as senhas

Nunca armazenes senhas como texto simples na base de dados. Nem mesmo se você não se importa com a segurança de seu próprio site. Suponha que alguns de seus usuários reutilizarão a senha de sua conta bancária on-line. Então, guarda a senha e deita fora o original. E certifica-te que a senha não aparece nos registos de acesso ou nos registos de aplicações. OWASP recomenda o uso de Argon2 Como sua primeira escolha para o novo aplicacao. Se isto não estiver disponível, PBKDF2 ou scrypt deve ser usado em vez disso. E, finalmente, se nenhum dos acima estão disponíveis, use bcrypt.

As barras por si só também são inseguras. Por exemplo, senhas idênticas significam traços idênticos--isso faz com que as tabelas de hash sejam uma maneira eficaz de decifrar muitas senhas de uma vez. Em vez disso, armazene o haxixe salgado. Um sal é uma cadeia adicionada à senha antes de hashing - use um sal diferente (aleatório) por usuário. O sal é um valor público, então você pode armazená-los com o hash na base de dados. Veja aqui para mais sobre isto.

Isso significa que você não pode enviar ao usuário Suas senhas esquecidas (porque você só tem o hash). Não reponha a senha do usuário a menos que você tenha autenticado o usuário (os usuários devem provar que eles são capazes de ler e-mails enviados para o endereço de E-mail armazenado (e validado).)

Questões de segurança

As questões de segurança são inseguras-evite usá-las. Por quê? Qualquer coisa a a questão da segurança faz, uma senha faz melhor. Ler Parte III: utilização de perguntas secretas em @Jens Roland answer aqui neste wiki.

Cookies de Sessão

Depois de o utilizador se ligar, o servidor envia ao Utilizador um 'cookie' de sessão. O servidor pode recuperar o nome de usuário ou o id do cookie, mas mais ninguém pode gerar tal cookie (TODO explain mechanisms).

Cookies podem ser sequestrados {[[7]}: eles são tão seguros quanto o resto do cliente máquinas e outras comunicações. Eles podem ser lidos a partir de um disco, snifado no tráfego de rede, levantado por um ataque de scripting cross-site, phished a partir de um DNS envenenado para que o cliente envia seus cookies para os servidores errados. Não envies biscoitos persistentes. Os Cookies devem expirar no final da sessão do cliente (fechar o navegador ou deixar o seu domínio).

Se quiser autologin seus usuários, você pode definir um cookie persistente, mas ele deve ser distinto de um cookie de sessão completa. Você pode definir um bandeira adicional que o usuário tem auto-logado, e precisa fazer login real para operações sensíveis. Isto é popular com sites de compras que querem fornecer-lhe uma experiência de compras sem descontinuidade, personalizada, mas ainda proteger os seus detalhes financeiros. Por exemplo, quando você volta para visitar a Amazon, eles lhe mostram uma página que parece que você está logado, mas quando você vai para fazer um pedido (ou alterar o seu endereço de envio, cartão de crédito etc.), pedem-lhe que confirme a sua senha.

Os sites financeiros como bancos e cartões de crédito, por outro lado, só têm dados sensíveis e não devem permitir o auto-login ou um modo de baixa segurança.

Lista dos recursos externos

  • Dos and Don'ts of Client Authentication on the Web (PDF)
    Artigo acadêmico de 21 páginas com muitas boas dicas.
  • perguntar ao YC: melhores práticas para a autenticação do utilizador
    Discussão do fórum sobre o assunto
  • Você provavelmente está Guardar Incorrectamente As Senhas
    Artigo introdutório sobre o armazenamento das senhas
  • Discussão: codificação de Horror: provavelmente estás a guardar as senhas incorrectamente.
    Forum discussion about a Coding Horror article.
  • Nunca guarde senhas numa base de dados!
    Outro Aviso sobre o armazenamento de senhas na base de dados.
  • Descodificação de senha
    Artigo da Wikipédia sobre fraquezas de vários esquemas de lavagem de senha.
  • Já Chega. As Tabelas Rainbow: O Que Você Precisa Saber Sobre Esquemas De Senha Seguros
    Discussão sobre mesas arco-íris e como se defender contra eles, e contra outros fios. Inclui uma ampla discussão.
 394
Author: Michiel de Mare, 2018-03-07 06:35:31

Primeiro, uma forte advertência de que esta resposta não é a melhor solução para esta pergunta exacta. Definitivamente não deve ser a resposta principal!

Irei em frente e mencionarei a proposta de Mozilla BrowserID (ou talvez mais precisamente, o verificado Protocolo de E-mail ) no espírito de encontrar um caminho de actualização para melhores abordagens à autenticação no futuro.

Vou resumir desta forma:
  1. o Mozilla é uma organização sem fins lucrativos com valores que se alinham bem, encontrar boas soluções para este problema.
  2. a realidade actual é que a maioria dos websites usam autenticação baseada em formulários
  3. a autenticação baseada no formulário tem uma grande desvantagem, que é o risco aumentado de phishing . Os usuários são convidados a inserir informações sensíveis em uma área controlada por uma entidade remota, em vez de uma área controlada pelo seu agente de usuário (navegador).
  4. Uma vez que os navegadores são implicitamente confiáveis (a ideia de um agente de Utilizador é agir em nome de o Usuário), eles podem ajudar a melhorar esta situação. A força principal que impede o progresso aqui é o impasse de lançamento. As soluções devem ser decompostas em etapas que proporcionem algum benefício incremental por si só. O método descentralizado mais simples para expressar a identidade que se constrói na infra-estrutura da internet é o nome de domínio.
  5. como segundo nível de expressão de identidade, cada domínio gere o seu próprio conjunto de contas.
  6. o formulário "domínio da Conta @" é conciso e suportado por uma vasta gama de protocolos e esquemas URI. Esse identificador é, naturalmente, universalmente reconhecido como um endereço de E-mail.
  7. Os fornecedores de E-mail já são os principais fornecedores de identidade online. Os fluxos de reset de senhas actuais normalmente permitem-lhe assumir o controlo de uma conta se puder provar que controla o endereço de E-mail associado dessa conta. O protocolo de E-mail verificado foi proposto para fornecer um método seguro, baseado na criptografia de chave pública, para simplificar o processo de provar ao Domínio B que tem uma conta no domínio A.
  8. para navegadores que não suportam o protocolo de E-mail verificado (actualmente todos eles), o Mozilla fornece um shim que implementa o protocolo no código JavaScript do lado do cliente.
  9. Para serviços de E-mail que não suportam o protocolo de E-mail verificado, o protocolo permite que terceiros atuem como intermediários confiáveis, afirmando que eles verificaram a propriedade de um usuário de uma conta. Não é desejável ter um grande número desses terceiros; Esta capacidade destina-se apenas a permitir um caminho de atualização, e é muito preferível que os Serviços de E-mail fornecem essas afirmações por si mesmos. A Mozilla oferece o seu próprio serviço para agir como um terceiro de confiança. Os prestadores de serviços (ou seja, as partes confiantes) que implementam o protocolo de E-mail verificado podem optar por confiar nas afirmações da Mozilla ou não. O serviço da Mozilla verifica a propriedade da conta dos utilizadores usando os meios convencionais de enviar um email com um link de confirmação. Os prestadores de serviços podem, evidentemente, oferecer este protocolo como uma opção, para além de qualquer outro método de autenticação que desejem oferecer.
  10. um grande benefício da interface de utilizador que está a ser procurado aqui é o "selector de identidade". Quando um usuário visita um site e escolhe autenticar, seu navegador mostra-lhes uma seleção de endereços de E-mail ("pessoal", "trabalho", "ativismo político", etc.) podem utilizar para identificar eles mesmos para o local.
  11. outra grande vantagem da interface de utilizador que está a ser procurada como parte deste esforço éajudar o navegador a saber mais sobre a sessão do utilizador {[[6]} – em quem está assinado como actualmente, principalmente – para que possa mostrar isso no navegador chrome.
  12. Por causa da natureza distribuída deste sistema, ele evita lock-in para grandes sites como Facebook, Twitter, Google, etc. Qualquer indivíduo pode possuir o seu próprio domínio e, portanto, agir como sua própria identidade fornecedor.

Isto não é estritamente "autenticação baseada em formulários para sites". Mas é um esforço para a transição da norma atual de autenticação baseada em formulários para algo mais seguro: autenticação suportada pelo navegador.

 148
Author: Charlie, 2012-11-07 19:12:50
Apenas pensei em partilhar esta solução que descobri estar a funcionar muito bem.

Eu chamo-lhe o campo Simulado (Embora eu não tenha inventado isto por isso não me credite).

Resumindo: basta inserir isto no seu <form> e verificar se está vazio ao validar:

<input type="text" name="email" style="display:none" />

O truque é enganar um bot a pensar que tem de inserir dados num campo necessário, é por isso que chamei à entrada "e-mail". Se já tiver um campo chamado email que estás a usar, devias tentar dar ao campo falso outro nome como "companhia", "telefone"ou" Endereço electrónico". Basta escolher algo que você sabe que você não precisa e o que soa como algo que as pessoas normalmente achariam lógico para preencher em um formulário web. Agora, esconda o campo input usando o CSS ou JavaScript / jQuery - o que mais lhe convém - apenas não defina a entradatype para hidden ou então o bot não cairá nessa.

Quando estiver a validar o formulário (do lado do cliente ou do servidor) verifique se o seu campo fictício foi preenchido para determinar se foi enviado por um humano ou um bot.

Exemplo:

No caso de um ser humano: O Usuário não vai ver o campo fictício (no meu caso chamado "email") e não vai tentar preenchê-lo. Assim, o valor do campo do manequim ainda deve estar vazio quando o formulário tiver sido enviado.

No caso de um bot: o bot verá um campo cujo tipo é text e um nome email (ou seja lá o que lhe chamastes) e logicamente verá tente preenchê-lo com dados apropriados. Não importa se você estilizou o formulário de entrada com algum CSS chique, web-developers fazem isso o tempo todo. Seja qual for o valor do campo fictício, não nos importamos, desde que seja maior que personagens.

Usei este método num livro de visitas em combinação com CAPTCHA, e não vi um único post de spam desde então. Eu tinha usado uma solução CAPTCHA-somente antes, mas eventualmente resultou em cerca de cinco posts de spam a cada hora. Adicionar a campo fictício na forma parou (pelo menos até agora) todo o spam de aparecer.

Eu acredito que isso também pode ser usado muito bem com um formulário de login/autenticação.

Aviso : claro que este método não é 100% À Prova de tolos. Os Bots podem ser programados para ignorar os campos de entrada com o estilo display:none aplicado a ele. Você também tem que pensar em pessoas que usam alguma forma de auto-completação (como a maioria dos navegadores têm built-in!) para preencher automaticamente todos os campos do formulário para eles. Talvez. é melhor ir buscar um campo falso.

Você também pode variar um pouco isso deixando o campo fictício visível, mas fora dos limites da tela, mas isso é totalmente com você. Seja criativo!
 121
Author: Pieter888, 2012-11-13 04:19:49

Eu não acho que a resposta acima é "errada", mas há grandes áreas de autenticação que não são tocadas (ou melhor, a ênfase é em "como implementar sessões de cookie", não em "que opções estão disponíveis e quais são os compromissos".

As minhas edições / respostas sugeridas são

  • o problema reside mais na configuração da conta do que na verificação de senha.
  • O uso da autenticidade de dois factores é muito mais seguro do que meios inteligentes de senha. encriptação
  • Não tente implementar o seu próprio formulário de autenticação ou armazenamento de bases de dados de senhas, a menos que os dados armazenados não têm valor na criação de conta e são gerados por si mesmos (ou seja, o estilo Web 2.0 como Facebook, Flickr, etc.)

    1. a autenticação Digest é uma abordagem baseada em padrões suportada em todos os principais navegadores e servidores, que não irá enviar uma senha mesmo através de um canal seguro.

Isto evita qualquer necessidade de ter "sessões" ou cookies como o próprio navegador irá re-criptografar a comunicação cada vez. É a abordagem de desenvolvimento mais "leve".

No entanto, não recomendo isto, excepto para os serviços públicos de baixo valor. Este é um problema com algumas das outras respostas acima - não tente um re-implementar mecanismos de auteticação do lado do servidor-este problema foi resolvido e é suportado pela maioria dos navegadores principais. Não utilize cookies. Não guarde nada na sua própria base de dados. Pergunta, per. pedido, se o pedido for autenticado. Tudo o resto deve ser suportado por configuração e software de confiança de terceiros. Então .....

Primeiro, estamos a confundir a criação inicial de uma conta (com uma senha) com a verificar novamente a senha posteriormente. Se eu sou o Flickr e criar o seu site pela primeira vez, o novo usuário tem acesso ao valor zero (espaço web em branco). Eu realmente não me importo se a pessoa que cria a conta está mentindo sobre o seu nome. Se estou criando uma conta da intranet / extranet do hospital, o valor está em todos os registros médicos, e assim eu fazer cuidar da identidade (*) do criador da conta.

Esta é a parte mais difícil. A única solução decente é uma teia de confiança. Por exemplo, você se junta ao hospital como médico. Você cria uma página web hospedada em algum lugar com sua foto, seu número de passaporte e uma chave pública, e hash todos eles com a chave privada. Em seguida, visite o hospital e o o administrador do sistema olha para o seu passaporte, vê se a foto corresponde a si, e, em seguida, colhe a página web / hash de fotos com a chave privada do hospital. A partir de agora podemos trocar chaves e fichas com segurança. Assim como qualquer um que confia no hospital (há o molho secreto BTW). O administrador do sistema também pode dar-lhe um RSA dongle ou outra autenticação de dois factores.

Mas isto é um lote de aborrecimento, e não muito web 2.0. No entanto, é a única forma segura de criar novas contas que têm acesso a informações valiosas que não são auto-criadas.

  1. Kerberos e SPNEGO-sinal único em mecanismos com um terceiro confiável-basicamente o usuário verifica contra um terceiro confiável. (NB: isto não é de forma alguma o não ser de confiança OAuth)

  2. SRP - uma espécie de autenticação inteligente por senha sem um terceiro de confiança. Mas aqui estamos nos reinos de " é mais seguro usar dois fatores autenticação, mesmo que isso seja mais dispendioso"

  3. SSL lado do cliente-dar aos clientes um certificado de chave pública (suporte em todos os navegadores principais - mas levanta questões sobre a segurança da máquina do cliente).

No final, é uma troca-Qual é o custo de uma falha de segurança contra o custo de implementar abordagens mais seguras. Um dia, podemos ver um PKI apropriadoamplamente aceito e, portanto, não mais formulários de autenticação rolados e bases de dados. Dia...
 71
Author: you cad sir - take that, 2012-11-09 16:56:07

Quando hashing, não use algoritmos de hash rápidos como o MD5 (existem muitas implementações de hardware). Usa algo como SHA-512. Para senhas, hashs mais lentos são melhores.

Quanto mais rápido você pode criar hashes, mais rápido qualquer verificador de Força bruta pode funcionar. Os hashs mais lentos Irão, portanto, abrandar a força bruta. Um algoritmo de hash lento fará com que o bruto forçando impraticável para senhas mais longas (8 Dígitos+)

 48
Author: josh, 2013-08-04 18:09:35

Um bom artigo sobre a estimativa realista da resistência da senha é:

Dropbox Tech Blog "Blog Archive" zxcvbn: realistic password strength estimation

 47
Author: blade19899, 2015-04-24 18:26:40

A minha regra favorita em relação aos sistemas de autenticação: usar frases-passe, não senhas. Fácil de lembrar, difícil de quebrar. Mais informações: Codificação de Horror: senhas vs. Frases De Passe

 42
Author: blade19899, 2013-12-19 12:44:52
Gostaria de acrescentar uma sugestão que usei, baseada na defesa em profundidade. Você não precisa ter o mesmo sistema auth & auth para administradores como usuários regulares. Você pode ter um formulário de login separado em um url separado executando código separado para pedidos que irão conceder altos privilégios. Este pode fazer escolhas que seriam uma dor total para os usuários regulares. Um desses que eu usei é realmente codificar o URL de login para o acesso administrativo e enviar e-mail para o administrador o novo URL. Pára qualquer ataque de Força bruta. imediatamente, como o seu novo URL pode ser arbitrariamente difícil (cadeia aleatória muito longa), mas o único inconveniente do seu usuário de administração é seguir um link em seu e-mail. O atacante já não sabe para onde postar.
 20
Author: Iain Duncan, 2015-07-18 01:18:52
Não sei se era melhor responder a isto como resposta ou como comentário. Optei pela primeira opção.

Em relação ao poing Parte IV: funcionalidade de senha esquecida na primeira resposta, eu faria uma observação sobre ataques de tempo.

Nos formulários Lembre-se da sua senha, um atacante pode potencialmente verificar uma lista completa de E-mails e detectar os que estão registados no sistema (ver ligação abaixo).

Em relação à Password esquecida Form, eu acrescentaria que é uma boa idéia equacionar os tempos entre consultas bem sucedidas e não confiáveis com alguma função de atraso.

Https://crypto.stanford.edu/~dabo/papers/webtiming.pdf

 12
Author: xyz, 2015-08-16 17:31:35
Gostaria de acrescentar um comentário muito importante:
  • "In a corporate, configuração da rede intra-," a maioria, se não Todas, pode não se aplicar!
Muitas corporações implantam sites de" uso interno apenas "que são, efetivamente," aplicações corporativas " que por acaso foram implementadas através de URLs. Estes URLs podem(supostamente ...) [7] só ser resolvido no âmbito da rede interna da empresa." (que a rede magicamente inclui todos os guerreiros da estrada ligados à VPN.')

Quando um utilizador Está ligado à rede acima referida, a sua identidade {[[6]} ("autenticação") já está [...] "conclusively known," as is their permission ("authorization") to do certain things ... tais como ... "para aceder a este site."

Este serviço de "autenticação + autorização" pode ser fornecido por várias tecnologias diferentes, tais como LDAP (Microsoft OpenDirectory), ou Kerberos.

De seu ponto de vista, você simplesmente sabe isso: que qualquer um que legitimamente acaba em seu site deve ser acompanhado por [uma variável de ambiente magicamente contendo...] simbolo."(isto é a ausência de tal símbolo deve ser motivo imediato para {[[0]}.)

O valor do token não faz sentido para você, mas, se a necessidade surgir, "meios apropriados existem" pelo qual o seu web-site pode " [autoritativamente] perguntar a alguém que sabe (LDAP... etc.) "sobre qualquer e todos(!Pergunta que podes ter. Em outras palavras, você não faz valer-se de qualquer lógica caseira."Em vez disso, questiona a autoridade e confia implicitamente no seu veredicto.

Uh huh... é uma mudança mental da "Internet Selvagem e selvagem"."
 10
Author: Mike Robinson, 2015-08-13 23:09:36

Utilizar o OpenID Connect ou Acesso gerido pelo Utilizador.

Como nada é mais eficiente do que não o fazer.
 5
Author: jwilleke, 2016-08-10 13:27:44