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