Como implementar com segurança o login automático

15

Eu li muitas, muitas, muitas postagens sobre como "você provavelmente está armazenando senhas erradas". Eles estão sempre se referindo ao armazenamento de senhas em um servidor no qual o usuário está registrando; Eles basicamente reescrevem (trocadilho intencional) conselhos onipresentes como certifique-se de sal as senhas, etc. etc. No entanto, eu nunca vi um artigo sobre as melhores práticas para armazenar senhas em um cliente para que o cliente não precisa fazer o login manualmente toda vez que quiser fazer login; o recurso "lembre-se de mim".

Muitos softwares têm esse recurso, de navegadores a programas como o Dropbox.

Eu li um artigo antigo recentemente, sobre como o Dropbox armazenava um ID no seu computador que você poderia simplesmente copiar / colar em outro computador e iniciar o Dropbox e estar logado como o dispositivo do qual você obteve o ID; sem login, sem nada e acesso total à conta do Dropbox. Isso parece um design realmente estúpido, mas não consigo pensar em nenhuma maneira melhor de fazê-lo.

Eu nem sei como evitar armazenar algo como um cookie em texto simples. 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 login automático e fazer o usuário digitar sua senha toda vez que quiser usar um serviço, mas essa é uma dificuldade de usabilidade e os usuários não podem esperar faça 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 "keychain" que algumas distribuições de linux possuem).

    
por Jay Simon 05.06.2013 / 10:36
fonte

4 respostas

12

Um caminho é:

  • Quando o usuário faz login, armazene um ID de sessão em um cookie no computador do cliente (não o nome de usuário ou a senha).
  • Amarre a sessão ao endereço IP, de modo que um ID de sessão individual funcione apenas com o computador em que foi iniciado.

Dependendo de qual estrutura você está usando para desenvolver seu site, esse comportamento pode estar disponível como um recurso interno.

Observe que, como o protocolo HTTP é sem estado, não há diferença funcional entre manter alguém logado durante uma única sessão de uso do site e "login automático" na próxima vez que usar o site; é apenas uma questão de quanto tempo você permite 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 muito bem para usuários que alteram muito o endereço IP. No entanto, ele fornece um nível maior de segurança e pode ser útil em algumas situações.

    
por 05.06.2013 / 11:12
fonte
5

A Amazon (e muitos outros) usam uma abordagem híbrida. Eles fornecem autologin para navegação, adicionando itens ao carrinho e fazendo pedidos usando combinações de endereço de entrega / crédito que você usou antes. No entanto, eles exigem que você insira sua senha para muitas ações, como adicionar cartões de crédito, adicionar / alterar endereços de envio, atualizar senhas, visualizar pedidos anteriores (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 seqüestrar 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, tenho problemas maiores do que as pessoas roubando as sessões médias do site.

Se você tiver partes de seu aplicativo que não precisam de segurança tão alta, escolha um modelo híbrido onde armazene um ID de sessão (hash ou o que quiser, se quiser) para fazer o login automático de usuários em partes de baixa segurança do site, mas exigem que eles insiram a senha quando inserem áreas de segurança mais altas e excluem o token de alta segurança quando a sessão termina.

Claro que se este for um site de 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 invadida. Se você achar que não é o caso da sua aplicação, não implemente logins automáticos. Você precisa acessar o nível de segurança / usabilidade que é adequado para o seu caso de uso.

    
por 21.06.2013 / 18:50
fonte
2

Na verdade não é tão difícil. Primeiro, armazene um cookie com este formato:

userID.token

Você pode usar um hash sha1 para o token. Em seguida, no seu userID da tabela de banco de dados remember_me_tokens, 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 configurado, veja se há uma linha válida para ele no banco de dados nos últimos sete dias. 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 de cookie / banco de dados correspondente e gere uma nova linha de cookie / token / banco de dados.

Se eles fizerem logout, exclua o cookie.

Execute um cron job para remover o arquivo remember_me_tokens com mais de 7 dias.

    
por 05.06.2013 / 11:04
fonte
0

Você só pode confiar no dispositivo em que você o armazena. Cabe ao usuário (se você não pode influenciar o dispositivo) como ele é seguro. Está simplesmente fora de suas mãos.

Como afirmado nos comentários:

It is about what you trust. If you don't trust the machine store the ID then that is your issue. If you trust the keychain then that is the maximum security you will get. Off course you could add some custom safety like detecting device hardware or something but it's all fake-able so you cannot know in the end. It is out of your control.

    
por 05.06.2013 / 11:21
fonte