
La necesidad de encriptar (ocultar a simple vista) información no es necesidad propia en los sistemas de información, su inicio y apogeo fue marcado por las diversas guerras que hubo en la historia, se presume desde las campañas militares de los romanos hasta las últimas guerras mundiales.
¿Qué ha cambiado, en el presente? Pues que ahora contamos con computadores más potentes capaces de poder desencriptar (vamos a usar estos neologismos en la entrada, si prefiere, reemplazar por cifrar/descifrar) la información "oculta", utilizando fuerza bruta por ejemplo. Y desde hace décadas se tratado de mejorar y llevar al proceso de estandarización los algoritmos de encriptación.
Veamos, un ejemplo sencillo usando el método de encriptación CCQSMO cualquier cosa que se me ocurra:
La palabra Geeks.ms:
- Obtener el código Ascii: 7110110110711546109115
- Le sumamos 10 (clave) a cada código Ascii: 8111111111712556119125
- Volvemos a convertir a cadena, y tenemos nuestra cadena encriptada: Qoou}8w}
Obviamente hay algoritmos de encriptación, y hay "algoritmos". Vamos a repasar algunos de estos métodos y sus respectivas codificaciones, pero antes vamos diferenciar algoritmos de encriptación y métodos de cifrado Hash.
¿Se han preguntado porqué cuando se registran en algunos foros, al hacer un "recovery password", no me devuelve el password que he perdido, el sistema devuelve un nuevo password. ¿Por qué? Es que no esta usando un algoritmo de encriptación para ocultar el password, esta usando una función Hash, y es en un sólo sentido, en otras palabras, no se puede recuperar la cadena original a partir del password. ¿Entonces, cómo hace el match?, pues lo que hace no es desencriptar el password cifrado, para compararlo con el input del usuario, lo que hace es volver a cifrar/encriptar el input, y si el input cifrado coincide con el password cifrado que esta en la base de datos, entonces valida exitosamente tus credenciales. Mas detalles: Hash vs Encryption y Hashing vs. Encryption.
Hecho esta aclaraciones vamos a listar los métodos de criptografía, a los cuales podemos encontrar en dos grandes grupos:
1.a) Criptografía simétrica (en):
Estos algoritmos, usan una misma clave para encriptar/desencriptar el mensaje. En .Net tenemos el namespace: System.Security.Cryptography, para las operación de encriptación:
- DES, Data Encryption Standard, se considera inseguro para muchas aplicaciones debido a que su clave es de 56 bits, recientes algoritmos de claves simétricas usan claves de 128 bits. En este artículo: Encrypt/Decrypt String using DES in C#, usa la clase DESCryptoServiceProvider. También puede revisar este artículo: Simple Cryptographer - Simple DES/AES Implementation in C#, o este hilo del foro: Help with DES Encryption & Decryption using C#.Net, revisar la respuesta final de la primera página.
- 3DES, o Triple DES, que hace triple encriptación de DES. Se usa a través de la clase: TripleDESCryptoServiceProvider, puede ver algunos ejemplos en los siguientes artículos: Encryption/Decryption using RSA, DES, 3DES and Rijindael in VS.Net 2005 y Library Encrypt and Decrypt Methods Using TripleDES and MD5.
- AES, Advanced Encryption Standard o también conocido como Rijndael, es un esquema de cifrado por bloques y actualmente es el más popular dentro de los algoritmos simétricos, fue creado para reemplazar al DES. Este algoritmo es implementado usando la clase AesCryptoServiceProvider (only .Net 3.5), aquí algunos ejemplos: Visual Studio "Orcas": finally a BigInteger and a lot faster AES y .Net Encryption simple AES wrapper. Para las versiones anteriores del .Net Framework puede revisar los siguientes artículos: How To: Encrypt and Decrypt Data Using a Symmetric (Rijndael) Key (C#/VB.NET) y Simple Cryptographer - Simple DES/AES Implementation in C#.
- IDEA, International Data Encryption Algorithm, también usa el cifrado en bloques y aunque no encontré muchos ejemplos, encontré una implementación en C: IDEA.c. ¿Será por las patentes de este algoritmo lo tiene la empresa MediaCrypt y se necesita licencian para usarlo comercialmente? Por cierto la evolución de IDEA, es: IDEA NXT.
- Blowfish, usa bloques de 64 bits y claves que van desde los 32 bits hasta 448 bits. Hay una implementación: Markus Hahn, Blowfish.NET (según el autor del algoritmo Bruce Schneier, es una de las implementaciones más rápidas) y la otra implementación fue desarrollado por Russ Young: Blowfish.cs.
- Series RC, de Ron Rivest: , y aunque System.Security.Cryptography tiene una clase para RC2: RC2CryptoServiceProvider, no tiene una clase para la versión RC4, pero en SourceForge hay una librería: RC4.NET, también puede revisar estos artículos: RC4 Encryption Algorithm: C# Version y RC4 Encryption.
- Hay otros algoritmos que se quedaron en la cola (también de las referencias) en el proceso de creación del AES, sucesor del DES: CAST-256, CRYPTON, DEAL, DFC, E2, FROG, HPC, LOKI97, MAGENTA, MARS, RC6, Rijndael, SAFER+, Serpent, and Twofish. Leer más: Advanced Encryption Standard process.
1.b) Criptografía asimétrica (en):
Usa dos claves para el envió de mensajes, una clave pública y una clave privada. El destinatario del mensaje es el que posee estas dos claves, y envía la clave pública al remitente, y sólo con la clave privada (que tiene sólo el destinatario) puede desencriptar el mensaje.
- RSA, es uno de los más conocidos en criptografía asimétrica. En .Net podemos usar la clase RSACryptoServiceProvider, aquí un ejemplo: Public Key RSA Encryption in C# .NET, y RSA Encryption in C#.
- DSA, Digital Signature Algorithm, es un estándar para firmas digitales. En .Net podemos usar la clase DSACryptoServiceProvider, artículos: Hashing, MACs, and Digital Signatures in .NET.
- También revisar el algoritmo ElGamal, basado en el protocolo Diffie-Hellman. Y también revisar PKCS, Public Key Cryptography Standards.
2) Funciones de encriptación hash:
Como comenté al inicio, es encriptación (o cifrado) en un sólo sentido, no se puede recuperar el texto original a parte del texto encriptado. Además de tener la particularidad de generar un texto de un tamaño específico, siendo único cada contenido generado.
- MD5, Message-Digest algorithm 5, es ampliamente usado y dicen que parcialmente inseguro (ver detalles en wikipedia). En .Net tenemos la clase MD5CryptoServiceProvider, algunos artículos: HOWTO: Encode a password using MD5 in C# (or: howto calculate the MD5 hash for a string) y How to get MD5 hash in C# . NET, y como dicen en este último es similar a la función MD5 de Php.
- Serie SHA, Secure Hash Algorithm, existen varias series SHA-1, y en la familia SHA-2: SHA-224, SHA-256, SHA-384, y SHA-512. Donde la principal diferencia es el tamaño generado para el mensaje cifrado, como se puede ver en los resultados del siguiente artículo: NetSHA: a Complete SHA implementation for the .NET Framework using C#, .Net soporta los siguientes SHA-*: SHA1CryptoServiceProvider, SHA256CryptoServiceProvider, SHA384CryptoServiceProvider, y SHA512CryptoServiceProvider. Aquí un ejemplo de como usar SHA-1: SHA1 hash calculation in C#, también puede revisar el siguiente artículo: How To: Hash Data with Salt (C#/VB.NET).
- Si desea ver otras funciones Hash, las puede ver la siguiente lista: List of cryptographic hash functions.
Ahora que ya vimos, los algoritmos de encriptación y funciones hash. Vayamos con algunos ejemplos, y su aplicabilidad dentro del entorno .Net
a) Encriptando secciones del web.config, con estos artículos queda clarísimo: Cifrado de información en los archivos de configuración de ASP.NET y Encrypting Configuration Information in ASP.NET 2.0 Applications. Podemos usar dos providers: RSA o DPAPI, básicamente DPAPI es más segura por que esta atada a la máquina donde se realiza la encriptación (leer los comentarios de José M.A.). Pero el proveedor DPAPI (DpapiProtectedConfigurationProvider), qué algoritmo usa? Utiliza una API del sistema operativo llamada Windows Data Protection, y es expuesta a través de: Crypt32.dll (Win32).
b) ¿Que algoritmo de encriptación usa el servicio de membership de ASP.NET 2.0+? Si estamos usando el servicio de Membership de ASP.NET 2.0+, dentro del web.config, en el elemento membership, nosotros podemos definir el formato del password a almacenar en la base de datos, y puede ser de tres tipos: Clear, Encrypted, and Hashed. Clear, almacena el password en texto plano (por si me olvidó, o me gusta modificar el password directamente en la base de datos con un Open Table), Hashed para usar una función hash (en un sólo sentido), y Encrypted, para poder encriptar/desencriptar un password. ¿Qué implicancia tiene, usar Hashed o Encrypted?, pues que si estamos usando el control PasswordRecovery, con el formato Hashed no vamos a poder recuperar el password, lo que hará el control es generar un nuevo password, recuerden que Hash es un sólo sentido. ¿Qué algoritmos usa, y donde lo configuro? La configuración se hace en el elemento machineKey, y puedo usar las funciones hash MD5 y SHA1, y los algoritmos de encriptación simétrica 3DES y AES.
P.D.: Esto es el fruto de dos amanecidas hasta las 2:00 a.m., una rápida revisión a los algoritmos de encriptación, y sus respectivas implementaciones en .NET, que lo disfruten!
Saludos,