.NET

3 mar, 2017

Criptografia na plataforma .NET – Usando as funções de Hash

Publicidade

Nesta aula do curso, 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 que estão 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 a origem da informação.

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

  • HMACSHA1
  • MACTripleDES
  • MD5CryptoServiceProvider
  • SHA1Managed
  • SHA256Managed
  • SHA384Managed
  • SHA512Managed

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

Criaremos 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 está 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: Visual Studio Community 2015

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

Criando o projeto no VS Community

Abra o VS Community 2015 e clique em New Project. Depois, selecione a linguagem Visual C# e o template Windows Forms Application. Informe o nome Net_Hashing e clique no botão OK. Já no formulário form1.cs do projeto, inclua os seguintes controles a partir da ToolBox:

  • 2 Label
  • 1 TextBox – txtTexto
  • 1 TextBox – txtHash , multiline = True
  • 4 Buttons – btnGeraHashSHA512 , btnGeraHashMD5 e btnGeraHashRIPEMD160

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:

  • O método GerarHash – gera um hash usando o algoritmo especificado;
  • O método VerificarHash – verifica o hash gerado para o texto informado com o hash original;
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:

Algoritmo SHA512

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

Algoritmo MD5

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

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 abaixo de cada uma das implementações.

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

No próximo artigo, vamos continuar a ver as demais técnicas de criptografia.

Pegue o projeto completo aqui: Net_Hashing.zip