C# - Gerando Senhas Aleatórias


 Neste artigo vou mostrar como podemos gerar senhas aleatórias usando os recursos da plataforma .NET e da linguagem C#.

Existem muitos cenários onde precisamos gerar senhas e existem muitos fatores envolvidos neste processo como o tamanho da senha e a força da senha. Existem também muitos algoritmos que podemos usar para gerar senhas, e cada um deles tem sua particularidade, vantagem e desvantagem.

Senhas fracas podem ser descobertas por um único sistema de força bruta (tentativa e erro) enquanto você navegava nesta página.

A título de exemplo um sistema de testes da empresa Websense levou 39 segundos para adivinhar a senha dave123, considerada fraca. Se a combinação tivesse oito letras (todas maiúsculas ou todas minúsculas), o tempo para um computador potente adivinhar a sequência seria de 270 segundos, ou quatro minutos e meio. (fala sério, hein...)

Algumas dicas de como ter uma senha forte:

Facilite a memorização da sua senha forte, seguindo estas etapas:

Se você achar que deve anotar a senha para lembrá-la, não a identifique como uma senha e guarde-a em um lugar seguro.
( fonte : http://windows.microsoft.com/pt-br/windows-vista/tips-for-creating-a-strong-password acessando em janeiro de 2016)

Neste artigo eu mostro como gerar senhas usando os recursos da plataforma .NET e a linguagem C#.

Recursos usados :

Criando o projeto no VS 2015

Abra o VS Community 2015  e clique em New Project;

A seguir selecione Visual C# -> Windows -> Windows Forms Application;

Informe o nome Gerando_Senhas e clique no botão OK;

A partir da ToolBox inclua os seguintes controles no formulário form1.vb:

Abaixo leiaute do formulário:
 

 

Vamos definir os namespaces usados no projeto:

using System;
using
System.Text;
using
System.Windows.Forms;

A seguir vamos definir a variável que define o tamanho da senha e que deve ser visível em todo o formulário:

int TamanhoDaSenha = 8;

Vamos definir no evento KeyPress do TextBox txtTamanhoSenha o código que vai permitir somente a entrada de valores numéricos:

Permite somente valores números no TextBox

 

   private void txtTamanhoSenha_KeyPress(object sender, KeyPressEventArgs e)
   {
       e.Handled = (!char.IsDigit(e.KeyChar)) && (!char.IsControl(e.KeyChar));
   }

 

Agora vamos definir o método ValidaTamanhoSenha() que vai validar o tamanho da senha restringindo os valores entre 8 e 99:

 

        private void ValidaTamanhoSenha()
        {
            if (!string.IsNullOrWhiteSpace(txtTamanhoSenha.Text))
            {
                TamanhoDaSenha = Convert.ToInt32(txtTamanhoSenha.Text);
                if (TamanhoDaSenha > 99)
                {
                    TamanhoDaSenha = 99;
                    txtTamanhoSenha.Text = "99";
                }
                if (TamanhoDaSenha < 8)
                {
                    TamanhoDaSenha = 8;
                    txtTamanhoSenha.Text = "8";
                }
            }
            else
            {
                txtTamanhoSenha.Text = "8";
            }
        }


Agora em cada evento Click de cada um dos botões de comando vamos definir o código para gerar a senha:

 

1 - Gerar Senha com tamanho definido com base na entrada do usuário

 

        private void btnGerarSenha1_Click(object sender, EventArgs e)
        {
            ValidaTamanhoSenha();
            string validar = "abcdefghijklmnozABCDEFGHIJKLMNOZ1234567890@#$%&*!";
            try
            {
                StringBuilder strbld = new StringBuilder(100);
                Random random = new Random();
                while (0 < TamanhoDaSenha--)
                {
                    strbld.Append(validar[random.Next(validar.Length)]);
                }
                txtSenha.Text = strbld.ToString();
            }
            catch(Exception ex)
            {
                MessageBox.Show("Erro : " + ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

 

Neste código criamos um objeto Random e recebendo um caractere aleatório da cadeia válida que é anexado a um StringBuilder.

 

A classe Random, na definição da MSDN,  representa um gerador de números pseudo aleatório, um dispositivo que produz uma seqüência de números que atendem a certos requisitos estatísticos para aleatoriedade.

Esses números pseudo aleatório são escolhidos com probabilidade igual a partir de um conjunto finito de números. Os números escolhidos não são completamente aleatórios, porque um algoritmo matemático definido é usado para selecioná-los, mas são suficientemente aleatórios para fins práticos.

 

2 - Gerar Senha usando um Serviço de Criptografia

 

      private void btnGerarSenha2_Click(object sender, EventArgs e)
        {
            ValidaTamanhoSenha();
            string codigoSenha = DateTime.Now.Ticks.ToString();
            try
            {
                string senha = BitConverter.ToString(new System.Security.Cryptography.SHA512CryptoServiceProvider().ComputeHash(Encoding.Default.GetBytes(codigoSenha))).Replace("-", String.Empty);
                txtSenha.Text = senha.Substring(0, TamanhoDaSenha);
            }
            catch(Exception ex)
            {
                MessageBox.Show("Erro : " + ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
       }

 

 

Neste código calculamos o código Hash a partir dos ticks da data e hora e substituímos o caractere "-" por uma string vazia de forma a não termos o caractere na string. Após isso retornamos o número de caracteres a partir dos quais vamos gerar a senha. ( O namespace System.Security.Cryptography é usado para a criptografia. )

 

3 - Gerar Senha usando um GUID

 

       private void btnGerarSenha3_Click(object sender, EventArgs e)
       {
            try
            {
                ValidaTamanhoSenha();
                string guid = Guid.NewGuid().ToString().Replace("-", "");
                if (guid.Length > TamanhoDaSenha)
                {
                    txtSenha.Text = guid.Substring(0, TamanhoDaSenha);
                }
                else
                {
                    txtSenha.Text = guid;
                    txtTamanhoSenha.Text = guid.Length.ToString();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro : " + ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

 

Neste código estamos usando o struct Guid que representa um identificador único global: um valor de 16 bytes que gerado randomicamente irá gerar um identificador (quase) único.

 

4 - Gerar Senha Aleatória com tamanho definido

 

    private void btnGerarSenha4_Click(object sender, EventArgs e)
    {
            ValidaTamanhoSenha();
            string caracteresPermitidos = "abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789!@$?_-";
            char[] chars = new char[TamanhoDaSenha];
            Random rd = new Random();
            for (int i = 0; i < TamanhoDaSenha; i++)
            {
                chars[i] = caracteresPermitidos[rd.Next(0, caracteresPermitidos.Length)];
            }
            txtSenha.Text = new string(chars);
    }

 

Este código usa a mesma metodologia do primeiro método variando apenas a forma de implementação.

 

Ao executar o projeto podemos gerar senhas de 4 maneiras diferentes com resultados também distintos :

 

Pegue o projeto completo aqui :   Gerando_Senhas.zip

Porque a palavra da cruz é loucura para os que perecem; mas para nós, que somos salvos, é o poder de Deus.
1 Coríntios 1:18

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti