C#  -  Solicitando uma senha para executar o programa


 Neste artigo vou mostrar uma estratégia para solicitar a senha na execução de um programa C#.

A abordagem de exibir um formulário para que seja informada uma senha antes de executar um programa geralmente usa a seguinte lógica:
  • Ao iniciar o programa principal é apresentando um formulário onde o usuário deve informar uma senha;
  • Ao receber a senha o prorama compara o seu valor com um valor que esta armazenado no programa e verifica se a senha esta correta;

Essa abordagem é a mais simples e a mais usada, mas esta estratégia obriga que o programa tenha a senha no seu código e mesmo o mais iniciante dos hackers poderá facilmente quebrar o código e obter a senha.

Pensando nisso este artigo trás uma abordagem um pouco mais segura (não infalível).

Ao invés de armazenar a senha no código do programa , o programa vai armazenar um token e sua encriptação usando uma senha.

Ao informar a senha no formulário de acesso o programa vai usar a senha para criptografar o token e assim comparar o resultado com o valor criptografado que esta salvo no programa. Se os valores forem iguais então o programa vai considerar que a senha informada esta correta.

Dessa forma o programa não precisa armazenar a senha e não há como um hacker obter o seu valor.

A seguir vou mostrar um forma bem simples de implementar isso.

Recursos Usados

Criando o projeto Windows Forms

Abra o VS 2017 Community e crie um novo projeto (File-> New Project) usando a linguagem C# e o template Windows Forms App (.NET Framework).

Informe um nome a seu gosto. Eu vou usar o nome WF_SenhaSegura;

No menu Project clique em Add Windows Forms e informe o nome frmAcesso. Nesse formulário inclua os seguintes controles:

  • 1 Label - Text=Informe a senha
  • 1 TextBox - txtSenha
  • 1 Button - btnAcessar , DialogResult = OK
  • 1 Button - btnCancelar , DialogRegult = Cancel

Disponha os controles conforme o leiaute da figura abaixo:

A seguir selecione o formulário Form1.vb e partir da ToolBox inclua um controle Label com o texto : Bem-Vindo !!!

Neste formulário inclua no evento Load o código abaixo:

Este código faz o seguinte:

1- Define o token de acesso e a senha cifrada que será comparada com o resultado da cifragem da senha que vamos realizar.

2- Cria uma instância de frmAcesso para apresentar o formulário onde o usuário informa a senha

3- Se o usuário clicar em Cancelar então fecha o formulário

4- Obtem a senha informada no formulário

5- Verifica se a senha cifrada usando o token é diferente da senha cifrada, neste caso encerra caso contrário exibe o formulário da aplicação.

O código usa o método Cifrar da classe Seguranca cujo código é o seguinte:

    public class Seguranca
    {
        public static string Cifrar(string senhaInformada, string token, bool usarHashing)
        {
            byte[] keyArray;
            byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(senhaInformada);
            byte[] resultArray;           
            //voce pode armazenar o token em um arquivo de configuração
            //token = ConfigurationManager.AppSettings.Get("SecurityKey");
            if (usarHashing)
            {
                MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
                keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(token));
                hashmd5.Clear();
            }
            else
            {
                keyArray = UTF8Encoding.UTF8.GetBytes(token);
            }
            TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
            tdes.Key = keyArray;
            tdes.Mode = CipherMode.ECB;
            tdes.Padding = PaddingMode.PKCS7;
            ICryptoTransform cTransform = tdes.CreateEncryptor();
            resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
            tdes.Clear();
           return Convert.ToBase64String(resultArray, 0, resultArray.Length);
        }
}

Este código cifra a senha usando o token e retorna uma string cifrada que deve ser igual ao conteúdo da variável senhaCifrada se a senha estiver correta.

A implementação da cifragem pode variar a vontade. O código que eu usei foi pego na web o que importa é a ideía.

Executando o projeto e informando a senha correta iremos obter:

Dessa forma a senha não esta sendo armazenada na aplicação.

Pegue o projeto completo aqui :  WF_SenhaSegura.zip

"Disse-lhe Jesus: Eu sou o caminho, e a verdade e a vida; ninguém vem ao Pai, senão por mim."
João 14:6

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