Desenvolvimento - C#
Explorando classes de criptografia
Existem duas formas básicas de criptografia: simétrica e assimétrica. Neste artigo iremos falar sobre a criptografia simétrica.
por Rodrigo S. DoniniAlguns desenvolvedores se questionam sobre como montar uma forte camada de segurança dentro de uma aplicação, como criptografar dados e que algoritmos usar. O .Net Framework conta com a namespace System.Security.Cryptography que possui uma série de classes que podem lhe auxiliar ao implementar este tipo de rotinas, incluindo serviços de criptografia, encoder e decorder de dados e muitas outras operações como a criação de Hash.
Existem duas formas básicas de criptografia: simétrica e assimétrica. Neste artigo iremos falar sobre a criptografia simétrica.
Para criptografia de dados, iremos usar as seguintes classes: Rijndael, RC2, DES e TripleDES. Para criação de Hash de dados, iremos usar as seguintes classes: MD5, SHA1, SHA256, SHA384 e SHA512.
Faça download do fonte: CryptHash.zip
Figura 1: Modelo de interface para teste
Criando classes auxiliares para manipulação dos dados
Acompanhe o diagrama de classes, pode-se entender de forma fácil a lógica de uso das mesmas.
Figura 2: Diagrama de classes
Dentro de cada classe existem métodos complementares, cada qual com sua função específica, e também alguns enums dos tipos de algoritmos que usaremos para cada tipo de classe.
Usando as classes
Estas são classes auxiliares com métodos para criptografia e criação de hash de dados, o uso delas é bastante simples e não necessitam muitas explicações. Dentro do código, encontram-se quaisquer comentários adicionais para entendimento do funcionamento das rotinas, faça download do fonte do exemplo e confira, o mesmo também contém o help das classes. Acompanhe na listagem 1 um modelo de código com o uso destas classes.
string encryptedText = string.Empty;
string decryptedText = string.Empty;
string hashedText = string.Empty;
string plainText = "Lisiano Hacker";
string key = "Nasa";
Crypt _crypt = new Crypt(CryptProvider.TripleDES);
_crypt.Key = key;
encryptedText = _crypt.Encrypt(plainText);
decryptedText = _crypt.Decrypt(encryptedText);
Hash _hash = new Hash(HashProvider.SHA1);
hashedText = _hash.GetHash(plainText);Listagem 1: Modelo de uso das classes Crypt e Hash
Os Construtores
Os construtores das duas classes atribuem o tipo de algoritmo que será usado na criptografia e na criação do hash dos dados. O construtor padrão delas, sempre carrega um algoritmo padrão, cada classe com seu tipo.
Observações gerais
Em especial na classe Crypt, todos os algoritmos usados neste exemplo necessitam de um vetor de inicialização, nada mais é que uma matriz de bytes, valores usados internamente pela classe para gerar os dados criptografados em conjunto com a chave enviada. Acompanhe na listagem 2 a matriz de valores padrões carregando os valores em hexadecimal.
private void SetIV()
{
switch (_cryptProvider)
{
case CryptProvider.Rijndael:
_algorithm.IV = new byte[] { 0xf, 0x6f, 0x13, 0x2e, 0x35, 0xc2, 0xcd, 0xf9, 0x5, 0x46, 0x9c, 0xea, 0xa8, 0x4b, 0x73, 0xcc };
break;
default:
_algorithm.IV = new byte[] { 0xf, 0x6f, 0x13, 0x2e, 0x35, 0xc2, 0xcd, 0xf9 };
break;
}
}Listagem 2: (IV - Initialization Vector)
Conclusão
Dentro da namespace System.Security.Cryptography, existem ainda muitas outras classes que podemos explorar em um outro artigo. Descobrimos como usar alguns algoritmos de criptografia e criação de hash, montamos classes auxiliares para facilitar o uso destes recursos.
Como sempre, abaixo encontram-se as principais referências relacionadas.
Mais uma vez, fico a disposição para esclarecer dúvidas, inclusive se quiserem contribuir com melhorias e dicas para o artigo, bastam me enviar um e-mail ou comentar abaixo.
Um abraço e até a próxima!
Referências
System.Security.Cryptography Namespace
http://msdn2.microsoft.com/en-us/library/system.security.cryptography.aspx
DES Class
http://msdn2.microsoft.com/en-us/library/system.security.cryptography.des.aspx
RC2 Class
http://msdn2.microsoft.com/en-us/library/system.security.cryptography.rc2.aspx
Rijndael Class
http://msdn2.microsoft.com/en-us/library/system.security.cryptography.rijndael.aspx
TripleDES Class
http://msdn2.microsoft.com/en-us/library/system.security.cryptography.tripledes.aspx
MD5 Class
http://msdn2.microsoft.com/en-us/library/system.security.cryptography.md5.aspx
SHA1 Class
http://msdn2.microsoft.com/en-us/library/system.security.cryptography.sha1.aspx
SHA256 Class
http://msdn2.microsoft.com/en-us/library/system.security.cryptography.sha256.aspx
SHA384 Class
http://msdn2.microsoft.com/en-us/library/system.security.cryptography.sha384.aspx
SHA512 Class
http://msdn2.microsoft.com/en-us/library/system.security.cryptography.sha512.aspx