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:
Crie uma sigla a partir de uma informação fácil de lembrar. Por exemplo, escolha uma frase significativa para você, assim usando o Nascimento do meu filho é 12 de dezembro de 2004. Usando essa frase como guia, você pode usar Nmfe12/Dez,4 como senha.
Substitua números, símbolos e ortografia incorreta por letras ou palavras em uma frase fácil de lembrar. Por exemplo, Nascimento do meu filho é 12 de dezembro de 2004 pode se tornar NasMe F1lhOeh 12124 (não é errado usar espaços na senha).
Associe a senha a um hobby ou esporte predileto. Por exemplo, Eu amo jogar badminton pode ser 4mJo6arB@dm1nt()n.
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:
1 Label - Senha Gerada
1 TextBox - Multiline=True , txtSenha
1 Label - Tamanho da Senha
1 TextBox - txtTamanhoSenha
1 PictureBox
4 Buttons - btnGerarSenha1, btnGerarSenha2, btnGerarSenha3 e btnGerarSenha4
Abaixo leiaute do formulário:
Vamos definir os namespaces usados no projeto:
using
System;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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação Orientada a Objetos com VB .NET
Criptografando e descriptografando Senhas... - Macoratti.net