Estou procurando o melhor método para implementar um recurso "esqueci a senha".
Eu saio com 2 idéias:
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.
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?
Respostas:
Atualização: revisada em maio de 2013 para uma melhor abordagem
password_change_requests
com as colunasID
,Time
eUserID
. Quando o novo usuário pressiona o botão, um registro é criado na tabela. ATime
coluna contém a hora em que o usuário pressionou o botão "Esqueceu a senha". OID
é 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.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.ID
URL, 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 .fonte
ID
,UserID
,Time
,TokenHash
.. Você vai gerar dois longas seqüências aleatórias Coloque a primeira corda (o "id") naID
coluna; de hash o segundo (o "token" ) e colocar o hash naTokenHash
coluna a gerar o link como.forogotPassword.jsp?id=asdasd&token=asdasd
o token no link não é hash isso faz sentido agora..?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:
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.
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.
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.
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.
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.
fonte
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:
...
...
...
...
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 :
fonte
Eu vou com:
fonte
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 .
EDIT: Link atualizado
fonte
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.
fonte
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).
fonte
Aqui estão três links muito bons que fornecem informações sobre redefinições de senha:
http://jtauber.com/blog/2006/03/20/account_management_patterns/
(Não permita que os usuários confirmem usando GET): http://www.artima.com/forums/flat.jsp?forum=106&thread=152805&start=15&msRange=15
http://fishbowl.pastiche.org/archives/docs/PasswordRecovery.pdf
Espero que ajude. Eles com certeza me ajudaram a entender o problema.
fonte
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.
fonte
Nunca envie uma senha para o usuário. Mesmo que seja gerado automaticamente. Melhor abordagem (recomendado e usado pelo SANS e outros):
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.
fonte