Como você deve saber, os hackers estão por toda parte e querem invadir tudo. Você foi solicitado a criar requisitos de senha que impedirão qualquer hacker . O problema é que o seu chefe ouviu que pagar pelo LOC é ruim e ele paga entre US $ 1800 e US $ 0,03 * caracteres inseridos por mês para fazer você escrever a coisa mais simples possível. Portanto, você deve usar um pequeno número de caracteres (provavelmente muito pequeno) ou esquecer o dinheiro. Além disso, seu chefe não se importa com o idioma que você usará.
Os requisitos para boas senhas são semelhantes aos do artigo mencionado, exceto que os requisitos baseados em dicionário foram removidos para evitar que a solução dependa de arquivos externos, você não precisa verificar se as letras estão sendo reorganizadas (Difícil entender o que realmente significa), a última regra é removida (O que é 3/4?) e não verifica senhas antigas.
Os requisitos exatos após a remoção de determinados requisitos do artigo vinculado são:
- tenha pelo menos 8 caracteres!
- não deve ter mais de 12 caracteres!
- ter caracteres maiúsculos e minúsculos!
- não tenha mais que 8 letras maiúsculas!
- não tenha mais que 8 letras minúsculas!
- tenha pelo menos 2 letra (s)!
- tenha uma letra principal!
- tenha pelo menos 1 dígito (s)!
- não seja seu nome de usuário!
- não seja seu nome de usuário para trás!
- não contém seu nome de usuário!
- não contém seu nome de usuário para trás!
- não tenha mais que 1 par (es) de caracteres repetidos!
- não tem 3 ocorrências do mesmo personagem!
- não contém quilates (^)
- não contém espaço
- não contém =
- não conatain &
- Não contém #
- Não contém ,
- não conatain ;
- Não contém "
- não contém>
- não contém <
- Não contém [
- não contém |
- Não contém )
Todos os erros ortográficos nesta lista foram deixados como estão.
$ ./checkpass
Username: John
Password: L!]E2m69
OK.
$ ./checkpass
Username: John
Password: JohnnhoJ12
Nope.
$ ./checkpass
Username: JOE.smith
Password: JOE!smith123
OK.
O código mais curto ganha dinheiro (enviado como arquivo JPG). Ele deve mostrar "Nome de usuário:" e "Senha:" solicita e responde com a mensagem exata.
1
(dígito um) em vez de ell.Respostas:
Perl,
203194189193 caracteresAqui está minha opinião do Perl sobre o problema:
As expressões regulares verificam, em ordem, se a senha:
começa com uma letra, tem oito a doze caracteres
contém um dígito
contém uma letra maiúscula
tem oito ou menos letras maiúsculas
tem oito ou menos letras minúsculas
contém uma letra minúscula
não contém nenhum dos sinais de pontuação proibidos, três ocorrências de qualquer caractere, mais de uma ocorrência de um caractere duplicado, o nome de usuário ou o nome de usuário invertido.
(Agradecemos a Peter Taylor por apontar um bug na versão de 189 caracteres.)
fonte
use v5.10;
e ele falha no meu caso de teste "são regexes escaparam corretamente". Veja ideone.com/QKFnZ\Q$u\E|\Q$n
(a última\E
pode ser ignorada, se essa parte for movida para o final).(.)(.*\1.*\1|\1.*(.)\3)
(não testado - não vou tentar criar uma bateria de teste completa com ideona).Ruby, 270 caracteres
Uma implementação ruby baseia-se em doze expressões regulares. Cada expressão é uma correspondência positiva (cinco primeiras) ou negativa (sete últimas). Como restrição, o nome de usuário pode conter apenas letras ou dígitos.
Correspondências positivas de expressões regulares:
/^.{8,12}$/
: tenha pelo menos 8 caracteres !, não deve ter mais de 12 caracteres!/\p{Lower}/
e/\p{Upper}/
: possuem caracteres maiúsculos e minúsculos!/^(\p{Alpha}.*){2}/
: tenha pelo menos 2 letra (s) !, tenha uma letra à esquerda!/\d/
: tenha pelo menos 1 dígito (s)!Correspondências de expressões regulares negativas:
/(\p{Lower}.*){9}/
: não ter mais de 8 letras minúsculas!/(\p{Upper}.*){9}/
: não ter mais de 8 letras maiúsculas!/(.)\1.*(.)\2/
: não tenha mais que 1 par (es) de caracteres repetidos!/(.).*\1.*\1/
: não tem 3 ocorrências do mesmo personagem!/[ ^=&#,;"<>\[|)]/
: não contém circunflexo, espaço, =, &, #, ,,;, ",>, <, [, |,)/#{u}/
: não seja seu nome de usuário !, não contenha seu nome de usuário!/#{u.reverse}/
: não seja seu nome de usuário para trás !, não contenha seu nome de usuário para trás!fonte
Python 3, 291 bytes / caracteres
Mais bem formatado e comentado:
Você pode encontrar esta solução em ideone.com , mas a saída parece um pouco feia porque não mostra a entrada predefinida ou mesmo quebras de linha. Além disso, a combinação de nome de usuário e senha
"JOE.smith"
-"JOE!smith123"
atualmente é inserida como dados de entrada fixos.Eu adicionei uma repartição de todas as verificações como saída de depuração.
fonte