Senhas, segundo fator e sessões
Armazenamento
Um algoritmo de hash de senha projetado para ser lento e com uso intenso de memória, com um salt por usuário. Nunca criptografia reversível e nunca um hash rápido.
Um comprimento mínimo razoável, uma verificação contra listas de senhas vazadas e sem rotação forçada periódica — ela leva a senhas piores.
Um segundo fator
Um app de autenticação ou uma chave de hardware. SMS é melhor do que nada, mas mais fraco. Guarde códigos de recuperação, e planeje um caminho de recuperação que não anule toda a proteção.
Sessões
Um token com expiração, uma opção de revogação no lado do servidor e uma lista de dispositivos conectados que o usuário vê e pode desconectar. Rotacione o identificador de sessão a cada login e a cada mudança de senha.
Indo mais fundo
Limite tentativas por conta e por origem, e adicione um atraso crescente. E alerte o usuário sobre eventos significativos — um login de um novo dispositivo, uma mudança de e-mail, o segundo fator desativado — porque o usuário costuma ser o primeiro a notar uma tomada de conta.