C#  -  Gerando senhas aleatórias


 Neste artigo vou mostrar como gerar senhas aleatórias seguindo algumas definições dadas pelo usuário em um programa C#.

Neste artigo veremos como gerar senhas aleatórias com base em uma definição do usuário para critérios de formação da senha.

Vamos usar as caixas de seleção ou checkbox para indicar quais tipos de caracteres serão permitidos ou requeridos. Você pode inserir caracteres específicos na caixa de texto abaixo da última entrada, se quiser incluir um conjunto específico de caracteres.

Após realizar as definições informe o tamanho mínimo e máximo da senha e clique em Gerar Senha.

O programa usa as entradas fornecidas para gerar uma senha, a exibe na parte inferior e a seleciona para que você possa pressionar facilmente Ctrl+C para copiá-la para a área de transferência.

Se você não gostar da senha que o programa forneceu, basta clicar em Gerar Senha novamente para criar uma nova.

As caixas de seleção (checkbox) funcionam assim:

Quando você marca a caixa de seleção “Requer Caixa Baixa" , você também deve permitir letras minúsculas, assim o programa marca a caixa “permitir Caixa Baixa”.

Da mesma forma, se você desmarcar a caixa de seleção “Permitir Caixa Baixa”, não poderá exigir letras minúsculas, portanto, o programa desmarca a caixa “Requer Caixa Baixa”.

A lógica para as demais checkbox é a mesma.

O código usado para gerar a senha esta no evento Click do botão Gerar Senha :

Neste código chamamos o método GeraSenhaAleatorio para gerar a senha. Ao final a senha é exibida na caixa de texto txtSenha e com o foco no controle.

Abaixo temos o código do método GeraSenhaAleatoria :

        // Gera a senha conforme as definições
        private string GeraSenhaAleatoria()
        {
            const string CAIXA_BAIXA = "abcdefghijklmnopqrstuvwxyz";
            const string CAIXA_ALTA = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

            const string NUMEROS = "0123456789";
            const string ESPECIAIS = @"~!@#$%^&*():;[]{}<>,.?/\|";
            string outros = txtOutros.Text;
            if (chkRequerOutros.Checked && (outros.Length < 1))
            {
                MessageBox.Show("Você não pode exigir caracteres de uma string em branco.",
                    "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                txtOutros.Focus();
                return txtSenha.Text;
            }
            // Faz uma lista de caracteres permitidos
            string permitido = "";
            if (chkPermiteCaixaBaixa.Checked) permitido += CAIXA_BAIXA;
            if (chkPermiteCaixaAlta.Checked) permitido += CAIXA_ALTA;
            if (chkPermiteNumeros.Checked) permitido += NUMEROS;
            if (chkPermiteEspeciais.Checked) permitido += ESPECIAIS;
            if (chkPermiteSublinhado.Checked) permitido += "_";
            if (chkPermiteEspaco.Checked) permitido += " ";
            if (chkPermiteOutros.Checked) permitido += outros;
            // Obtem o numero de caracteres .
            int caracteres_minimo = int.Parse(txtMinimo.Text);
            int caracteres_maximo = int.Parse(txtMaximo.Text);
            int numero_caracteres = Crypto.RandomInteger(caracteres_minimo, caracteres_maximo);
            // Satisfaz as definições
            string _senha = "";
            if (chkRequerCaixaBaixa.Checked &&
                (_senha.IndexOfAny(CAIXA_BAIXA.ToCharArray()) == -1))
                _senha += RandomChar(CAIXA_BAIXA);
            if (chkRequerCaixaAlta.Checked &&
                (_senha.IndexOfAny(CAIXA_ALTA.ToCharArray()) == -1))
                _senha += RandomChar(CAIXA_ALTA);
            if (chkRequerNumeros.Checked &&
                (_senha.IndexOfAny(NUMEROS.ToCharArray()) == -1))
                _senha += RandomChar(NUMEROS);
            if (chkRequerEspeciais.Checked &&
                (_senha.IndexOfAny(ESPECIAIS.ToCharArray()) == -1))
                _senha += RandomChar(ESPECIAIS);
            if (chkRequerSublinhado.Checked &&
                (_senha.IndexOfAny("_".ToCharArray()) == -1))
                _senha += "_";
            if (chkRequerEspaco.Checked &&
                (_senha.IndexOfAny(" ".ToCharArray()) == -1))
                _senha += " ";
            if (chkRequerOutros.Checked &&
                (_senha.IndexOfAny(outros.ToCharArray()) == -1))
                _senha += RandomChar(outros);
            // adiciona os caracteres restantes aleatorios
            while (_senha.Length < numero_caracteres)
                _senha += RandomChar(permitido);
            // mistura os caracteres requeridos 
            _senha = RandomizeString(_senha);
            return _senha;
        }

Neste código definimos os grupos padrão de caracteres. Em seguida, criamos uma string contendo todos os caracteres permitidos. Para cada grupo de caracteres, ele verifica a caixa de seleção "permitir" correspondente e, se essa caixa estiver marcada, adiciona os caracteres corretos à string permitida. Usamos o método RandomChar para escolher um caractere aleatório do grupo apropriado.

Em seguida, o código obtém o tamanho mínimo e máximo da senha. Depois chama o método Crypto.RandomInteger para obter um comprimento para a senha entre esses limites.

A classe Crypto é um pouco extensa e seu código foi obtido de uma compilação de código encontrado em diversos sites.(Veja nos fontes do projeto)

Usamos também os métodos RandomChar() e RandomizeString(0 para gerar a senha.

Executando o projeto e definindo alguns critérios iremos obter:

Pegue o projeto completo aqui :  CShp_GeraSenhas.zip

(disse Jesus) - 'Porque o coração deste povo está endurecido,E ouviram de mau grado com seus ouvidos,E fecharam seus olhos;Para que não vejam com os olhos,E ouçam com os ouvidos,e compreendam com o coração,e se convertam,e eu os cure.'
Mateus 13:15

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 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

 

Referências:


José Carlos Macoratti