A melhor maneira de implementar uma 'senha esquecida'? [fechadas]

154

Estou procurando o melhor método para implementar um recurso "esqueci a senha".

Eu saio com 2 idéias:

  1. Quando o usuário clica em Esqueceu a senha, o usuário deve digitar o nome de usuário, email e talvez a data de nascimento ou sobrenome. Em seguida, um email com senha temporária será enviado para a conta de email do usuário. O usuário usa a senha temporária para efetuar login e redefine sua senha.

  2. Semelhante, mas o email conteria um link para permitir que o usuário redefinisse sua senha.

Ou alguém pode me sugerir uma maneira melhor e segura? Também estou pensando em enviar a senha ou link temporário, forçar o usuário a redefinir a senha dentro de 24 horas, ou a senha ou o link temporário não será utilizável. Como fazer isso?

Zaki
fonte
Marquei novamente a postagem, pois isso vai além do JSF - você provavelmente obterá mais respostas dessa maneira.
955 McDowell
6
@Whoever Há uma onda de "vamos excluir esta pergunta encerrada porque XYZ" na meta esses meses. Gostaria apenas de expor que essa questão em particular não deve ser excluída, a menos que seja provado que as soluções são falhas e que sua existência dói literalmente mais do que ajuda no caso da segurança.
Félix Gagnon-Grenier
1
"Folha de dicas" da OWASP para uma estratégia de recuperação de senha esquecida: owasp.org/index.php/…
daiscog
O link sugerido por @megaflop agora está tristemente quebrado, eis o novo link: cheatsheetseries.owasp.org/cheatsheets/…
Marco Bolis

Respostas:

187

Atualização: revisada em maio de 2013 para uma melhor abordagem

  1. O usuário digita seu nome de usuário e pressiona "esqueci a senha". Também recomendo a opção de inserir o endereço de e-mail em vez do nome de usuário, porque os nomes de usuário às vezes também são esquecidos.
  2. O sistema tem uma tabela password_change_requestscom as colunas ID, Timee UserID. Quando o novo usuário pressiona o botão, um registro é criado na tabela. A Timecoluna contém a hora em que o usuário pressionou o botão "Esqueceu a senha". O IDé uma string. Uma cadeia aleatória longa é criada (digamos, um GUID) e depois é dividida em hash como uma senha (que é um tópico separado por si só). Esse hash é usado como o 'ID' na tabela.
  3. O sistema envia um email ao usuário que contém um link nele. O link também contém a sequência de ID original (antes do hash). O link será algo como isto: http://www.mysite.com/forgotpassword.jsp?ID=01234567890ABCDEF. A página forgotpassword.jsp deve poder recuperar o parâmetro ID. Desculpe, eu não conheço Java, então não posso ser mais específico.
  4. Quando o usuário clica no link no email, ele é movido para sua página. A página recupera o IDURL, faz o hash novamente e faz uma verificação na tabela. Se esse registro existir e não tiver mais do que, digamos, 24 horas, o usuário será solicitado a inserir uma nova senha .
  5. O usuário digita uma nova senha, pressiona OK e todos vivem felizes para sempre ... até a próxima!
Vilx-
fonte
1
a maneira mais apropriada de implementar isso seria - enviar o token temporário de redefinição de senha como um email em texto sem formatação para o usuário (mas nunca armazená-lo como texto sem formatação no banco de dados) - depois que o usuário entrar nessa temperatura forçá-lo imediatamente a digite novamente uma nova senha. - para os paranóicos, verifique se o servidor smtp possui ssl, para que seus e-mails contendo informações confidenciais não sejam espionados. para a maioria dos casos, essa abordagem é bastante segura. se o seu caso exige mais segurança, você provavelmente não deveria ter usuários que se esquecem de suas senhas: S
Kaushik Gopal
6
Por que gerar uma string / guid aleatória, hash e usar o hash? O guia não é suficiente?
Jeroen K
15
@jeroenk - Para que, se alguém roubar seu banco de dados, ele não possa forjar um link "Redefinir senha" e alterar a senha de alguém.
Vilx-
4
Esta é essencialmente a forma descrita de redefinir corretamente uma senha crackstation.net/hashing-security.htm#faq
TruthOf42
1
@ David - Ach, eu queria editar o post, mas o tópico está bloqueado. :( OK, vamos tentar de novo: sua tabela conterá as colunas: ID, UserID, Time, TokenHash.. Você vai gerar dois longas seqüências aleatórias Coloque a primeira corda (o "id") na IDcoluna; de hash o segundo (o "token" ) e colocar o hash na TokenHashcoluna a gerar o link como. forogotPassword.jsp?id=asdasd&token=asdasdo token no link não é hash isso faz sentido agora..?
Vilx-
28

Tudo depende do seu site e do nível de segurança que você está tentando alcançar, mas o processo básico para um aplicativo Web é algo como o seguinte:

  1. O usuário navega para a página 'esqueci minha senha' e digita seu nome de usuário ou email (o que for único) para solicitar uma redefinição de senha.

  2. Opcionalmente, nesse estágio, você pode confirmar a solicitação, solicitando informações adicionais, como a resposta a uma pergunta de segurança predefinida ou a data de nascimento, etc. Esse nível extra impede que os usuários recebam emails que não solicitaram.

  3. Procure a conta do usuário. Salve uma senha temporária (geralmente um GUID) e o carimbo de data e hora no registro da conta. Envie um email para o usuário que contém a senha temporária.

  4. O usuário clica no link que contém a senha temporária e o identificador do usuário no email ou navega para a página 'esqueci minha senha' e copia e cola a senha temporária e seu identificador. O usuário digita sua nova senha e a confirma.

  5. Procure o registro do usuário e, se o horário atual estiver dentro de um limite de tempo especificado (por exemplo, 1 hora) do carimbo de data e hora salvo na etapa 2, faça o hash e salve a nova senha. (Obviamente, apenas se as senhas temporárias corresponderem!). Exclua o GUID temporário e o carimbo de data e hora.

O principal aqui é que o usuário recebe por e-mail uma senha temporária que permite alterar sua senha. A senha originalmente armazenada (ela deve ter um hash!) Nunca é alterada para uma senha temporária, caso o usuário se lembre dela.

A senha original nunca será exibida ao usuário, pois deve ser hash e desconhecida.

Observe que esse processo depende inteiramente da segurança da conta de email do usuário. Portanto, depende do nível de segurança que você deseja alcançar. Isso geralmente é suficiente para a maioria dos sites / aplicativos.

David Glenn
fonte
24

Troy Hunt destaca alguns pontos excelentes em seu artigo, Tudo o que você sempre quis saber sobre a criação de um recurso de redefinição de senha segura . Os trechos mais relevantes são:

[T] aqui estão duas abordagens comuns:

  1. Gere uma nova senha no servidor e envie-a por email
  2. Enviar por e-mail um URL exclusivo que facilitará um processo de redefinição

Apesar de muita orientação em contrário, o primeiro ponto não é realmente onde queremos estar. O problema é que isso significa que uma senha persistente - uma senha com a qual você pode voltar e usar a qualquer momento - foi enviada por um canal inseguro e reside na sua caixa de entrada.

...

Mas há mais um grande problema com a primeira abordagem, na medida em que simplifica completamente o bloqueio malicioso de uma conta. Se eu souber o endereço de e-mail de alguém que possui uma conta em um site, posso bloqueá-lo sempre que quiser, simplesmente redefinindo sua senha; é um ataque de negação de serviço servido em uma bandeja de prata! É por isso que uma redefinição é algo que só deve ocorrer após a verificação bem-sucedida do direito do solicitante.

Quando falamos sobre um URL de redefinição, estamos falando de um endereço de site exclusivo para esta instância específica do processo de redefinição.

...

O que queremos fazer é criar um token exclusivo que possa ser enviado em um email como parte do URL de redefinição e depois corresponder a um registro no servidor ao lado da conta do usuário, confirmando assim que o proprietário da conta de email é realmente aquele que está tentando redefinir o senha. Por exemplo, o token pode ser "3ce7854015cd38c862cb9e14a1ae552b" e é armazenado em uma tabela ao lado do ID do usuário que está executando a redefinição e o horário em que o token foi gerado (mais sobre isso em um momento). Quando o email é enviado, ele contém um URL como "Redefinir /? Id = 3ce7854015cd38c862cb9e14a1ae552b" e, quando o usuário carrega isso, a página verifica a existência do token e, consequentemente, confirma a identidade do usuário e permite a senha. ser alterado.

...

A outra coisa que queremos fazer com um URL de redefinição é limitar o token por tempo, para que o processo de redefinição seja concluído dentro de uma certa duração, digamos, dentro de uma hora.

...

Finalmente, queremos garantir que este seja um processo único. Após a conclusão do processo de redefinição, o token deve ser excluído para que o URL de redefinição não funcione mais. Como no ponto anterior, isso garante que um invasor tenha uma janela muito limitada na qual possa abusar do URL de redefinição. Além disso, é claro que o token não será mais necessário se o processo de redefinição for concluído com êxito.

Ele faz muitos outros pontos positivos sobre como evitar vazamentos de informações, CAPTCHAs, autenticação de dois fatores e, claro, as práticas recomendadas básicas, como hash de senha. Acho importante notar que discordo de Troy sobre a utilidade das questões de segurança, preferindo o ceticismo de Bruce Schneier quanto à prática :

O objetivo de todas essas perguntas é o mesmo: uma senha de backup. Se você esquecer sua senha, a pergunta secreta poderá verificar sua identidade, para que você possa escolher outra senha ou fazer com que o site envie a sua senha atual por e-mail. É uma ótima idéia do ponto de vista do atendimento ao cliente - é menos provável que o usuário esqueça o nome do primeiro animal de estimação do que alguma senha aleatória -, mas é péssimo para a segurança. A resposta para a pergunta secreta é muito mais fácil de adivinhar do que uma boa senha, e as informações são muito mais públicas.

Dave Liepmann
fonte
1
Esse link possui imagens NSFW claras, existe um link para alterar isso, mas muitas pessoas digitalizam uma página primeiro. Idéia estúpida!
Nik0lai 11/09/14
O link para o artigo de Troy Hunt mudou. Goto troyhunt.com/everything-you-ever-wanted-to-know
knarfancho
@knarfancho Corrigido, obrigado!
21417 Dave Gropmann
15

Eu vou com:

  1. Pedir e-mail ao usuário, verifique se o e-mail está registrado
  2. Gere GUID e envie para esse email
  3. Ainda não redefina a senha
  4. O usuário clica no link e precisa inserir um novo passe
  5. Redefina a senha somente depois que o usuário estiver no seu site e clique no botão de redefinir após digitar o novo passe.
  6. Torne esse GUID expirável dentro de um curto período de tempo para torná-lo mais seguro.
andres.santana
fonte
Não quero ter problemas para pedir uma? mas está relacionado à sua resposta. Como você está gerando o GUID?
precisa saber é o seguinte
2
-1 para não implementar algum tipo de haxixe no link que você está enviando para a pessoa
TruthOf42
11

Quando você envia informações por e-mail, elas não são seguras. Existem muitas maneiras pelas quais alguém pode obtê-lo. Seria brincadeira de criança para um hacker habilidoso que deseja roubar suas informações.

Evite enviar qualquer informação pessoal, como senhas e informações de renda por e-mail, pois isso pode se tornar MUITO EMOCIONANTE para você e sua organização se essas informações vazarem ou forem roubadas. Pense seriamente em segurança. É preciso apenas um incidente para que todos os tijolos caiam.

Quanto à recuperação de senha, leia atentamente as práticas recomendadas de Esqueceu a senha .

A conclusão é que um aplicativo que segue as práticas recomendadas deve permitir que um usuário redefina sua própria senha. Perguntas de segurança pessoal devem ser usadas. O aplicativo não deve enviar email, exibir senhas nem definir senhas temporárias.

EDIT: Link atualizado

jinsungy
fonte
Eu tentei o link para as práticas recomendadas de Esqueci a senha e recebi um erro de 500 servidores. Você acha que o servidor está inoperante agora ou existe outro link a seguir?
KingAndrew
o link está morto novamente.
precisa
7

Como dito, isso depende do nível de segurança exigido; no entanto, se você precisar de um nível superior, algumas soluções novas que eu já vi incluem;

  • Exibindo metade da senha temporária quando a identidade do usuário foi confirmada (pergunta de segurança, endereço de email etc.) e a outra metade sendo enviada para a conta de email. Se a conta de email tiver sido comprometida, é improvável que a mesma pessoa também tenha conseguido executar um ataque intermediário. (Visto no UK Goverment Gateway)

  • Confirmação de identidade por e-mail e outro meio - por exemplo, um código enviado via texto para um celular registrado. (Visto no eBay / PayPal)

Em algum lugar entre esses dois extremos, implementar questões de segurança pode ser o caminho a seguir, conforme mencionado por DaveG.

Tom Werner
fonte
6

Se você incluir um endereço de e-mail no registro. O botão "esquecer senha" envia um email para esse endereço de email. Ele garante que as informações sejam enviadas para um email confiável.

(A menos que o banco de dados seja invadido, mas nada é seguro).

Toon Krijthe
fonte
4

Eu aplicaria endereços de email exclusivos nas contas.

Depois, basta enviar um link para uma página temporária que permita que a pessoa altere sua senha. (aguarde 24 horas ou menos)

A conta de email do usuário é o link mais fraco nesse cenário.

Andrew Harry
fonte
2

Nunca envie uma senha para o usuário. Mesmo que seja gerado automaticamente. Melhor abordagem (recomendado e usado pelo SANS e outros):

  1. Na página de senha esquecida, solicite o email / ID do usuário e uma NOVA senha ao usuário.
  2. Envie um link por email para o email armazenado para essa conta com um link de ativação.
  3. Quando o usuário clicar nesse link, ative a nova senha.

Se ele não clicar no link dentro de 24 horas, desative o link (para que ele não altere mais a senha).

Nunca altere a senha sem o consentimento do usuário. Significa não enviar uma nova senha por e-mail apenas porque alguém clicou no link da senha esquecida e descobriu o nome da conta.

Sucuri
fonte
13
Estou preocupado com esta técnica. O invasor digita seu email e uma NOVA senha. O proprietário da conta recebe o e-mail, lê errado algo e clica no link. O invasor aguardando, tentando nova senha a cada minuto, obtém acesso à conta até que o proprietário da conta perceba o que aconteceu e, eventualmente, vá para a página "esqueci a senha".
Odi - Xceed
Outro problema! fornecer uma nova senha no tempo de redefinição de senha não é uma boa opção. Posso esquecer a nova senha novamente, se o meu e-mail tiver sido verificado depois de horas!
Yazid Erman