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:
		
			- 
			
			HMACSHA1
 
			- 
			
			MACTripleDES
 
			- 
			
			
			MD5CryptoServiceProvider
 
			- 
			
			SHA1Managed
 
			- 
			
			SHA256Managed
 
			- 
			
			SHA384Managed
 
			- 
			
			SHA512Managed
 
		
		
		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:
	- 
	
	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 :
	
		
		    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