Estou de acordo em adicionar uma verificação quando as pessoas escolherem uma senha, para que “a senha não deve conter o nome de usuário em minúsculas”. Parece razoável para mim.
Já verificamos se password = username, mas não sou muito fã de testes de substring, especialmente para nomes de usuário mais curtos. E se seu nome de usuário for “Ed” e sua senha for uma string aleatória que, por acaso, contiver “ed”..
Usando uma pontuação de similaridade como a distância de Levenshtein, rejeitar se levenshtein(username, password) < 6? Ou até mesmo algo para detectar permutações também, como isso:
Parece que isso cobriria os piores abusos, sem impedir que “Ed” se cadastre com uma senha longa e boa, e é fácil explicar com precisão: “seu nome de usuário e sua senha são muito semelhantes”. Não procurei casos de borda indesejados, mas não consigo pensar em nenhum no momento.
O outro lado da moeda de regras “cada vez mais” é que se torna mais fácil forçar senhas por força bruta.
Claramente, nenhuma senha deve ter a letra z repetida 10 vezes se tiver 15 caracteres ou menos.
Claramente, nenhuma senha deve conter a palavra “senha”. Se for menor que 12 caracteres.
Duas palavras de dicionário seguidas, claramente errado…
E assim por diante. Assim, o espaço de busca por senhas diminui.
Essa é uma toca de coelho; mudei de ideia desde ontem, depois de pensar sobre isso. Concordo com @codinghorror: não acho que precisemos fazer nada aqui.
“É difícil criar boas regras, então não devemos criar regras”?
Esta é a segunda vez em dois dias que vejo membros de alto nível da equipe do Discourse espalhando equívocos graves sobre segurança. Acredito que há algumas questões gerais que vocês precisam repensar e espero que levem isso como um feedback construtivo.
Além disso, essa sugestão específica não surgiu do nada: recentemente, uma conta de usuário foi comprometida porque o nome de usuário era myusername e a senha tinha o formato myusername46.
É verdade que se tratava de um site ClassicPress (mesma estrutura de login do WordPress), o que o torna muito mais “alvo fácil” em termos de bots, etc. No entanto, isso é algo que os bots procuram.
Regras de senha não podem prevenir todos os tipos de senhas ruins, mas podem fazer muita diferença.
Tecnicamente, estamos seguindo as diretrizes do NIST 800-63-B:
Ao processar solicitações para estabelecer e alterar segredos memorizados, os verificadores DEVERÃO comparar os segredos prospectivos com uma lista que contenha valores conhecidos por serem comumente usados, esperados ou comprometidos. Por exemplo, a lista PODE incluir, mas não se limita a:
Senhas obtidas de corpora de violações anteriores.
Palavras de dicionário.
Caracteres repetitivos ou sequenciais (por exemplo, ‘aaaaaa’, ‘1234abcd’).
Palavras específicas do contexto, como o nome do serviço, o nome de usuário e seus derivados.
Eles usam explicitamente a palavra PODE, e não DEVE. Portanto, isso fica a nosso critério. Não há nenhuma recomendação sobre a distância de Levenshtein aqui. Talvez se o nome de usuário tiver mais de 6 caracteres, ele não deve ser incluído na senha — talvez pudéssemos adicionar uma verificação de entropia além da lista de 1 milhão de senhas. Não sei.
Acho que, se você estiver muito interessado em ter suas próprias regras aqui, execute um SSO e estabeleça as regras que desejar do seu lado. Ou desenvolva um plugin.
Provavelmente é isso que vamos fazer. Ainda há mais coisas faltando aqui, mas as respostas até agora não me fazem pensar que valha a pena levantar o assunto.
Por favor, compartilhe o plugin que você criou com a comunidade aqui na categoria #plugin. Nem todos concordam com todas as decisões que tomamos; respeito totalmente a diversidade e as opções. Talvez outros se interessem por regras de senha mais rigorosas.