Você deve
nunca Use a senha existente do usuário para redefini -la, mesmo que você o saiba. Essa é uma grande vulnerabilidade de segurança e uma violação das melhores práticas. Eis por que e como você deve * realmente * redefinir senhas:
Por que usar a senha existente está errado: *
Segurança comprometida: Se você puder usar a senha antiga para definir uma nova, qualquer pessoa que obtenha acesso a esse recurso (por exemplo, um funcionário desonesto, um hacker que compromete seu sistema) pode alterar silenciosamente as senhas de usuário e assumir contas sem que o usuário saiba.
*
Perda de responsabilidade: Se você conhece a senha de um usuário, teoricamente pode executar ações como esse usuário. Isso impossibilita a auditoria e a responsabilidade. Você não pode provar que o usuário tomou a ação, como você poderia ter feito você mesmo.
*
Princípios de armazenamento de senha: Os sistemas modernos nunca armazenam senhas em texto simples. Eles são *hashed *e frequentemente *salgados *. Mesmo que você * pudesse * obter o hash armazenado, usá -lo para definir uma nova senha derrota o objetivo do algoritmo de hash e apresenta vulnerabilidades. Tentar reverter um hash é computacionalmente difícil e potencialmente impossível (projetado dessa maneira!), Mas dar acesso à senha contorna a segurança.
A maneira correta de redefinir senhas (mesmo com acesso a administrador): Os métodos adequados envolvem o usuário iniciando o processo de redefinição ou um administrador acionando uma redefinição que * força * o usuário a escolher uma nova senha no próximo login.
1.
redefinição de senha iniciada pelo usuário (autoatendimento): Este é o método preferido.
*
"Esquecido senha" Recurso: A maioria dos sites e aplicativos possui um link "Esquecido senha" ou "redefinir senha".
*
Verificação de email: O usuário clica no link, insere seu endereço de e-mail (ou nome de usuário) e o sistema envia um email com um link exclusivo e limitado para uma página de redefinição de senha.
*
Perguntas de segurança/opções de recuperação: Menos comum, mas ainda válido:o usuário responde a perguntas de segurança que eles configuraram anteriormente ou usa um método de recuperação predefinido (por exemplo, um número de telefone de recuperação).
*
nova entrada de senha: O usuário clica no link, é levado para uma página em que pode entrar e confirmar uma nova senha. Essa nova senha é então com segurança hash e armazenada.
2.
redefinição de senha iniciada pelo administrador (forçando uma alteração): *
Painel de administrador/ferramenta de linha de comando: O administrador usa uma ferramenta com permissões adequadas para redefinir o * estado * da senha, não para * definir * uma nova senha diretamente.
*
sinalizador para alteração de senha: O sistema define um sinalizador na conta do usuário que os obriga a alterar sua senha na próxima vez que eles fizerem login.
*
senha temporária (não recomendada): Em * alguns casos * muito específicos (e * apenas * se outras opções não estiverem disponíveis), um administrador poderá gerar uma senha * temporária *. O sistema * deve *
forçar O usuário para alterá -lo para uma nova senha imediatamente após seu primeiro login com a senha temporária. Geralmente é uma prática ruim porque:
* Requer armazenar a senha temporária, mesmo brevemente.
* Os usuários não podem alterá -lo imediatamente, aumentando o risco.
Detalhes da implementação (variam por sistema/idioma): O código e as etapas exatos dependem do idioma e da estrutura que você está usando (por exemplo, Python com Django, PHP com Laravel, Node.js com Express, etc.). Aqui está um esboço geral:
*
back-end (lado do servidor): *
Hash de senha: Use um forte algoritmo de hash como BCRYPT, ARGON2 ou SCRYPT (não MD5 ou SHA1, que são considerados quebrados). As bibliotecas estão prontamente disponíveis para todos os principais idiomas.
*
geração de sal: Gerar um sal exclusivo para cada senha. O sal é um valor aleatório combinado com a senha antes do hash. Isso evita ataques de mesa do arco -íris.
*
armazenamento de senha: Armazene o * hash * e * sal * em seu banco de dados, nunca a senha de texto simples.
*
Redefinir geração de token: Quando uma redefinição for solicitada, gere um token aleatório único (por exemplo, um UUID) e associe -o ao usuário no banco de dados. Inclua um registro de data e hora para expirar o token após um certo período (por exemplo, 1 hora).
*
Envio de e -mail: Use uma biblioteca ou serviço para enviar e -mails. Certifique -se de que seus e -mails sejam formatados corretamente e não pareçam spam.
* Validação do token: Quando o usuário clicar no link de redefinição, valide o token em relação ao banco de dados, verificando que existe, não expirou e está associado ao usuário correto.
*
Atualização de senha: Após a validação bem -sucedida, permita que o usuário insira uma nova senha, a hash com um novo sal e atualize o banco de dados. Invalidar ou excluir o token de redefinição.
*
front-end (lado do cliente): *
Formulários seguros: Use https para criptografar a comunicação entre o navegador e o servidor.
*
Medidor de força de senha: Forneça feedback visual ao usuário sobre a força de sua senha.
*
Campo de confirmação: Exige que o usuário insira a nova senha duas vezes para evitar erros de digitação.
Exemplo (conceitual python/django): `` `Python
de django.contrib.auth.hashers import make_password, check_password
de django.contrib.auth.models importa o usuário de importação
importar uuid
importar datetime
def Reset_password_request (email):
tentar:
usuário =user.objects.get (email =email)
reset_token =uuid.uuid4 ()
user.profile.reset_token =reset_token # assumindo que você tem um modelo de uso do usuário
user.profile.reset_token_expiry =dateTime.dateTime.now () + dateTime.timedelta (horas =1)
user.profile.save ()
# Enviar e -mail com reset_token
send_password_reset_email (user.email, reset_token)
retornar verdadeiro
Exceto user.doesnotexist:
Retorne false # ou lide com o erro adequadamente
def verify_reset_token (token):
tentar:
user =user.objects.get (perfil__reset_token =token, perfil__reset_token_expiry__gt =dateTime.dateTime.now ())
Retornar usuário
Exceto user.doesnotexist:
retornar nenhum
def set_new_password (usuário, new_password):
user.password =make_password (new_password) # hash a nova senha
user.profile.reset_token =nenhum # invalida o token
user.profile.reset_token_expiry =Nenhum
user.profile.save ()
User.Save ()
`` `
Considerações importantes de segurança: *
https: Sempre use https para criptografar a comunicação.
*
Limitação da taxa: Implementar a limitação da taxa para evitar ataques de força bruta no terminal de redefinição de senha.
* Expiração do token: Defina um tempo de validade razoável para os tokens de redefinição.
*
log: LOG PASSET RESET SOITOS E TENTAÇÕES PARA FINS FINS DE AUDITAÇÃO.
*
auditorias de segurança regulares: Revise periodicamente sua implementação de redefinição de senha para identificar e corrigir possíveis vulnerabilidades.
*
Princípio do menor privilégio: Conceda apenas as permissões mínimas necessárias aos administradores que podem iniciar as redefinições de senha.
Em resumo, conhecer a senha existente de um usuário deve * nunca * ser usado para redefini -la. Use os métodos seguros, iniciados pelo usuário ou iniciados pelo administrador (forçando a alteração no próximo login) descritos acima para proteger as contas de usuário e manter um sistema seguro.