MiniCurso : Criptografia na plataforma .NET - Aula 3


    Usando as funções de Hash


Nesta aula do curso de vou mostrar como podemos implementar o algoritmo de hashing ou funções de hash na plataforma .NET usando uma classe genérica e a classe HashAlgorithm.

Para alcançar o objetivo da integridade dos dados um algoritmo de hashing ou função de hash pode ser aplicado aos dados sendo transmitidos. Essa operação vai gerar uma sequência de bytes que possui um tamanho fixo, que é conhecido como hash value ou valor de hash.

Para garantir a integridade dos dados o valor do hash tem que ser único e o algoritmo deverá sempre produzir o mesmo valor de hash para os mesmos dados transmitidos.

A criptografia hash é conhecida também como hash code ou message-digest. Esse tipo de criptografia não utiliza nenhuma chave criptográfica e é irreversível, ou seja, ao ser criptografada a mensagem não pode ser decodificada para sua forma original.

A figura abaixo exibe o processo de aplicar um algoritmo de hash :

Observe que o processo não protege a informação de ser interceptada e facilmente lida.  Além disso não estamos garantindo que a origem da informação.

Os algoritmos de Hashing incluídos na plataforma .NET são:

Vamos agora a um exemplo que mostra uma utilização do processo de hashing.

Vamos criar uma classe genérica com a ajuda da classe HashAlgorithm que representa a classe base a partir da qual todas as implementações de algoritmos de hash devem derivar.

Esta classe esta no namespace System.Security.Criptography e possui a seguinte hierarquia de herança:

Quando você herda a classe HashAlgorithm você deve substituir os seguintes membros: HashCore e HashFinal.

Recursos usados:

Nota: Baixe e use a versão Community 2015 do VS ela é grátis e é equivalente a versão Professional.

Criando o projeto no VS Community

Abra o VS Community 2015 e clique em New Project;

Selecione a linguagem Visual C# e o template Windows Forms Application;

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

No formulário form1.cs do projeto inclua os seguintes controles a partir da ToolBox:

Disponha os controles conforme o leiaute da figura abaixo:

Vamos agora criar uma classe chamada TrataHash via menu Project opção Add Class.

Abaixo vemos o código implementado na classe TrataHash onde temos :

    using System;
    using System.Security.Cryptography;
    using System.Text;
    class TrataHashGenerica
    {
        private HashAlgorithm _algoritmo;
        public TrataHashGenerica(HashAlgorithm algoritmo)
        {
            _algoritmo = algoritmo;
        }

        public string GerarHash(string senha)
        {
            var valorCodificado = Encoding.UTF8.GetBytes(senha);
            var senhaCifrada = _algoritmo.ComputeHash(valorCodificado);
            var sb = new StringBuilder();
            foreach (var caractere in senhaCifrada)
            {
                sb.Append(caractere.ToString("X2"));
            }
            return sb.ToString();
        }
        public bool VerificarHash(string senhaDigitada, string senhaCadastrada)
        {
            if (string.IsNullOrEmpty(senhaCadastrada))
                throw new NullReferenceException("Cadastre uma senha.");
            var senhaCifrada = _algoritmo.ComputeHash(Encoding.UTF8.GetBytes(senhaDigitada));
            var sb = new StringBuilder();
            foreach (var caractere in senhaCifrada)
            {
                sb.Append(caractere.ToString("X2"));
            }
            return sb.ToString() == senhaCadastrada;
        }
    }

O construtor da classe TrataHash recebe um parâmetro do tipo da classe HashAlgorithm e o atribui à variável _algoritmo.

Nota: HashAlgorithm é uma classe abstrata e todos os algoritmos hash .NET implementam essa classe.

Temos aqui o que é conhecido como o padrão de projeto injeção de dependência (DI), pois não acopla a classe TrataHash a um único algoritmo de hash.

Para testar a nossa implementação vamos usar os eventos Click de cada um dos botões de controle :

1- Algoritmo SHA512

        private void btnGeraHashSHA512_Click(object sender, EventArgs e)
        {
            txtHash.Text = "";
            var hash = new TrataHash(SHA512.Create());
            txtHash.Text = hash.GerarHash(txtTexto.Text);
        }

2- Algoritmo MD5

        private void btnGeraHashMD5_Click(object sender, EventArgs e)
        {
            txtHash.Text = "";
            var hash = new TrataHash(MD5.Create());	
            txtHash.Text = hash.GerarHash(txtTexto.Text);
        }
 

3- Algoritmo RIPDEM160

       private void btnGeraHashRIPEMD160_Click(object sender, EventArgs e)
        {
            txtHash.Text = "";
            var hash = new TrataHash(RIPEMD160.Create());
            txtHash.Text = hash.GerarHash(txtTexto.Text);
        }
 

Podemos ver o resultado exibido na figura ao lado de cada uma das implementações.

Para verificar o valor do hash basta usar o método VerificarHash passando o texto a ser gerado o hash e o texto original para comparação:  VerificarHash(string senhaDigitada, string senhaCadastrada)

Na próxima aula vamos continuar a ver as demais técnicas de criptografia.

Pegue o projeto completo aqui:  Net_Hashing.zip

Referências:


José Carlos Macoratti