Eu li muitos, muitos, muitos posts sobre como "você provavelmente está armazenando senhas erradas". Eles estão sempre se referindo ao armazenamento de senhas em um servidor no qual um usuário está efetuando login; eles basicamente reformulam conselhos onipresentes como trocadilhos, etc. etc. No entanto, nunca vi um artigo sobre práticas recomendadas para armazenar senhas em um cliente, para que ele não precise fazer login manualmente toda vez que quiserem fazer login; o recurso "lembre-se de mim".
Muitos softwares possuem esse recurso, de navegadores a programas como o Dropbox.
Li recentemente um artigo antigo sobre como o Dropbox estava armazenando um ID no seu computador, que você poderia simplesmente copiar / colar em outro computador, iniciar o Dropbox e fazer login como o dispositivo do qual o ID foi obtido; sem login, sem nada e acesso total à conta do Dropbox. Parece um design realmente estúpido, mas não consigo pensar em nenhuma maneira melhor de fazê-lo.
Não tenho certeza de como evitar o armazenamento de algo como um cookie em texto sem formatação. Se você criptografá-lo, onde você armazena a chave para descriptografá-lo?
A única maneira que vejo para não introduzir vulnerabilidades de segurança é remover o recurso de login automático e fazer com que o usuário digite sua senha toda vez que quiser usar um serviço, mas isso é um esforço de usabilidade e os usuários ficam estragados ao esperar que não precisem fazer isso.
O que posso ler sobre o armazenamento local de credenciais com segurança para implementar o recurso de login automático? Se os princípios são simples demais para um artigo inteiro, quais são eles? O software em questão não deve depender de recursos não presentes em todas as plataformas (como o "chaveiro" que algumas distribuições Linux têm).
Respostas:
Uma maneira é:
Dependendo da estrutura que você está usando para desenvolver seu site, esse comportamento pode estar disponível como um recurso interno.
Observe que, como o protocolo HTTP não tem estado, de fato, não há diferença funcional entre manter alguém conectado durante uma única sessão de uso do site e o "login automático" na próxima vez em que usarem o site; é apenas uma questão de quanto tempo você concede antes que a sessão expire.
Atualização: Além disso, use HTTPS para aumentar a segurança, obviamente.
Atualização 2: observe que essa abordagem tem limitações, pois não funciona bem para usuários que alteram muito seu endereço IP. No entanto, ele fornece um nível aumentado de segurança e pode ser útil em algumas situações.
fonte
A Amazon (e muitas outras) usam uma abordagem híbrida. Eles fornecem logon automático para navegar, adicionar itens ao carrinho e fazer pedidos usando as combinações de endereço de entrega / cartão de crédito que você usou anteriormente. No entanto, eles exigem que você digite sua senha para várias ações, como adicionar cartões de crédito, adicionar / alterar endereços de entrega, atualizar senhas, visualizar pedidos passados (opcionalmente para o usuário) e muitas outras configurações de conta.
Então, sim, as pessoas que obtêm acesso ao seu computador podem invadir sua sessão, mas você ainda recebe o que elas pedem! (Mais importante, o incentivo para seqüestrar uma sessão é praticamente negado.) Mas se alguém tiver acesso ao meu computador, eu tenho problemas maiores do que as pessoas que roubam as sessões médias do site.
Se você possui partes de seu aplicativo que não precisam de alta segurança, pode escolher um modelo híbrido no qual armazena um ID de sessão (com hash ou o que desejar) para fazer login automático de usuários em partes de baixa segurança do site , mas exija que eles insiram a senha quando entrar nas áreas de segurança mais alta e exclua o token de alta segurança quando a sessão terminar.
Obviamente, se este é um site no nível bancário, o login automático não é uma opção. Novamente, os sites que usam esses tipos de segurança assumem o valor dos dados que estão protegendo e a conveniência adicional para o usuário pesa o risco potencial de uma sessão seqüestrada. Se você acha que esse não é o caso do seu aplicativo, não implemente logins automáticos. Você precisa acessar qual nível de compensação de segurança / usabilidade é apropriado para o seu caso de uso.
fonte
Na verdade, não é tão difícil. Primeiro armazene um cookie com este formato:
Você pode usar um hash sha1 para o token. Em sua tabela de banco de dados remember_me_tokens, armazene o ID do usuário, um hash bcrypt do token e a hora em que o token foi gerado.
Então, quando alguém visitar seu site, verifique se o cookie está definido. Se o cookie estiver definido, verifique se há uma linha válida no banco de dados nos últimos 7 dias, digamos. Se houver uma linha válida no banco de dados para o cookie, defina a sessão para indicar que o usuário está conectado e também exclua a linha correspondente de cookie / banco de dados e gere uma nova linha de cookie / token / banco de dados.
Se eles saírem, exclua o cookie.
Execute um trabalho cron para remover remember_me_tokens com mais de 7 dias.
fonte
Você pode apenas se confiar no dispositivo em que o armazena. Depende do usuário (se você não pode influenciar o dispositivo) o quão seguro ele é. Está simplesmente fora de suas mãos.
Como indicado nos comentários:
fonte