Olá
pessoal, hoje eu vou falar e mostrar como fazer senhas fortes usando a
linguagem C#. Antes de começar a mostrar e explicar o código, é importante
entender porque precisamos de senhas fortes e a atualização periódica.
Como arquiteto
de software e professor de faculdade, os profissionais estão se formando e
entrando no mercado de trabalho sem dar importância no uso de criptografia de
dados, senhas criptografadas e segurança da informação. Isso me preocupa porque
qualquer hacker que tente entrar na aplicação, site ou sistema construído, usando
a forma mais básica de invasão, eles conseguem entrar.
Já
falei em outros artigos a importância de criptografar dados, criptografar banco
de dados e senhas de acesso por exemplo: na string de conexão com o banco de
dados e dados dos usuários. Os dados pessoais não podem estar expostos
facilmente. Os dados pessoais são tão importantes quanto o sistema, na minha
opinião mais importantes do que o sistema em si (opinião pessoal). Nenhum
programador ou analista de sistemas que sai da faculdade importa com a
segurança dos dados e a segurança no momento de programar. Só quer ver o software
funcionando e nada mais.
Além de
criptografar dados, é necessário fazer com que o usuário digite senhas
difícieis, senhas com letras, números, caracteres especiais e mais. Para isso, os
programadores precisam ajudar os usuários que usam o software, ajudar no
sentido de cadastro, travamento de senhas fáceis e tudo mais. O software veio
para facilitar a vida do usuário e não complicar, mas o grande problema são os
hackers ou os programas que os hackers fazem. Eles utilizam métodos para forçar
a senha usando as mais óbvias como 12345 e outras. O software não pode deixar
que isso aconteça, deve travar todo tipo de solicitação fácil de senha.
O que vou mostrar aqui é um passo
a passo usando C# e o primeiro passo é verificar se a senha está entre 6 e 12
caracteres. Lembro que é um exemplo apenas. Listagem 1.
Listagem 1 – Verifica a quantidade de caracteres existentes
na senha digitada.
if (senha.Length < 6 || senha.Length > 12)
A senha
digitada deve ter entre 6 e 12 caracteres, isto é, o mínimo são 6 e o máximo
são 12 caracteres. A variável senha é do tipo string.
O
segundo passo é verificar se existe pelo menos um número digitado, nesse caso,
é importante ter pelo menos um número digitado na senha. Veja a listagem 2.
Listagem 2 – Verifica se existe pelo menos um número na
senha.
if (!senha.Any(c
=> char.IsDigit(c)))
O terceiro passo é
verificar se o usuário digitou pelo menos uma letra maiúscula, no nosso caso,
quanto mais misturar letras, números, maiúsculos e minúsculos melhor. A
listagem 3 mostra se existe letras maiúsculas.
Listagem 3 – Verifica se existe pelo menos uma letra
maiúscula.
if (!senha.Any(c => char.IsUpper(c)))
O quarto
passso é simples como o terceiro, só verifica se existe algum valor com
caracter minúsculo. É necessário ter pelo menos 1 minúsculo. Veja a listagem 4.
Listagem 4 – Verifica se existe pelo menos um caracter
minúsculo.
if (!senha.Any(c
=> char.IsLower(c)))
O quinto passo é
interessante. Hoje existem pessoas que estão colocando caracteres especiais nas
senhas, como #, $, %, espaço e tudo mais. Esses caracteres podem ser
verificados se você quiser, basta verificar a existência de pelo menos um
caracter especial, veja a listagem 5.
Listagem 5 – Verifica se existe algum caracter especial.
if (!senha.Any(c
=> char.IsSymbol(c)))
Existem
sistemas que não permitem caracteres especiais, pra isso você precisa verificar
se o que foi digitado não existe caracter especial. Se existir algum caracter
especial, o sistema indica retorna ao usuário. Esse código é simples também,
veja a listagem 6.
Listagem 6 – Verifica se não existe algum caracter especial.
if (!(senha.All(c
=> char.IsLetter(c) || char.IsDigit(c))))
Note que a listagem 6
verifica se a senha existe além de letra e número, outro caracter. Não
existindo só letra e número, o sistema solicita nova senha ao usuário
explicando que não pode colocar caracter especial. O caracter espaço não é
aceito.
Já desenvolvi
sistemas que por regra não podem repetir mais de duas letras iguais na senha.
Isso faz com que a mesma letra repita apenas duas vezes, se tiver mais do que
duas o sistema pede para o usuário alterar. Nesse caso, é necessário fazer uma
laço e verificar se tem a mesma letra repetida mais de duas vezes. Veja a
listagem 7.
Listagem 7 – Verifica se existe mais que dois caracteres
repetidos.
var contadorRepetido = 0;
var ultimoCaracter = '\0';
foreach(var c in senha)k
{
if (c == ultimoCaracter)
contadorRepetido++;
else
contadorRepetido = 0;
if (contadorRepetido == 2)
return false;
ultimoCaracter = c;
}
Tudo
que foi falado aqui serve para que você, utilizar no seu software, sistema ou
site. Foi verificado todos os caracteres para que a senha do usuário fique
forte e ao mesmo tempo difícil de descobrir por um hacker. É lógico que, com
uma senha difícil pode ser que o usuário esqueça facilmente. É bom criar um
envio de senha por e-mail ou celular, assim fica simples no caso de
esquecimento.
A minha
dica é: coloque todas essas verificações dentro de um método do tipo estático,
com parâmetro de entrada do tipo string e retorno Boolean. A listagem 8 mostra
um exemplo.
Listagem 8 – Método completo
public static
Boolean verificaSenhaForte(string senha){
if (senha.Length < 6 || senha.Length
> 12)
return false;
if (!senha.Any(c =>
char.IsDigit(c)))
return false;
if (!senha.Any(c =>
char.IsUpper(c)))
return false;
if (!senha.Any(c => char.IsLower(c)))
return false;
if (!senha.Any(c => char.IsSymbol(c)))
return false;
var contadorRepetido = 0;
var ultimoCaracter = '\0';
foreach(var c in senha)k
{
if (c == ultimoCaracter)
contadorRepetido++;
else
contadorRepetido = 0;
if (contadorRepetido ==
2)
return false;
ultimoCaracter = c;
}
return true;
}
Espero
que tenha gostado de tudo que foi explicado aqui. Foi um bom aprendizado,
aproveite o que aprendeu e coloque em seu software para assegurar que usuários
usem senhas difícieis para os hackers.