Bienvenido, invitado ( Identificarse | Registrarse )
![]() ![]() |
Oct 14 2006, 06:11 PM
Publicado:
#1
|
|
|
Demonio super satanico amo del mundo Grupo: Webmaster Mensajes: 1,759 Registrado: 13-February 06 Desde: Argentina Miembro No.: 2 |
ASEGUREMOS NUESTROS DATOS DE FORMA CONFIABLE
Con la ayuda de las funciones de Microsoft CryptoAPI, aumentar LA SEGURIDAD DE NUESTROS DATOS no es complicado, aunque, por suerte, sí lo será descifrarlos para aquél que no disponga de la clave correcta. En esta nota, encontrarán la introducción al tema y un ejemplo concreto. Criptografía en VB La criptografía no es nueva, y como la conocemos hoy en día, comenzó a formarse a fines de los preciados años ‘70 de los hippies; aunque claro, no fueron ellos quienes la impulsaron, sino instituciones militares y gubernamentales norteamericanas, ansiosas de poder resguardar información importante. De esa forma, muchos científicos y empresas comenzaron a desarrollar algoritmos de cifrado, hasta que algunos lograron estandarizarse, y muchos otros quedaron en el camino. La criptografía transforma un texto legible en otro totalmente confuso (texto cifrado, o ciphertext), con el objetivo principal de que este último no pueda ser descifrado sin disponer de la clave adecuada, o que hacerlo sea más costoso que el valor de la información contenida, de modo que nadie pretenda siquiera intentarlo. Además de esta valuable privacidad, existen muchas técnicas criptográficas que también permiten verificar la integridad de un texto (cerciorarse de que no haya sido modificado) y su autenticidad, es decir, asegurarse de que el texto haya sido escrito por quien dice haberlo hecho. Antes de continuar, vamos a hacer una breve introducción a L las técnicas criptográficas en general, para que quienes no estén en tema también puedan aprovechar el resto de la nota. Criptografía simétrica o de clave privada. Se caracteriza porque la clave utilizada para cifrar un texto es la misma que se necesita para descifrarlo luego. Son algoritmos rápidos, aunque su principal desventaja es que en un esquema de comunicación, el emisor y el receptor deben conocer la clave, y entonces se hace necesaria la existencia de un canal seguro para su intercambio. Cuanto más larga sea esta clave, más tiempo le tomará a la fuerza bruta desencriptar un texto. Los algoritmos simétricos más utilizados son: • DES (Data Encryption Standard). Fue desarrollado por IBM en 1974 y originalmente se llamaba “Lucifer” (¿tendrá orígenes satánicos?). Utiliza claves numéricas de 56 bits, y es uno de los pioneros y más populares. Han surgido variantes más poderosas, como 3DES o Triple DES. • RC2, RC4, RC5. • AES (Advanced Encryption Standard). Es un algoritmo en ASEGUREMOS NUESTROS DATOS DE FORMA CONFIABLE Con la ayuda de las funciones de Microsoft CryptoAPI, aumentar LA SEGURIDAD DE NUESTROS DATOS no es complicado, aunque, por suerte, sí lo será descifrarlos para aquél que no disponga de la clave correcta. En esta nota, encontrarán la introducción al tema y un ejemplo concreto. Mensaje modificado por Krosty el Oct 14 2006, 06:15 PM |
|
|
|
Oct 14 2006, 06:12 PM
Publicado:
#2
|
|
|
Demonio super satanico amo del mundo Grupo: Webmaster Mensajes: 1,759 Registrado: 13-February 06 Desde: Argentina Miembro No.: 2 |
Criptografía en VB
Figura 1. Un típico formulario para cambiar una clave. La cantidad de asteriscos no tiene relación con el tamaño real del password, ya que, en realidad, el programa no lo conoce (sólo tiene el Hash que genera). Figura 2. Nuestro ejemplo terminado. Permite encriptar y desencriptar un texto con el algoritmo RC4, y aplicar el MD5. Mariano BIRNIOS mariano@tectimes.com Programador experto; las siglas VB ya son sinónimo de Mariano en la editorial. 66 u s e r s . t e c t i m e s . c o m ProgramacionU#43.qxd 4/12/01 12:34 PM Page 66 u s e r s . t e c t i m e s . c o m 67 vías de desarrollo, que se espera reemplace al DES para resguardar información altamente confidencial en los próximos años. Criptografía asimétrica o de clave pública. En este sistema todas las personas o entes disponen de dos claves: una privada y otra pública. Si un mensaje es encriptado con la clave pública de una persona, éste sólo podrá ser descifrado con la clave privada de ella (por ejemplo, si Moria le quiere enviar un mensaje a Graciela, entonces Moria debe encriptarlo con la clave pública de Graciela, para que sólo ella pueda descifrarlo, con su clave privada que sólo ella conoce). Además, si un mensaje es encriptado con la clave privada de una persona, sólo podrá ser desencriptado con su clave pública, haciendo la tarea de autenticación, es decir, afirmando que el mensaje cifrado provino de la persona indicada. Dada su mayor complejidad, los algoritmos de clave pública son más lentos que los simétricos. Los más conocidos son: • RSA. Es el más rápido y sencillo de los existentes. • Diffie-Hellman. Se utiliza principalmente para intercambiar claves simétricas en canales inseguros. Hashing. Son algoritmos (basados en funciones hash) que se aplican a un texto y devuelven como resultado un pequeño “resumen” de un tamaño fijo de, al menos, 128 bits. El proceso es irreversible, pero lo interesante es que la más mínima modificación al texto original haría que el resultado del hash fuera diferente. El uso más habitual de estos algoritmos es para verificar la integridad de un texto: se envía un texto cifrado junto con su resumen hash, y si luego el texto descifrado genera el mismo resumen recibido, el mensaje está íntegro. Básicamente, hay dos familias de algoritmos populares: • MD2, MD4, MD5. El más usado, el MD5, genera resúmenes de 128 bits. • SHA (Secure Hash Algorithm). Es más joven que el MD5, y genera resultados de 160 bits. Certificados digitales. Son certificados que se utilizan para probar la identidad de una persona (o cualquier ente) en una comunicación, por ejemplo, en Internet. Para esto interviene una organización (Certification Authority) que se encarga de otorgar los certificados asociados a una clave pública. Ahora bien, no todo lo que mencionamos hasta el momento está a nuestro alcance. Y no es porque no tengamos el conocimiento suficiente o las herramientas necesarias para utilizarlo, sino porque los Estados Unidos no permiten que sus empresas exporten ciertos algoritmos a otros países, por considerarlos elementos de inteligencia militar, o algo así. Es el caso del famoso PGP, sólo estando en los Estados Unidos es posible descargar el programa de la Web para utilizarlo con todo su potencial. El resto del mundo sólo se limita a utilizar una versión reducida con menos algoritmos o claves de menor longitud. Esperemos que este tipo de estupideces militares se acabe pronto... En esta nota sólo vamos a ver cómo utilizar algunas formas de criptografía simétrica y hash desde VB. |
|
|
|
Oct 14 2006, 06:13 PM
Publicado:
#3
|
|
|
Demonio super satanico amo del mundo Grupo: Webmaster Mensajes: 1,759 Registrado: 13-February 06 Desde: Argentina Miembro No.: 2 |
Microsoft CryptoAPIs
Como se imaginarán, por suerte no es necesario programar todos esos algoritmos para poder utilizarlos, sino que basta con hacerse amigo de las CryptoAPIs, y para eso, mis queridos lectores, fue escrita esta A lo largo de la nota, vamos a ver los conceptos necesarios para construir un pequeño encriptador utilizando las Microsoft CryptoAPIs. ✚ Para saber más Para encontrar más información, pueden consultar alguno de los siguientes links: ✚ msdn.Microsoft.com/library En la sección Platform SDK/Security/Cryptography/ CryptoAPI encontrarán toda la referencia a las CryptoAPIs. ✚ www.cryptovb.com Un sitio dedicado a la criptografía en Visual Basic. ✚ www.allapi.net Si bien este sitio es una guía general de funciones API, tiene información y ejemplos de las CryptoAPIs. ProgramacionU#43.qxd 4/12/01 12:34 PM Page 67 E X P E R T O S P R O G R A M A C I Ó N LISTADO 1: Function Encriptar(Texto As String, Password As String) As String Dim hProvider As Long Dim hHash As Long Dim hKey As Long Dim Buffer As String Dim BufferLen As Long Dim DataLen As Long CryptAcquireContext hProvider, vbNullChar, MS_DEF_PROV, PROV_RSA_FULL, 0 CryptCreateHash hProvider, CALG_MD5, 0, 0, hHash CryptHashData hHash, Password, Len(Password), 0 CryptDeriveKey hProvider, CALG_RC4, hHash, 0, hKey DataLen = Len(Texto) BufferLen = DataLen * 2 Buffer = Texto & String(DataLen, vbNullChar) CryptEncrypt hKey, 0, True, 0, Buffer, Data- Len, BufferLen Buffer = Left(Buffer, DataLen) CryptDestroyHash hHash CryptDestroyKey hKey CryptReleaseContext hProvider, 0 Encriptar = Buffer End Function 68 u s e r s . t e c t i m e s . c o m nota. Todo lo que necesitan es estar duchos en el manejo de funciones API, aunque, si no es así, en el CD encontrarán el código de algunas funciones criptográficas listas para utilizar. Las APIs de criptografía se encuentran en el archivo advapi32. dll, el mismo que contiene las funciones de acceso al Registro de Windows. La macana es que las declaraciones de las CryptoAPIs no se encuentran disponibles en el API Text Viewer de VB, es decir que no podemos buscar allí las funciones para copiar y pegar su declaración en nuestros proyectos. Todas las declaraciones de las funciones se encuentran en el archivo wincrypt.h, incluido en VC++ y escrito en C. Por eso en Internet pululan “traducciones” de este archivo, adaptando las declaraciones a Visual Basic. Así que, ojo al piojo, porque no todas funcionan correctamente. El archivo modCryptoAPI.bas que encontrarán en el CD contiene mi versión de las declaraciones, que con los ejemplos y pruebas funcionaron correctamente. Cryptographic Service Providers Los CSPs o proveedores son el medio que Microsoft encontró para organizar la gran familia de algoritmos y técnicas disponibles a través de las CryptoAPIs. Antes de utilizar cualquier servicio de estas APIs, será necesario iniciar uno de estos proveedores. En la Tabla 1 se nombran los dos más comunes, aunque sólo el básico está disponible fuera de los Estados Unidos. La realidad indica que si queremos utilizar estas APIs y asegurarnos de que van a funcionar en cualquier máquina, deberemos quedarnos con el Microsoft Base Cryptographic Provider. Además, cada proveedor es de un tipo determinado (Provider Type), que en general indica qué clases de algoritmos están disponibles con él. El tipo que siempre vamos a usar nosotros es PROV_RSA_FULL, ya que es de propósito general y cuenta con algoritmos de encriptación, hashing y firmas digitales. Pasemos a la práctica. Lo primero que debemos hacer siempre es obtener un handle al proveedor deseado. Para esto, utilizamos la función CryptAquireContext: Dim hProvider As Long CryptAcquireContext hProvider, vbNullChar, MS_DEF- _PROV, PROV_RSA_FULL, 0 En el primer parámetro pasamos una variable del tipo Long, en la que se guardará el handle al proveedor, que luego deberemos utilizar con el resto de las funciones. El tercer parámetro indica el nombre del proveedor que vamos a usar (podemos emplear las constantes declaradas en modCryptoAPIs), y el cuarto indica el Provider Type (que para nosotros siempre será PROV_RSA_FULL). El último parámetro son flags, que casi no se usan. En todas las funciones que vamos a ver en la nota, si hubo éxito, la función devuelve 1, y si hubo error, un 0 o False. De ahora en más, no importa lo que vayamos a hacer con el proveedor, seguramente necesitaremos la variable hProvider, así que conservémosla bien. Crear una clave A pesar de que como “clave” uno tiende a pensar en una palabra, una clave o key es un número para los algoritmos criptográficos. La longitud de este número generalmente varía entre 40 y 256 bits. Cuanto más larga, más segura será. Ahora bien, para nosotros, los humanos, no es sencillo recordar semejantes números, sino que nos sentimos más cómodos poniendo nuestra fecha de cumpleaños, teléfonos, direcciones y todo tipo de palabras que no deberíamos usar. En fin, para utilizar cualquier algoritmo, necesitamos crear una clave numérica, para lo cual tenemos dos vías principales: • Generar la clave al azar, mediante la función CryptGen- Key. (Aunque parezca tonto, esto puede llegar a ser muy útil en algunas situaciones particulares). • Generar la clave a partir de un string (un password). ¡Sí! Esto es lo que necesitamos, aunque no es lo más sencillo, ya que antes deberemos aplicarle un hash al texto del password y después generar la clave a partir de éste. ProgramacionU#43.qxd 4/12/01 12:34 PM Page 68 u s e r s . t e c t i m e s . c o m 69 |
|
|
|
Oct 14 2006, 06:14 PM
Publicado:
#4
|
|
|
Demonio super satanico amo del mundo Grupo: Webmaster Mensajes: 1,759 Registrado: 13-February 06 Desde: Argentina Miembro No.: 2 |
Tabla 1
Los dos CSPs más habituales. Ambos son del tipo PROV_RSA_FULL, es decir, de propósito general (soportan encriptación de datos y otras yerbas, como firmas digitales). Proveedor Constante Descripción Microsoft Base MS_DEF_PROV Es el más simple y popular. Nos permite utilizar RSA Cryptographic Provider para el intercambio de claves, RC2, RC4 y DES (este último, sólo en W2000 y con claves de 56 bits) para encriptación, y MD2, MD5 y SHA para hashing. Microsoft Enhanced MS_ENHANCED_PROV Agrega más algoritmos al anterior (por ejemplo, 3DES) y soporta Cryptographic Provider claves de mayor longitud. Disponible sólo en EE.UU. y Canadá. LISTADO 2: Function Hash(Texto As String) As String Dim hProvider As Long Dim hHash As Long Dim HashSize As Long Dim Buffer() As Byte Dim BufferLen As Long CryptAcquireContext hProvider, vbNullChar, MS_DEF_PROV, PROV_RSA_FULL, 0 CryptCreateHash hProvider, CALG_MD5, 0, 0, hHash CryptHashData hHash, Texto, Len(Texto), 0 BufferLen = 4 ReDim Buffer(BufferLen - 1) CryptGetHashParam hHash, HP_HASHSIZE, Buffer( 0), BufferLen, 0 HashSize = Buffer(0) ReDim Buffer(HashSize - 1) CryptGetHashParam hHash, HP_HASHVAL, Buffer( 0), HashSize, 0 CryptDestroyHash hHash CryptReleaseContext hProvider, 0 Hash = ArrayToString(Buffer) End Function encriptado puede terminar siendo más largo). La variable Buffer contiene el texto a encriptar, seguido de caracteres nulos, para llenar el tamaño necesario que debe tener el buffer. Luego, la función CryptEncrypt es la que se encarga del proceso. Como primer parámetro, recibe la clave a utilizar, que es el hKey que obtuvimos anteriormente. Cuando termina su proceso, la función deja en Buffer el texto encriptado, y guarda En síntesis, el siguiente código genera una clave a partir de un password en formato string: CryptCreateHash hProvider, CALG_MD5, 0, 0, hHash CryptHashData hHash, Password, Len(Password), 0 CryptDeriveKey hProvider, CALG_RC4, hHash, 0, hKey Vayamos por partes. La primera función sólo crea un handle (hHash) a un objeto hash, e indica el algoritmo de hashing a utilizar (MD5). Luego, la función CryptHashData genera el verdadero hash, a partir del texto contenido en Password (que es un string común y corriente). Finalmente, la última función, CryptDeriveKey, “deriva” el hash generado en una clave, cuyo handle almacena en hKey. Ojo, hKey no contiene el valor de la clave, sólo una especie de puntero hacia ésta. Cuando posteriormente vayamos a encriptar un texto, necesitaremos la variable hKey para indicar la clave a utilizar. Notemos que al crear la clave se indica el algoritmo de encriptación que posteriormente se va a utilizar con ella. En nuestro caso, usamos RC4 (indicado en CALG_RC4). En la Tabla 2 pueden ver un listado con los algoritmos más habituales. Encriptar un texto con la clave Hasta aquí, sólo hemos realizado los dos primeros ítems del proceso completo: • Obtener un handle del proveedor deseado. • Crear una clave a partir de una cadena de caracteres. • Encriptar un texto con la clave generada. El último paso, en el que realmente se encripta el texto, no es más complicado que los anteriores: DataLen = Len(Texto) BufferLen = DataLen * 2 Buffer = Texto & String(DataLen, vbNullChar) CryptEncrypt hKey, 0, True, 0, Buffer, DataLen, BufferLen Buffer = Left(Buffer, DataLen) La primera variable, DataLen, contiene la longitud del texto a encriptar. La segunda variable, BufferLen, establece la longitud máxima del buffer en el cual la función de encriptación guardará su resultado. Se suele estimar que nunca podrá ser mayor que el doble del tamaño del texto original (porque, claro está, el texto ProgramacionU#43.qxd 4/12/01 12:34 PM Page 69 70 u s e r s . t e c t i m e s . c o m E X P E R T O S P R O G R A M A C I Ó N en DataLen la longitud de éste, para que podamos quedarnos sólo con la parte válida del string (mediante la función Left). Misión cumplida. Lo único que queda es cerrar los handles utilizados, para liberar sus recursos: CryptDestroyHash hHash CryptDestroyKey hKey CryptReleaseContext hProvider, 0 En el Listado 1 pueden ver todo esto en forma de una amigable función, que recibe un texto a encriptar y el password que se utilizará, y devuelve el texto ya encriptado. Hay que tener en cuenta que, si bien las funciones lo soportan, no hemos incluido el control de errores. Es decir, ¿qué pasa si la función devuelve False? Eso quedará como tarea para los lectores, pero cabe recordarlo para que no lo olviden a la hora de depurar sus programas... Hashing Como expliqué brevemente al principio, las técnicas de hashing permiten obtener un pequeño “resumen” (de generalmente 128 bits) a partir de cualquier texto. Si un ínfimo bit del texto cambia, el resultado del hash será distinto. Además, del resumen hash es imposible volver a obtener el texto original. Hay dos usos principales que le podemos dar a esta técnica: • Verificar la integridad de un texto. • Almacenar una lista de passwords, sin necesidad de guardarlos en su forma original. El primer punto ya fue explicado y es sencillo: teniendo un texto cifrado y el hash de su original, si al aplicar el mismo algoritmo de hashing sobre el texto descifrado no coinciden los resúmenes, el texto habrá cambiado y no será íntegro. El segundo punto puede ser más útil para incorporar en nuestras aplicaciones, si tenemos un sistema con varios usuarios y passwords. Sucede que tenemos que guardar las claves de acceso en algún lugar, para compararlas con las ingresadas por los usuarios en cada sesión. ¿Dónde lo hacemos? Obviamente, el archivo INI con la sección [Passwords] no es lo más indicado. En fin, no importa dónde guardemos las claves, éstas pueden ser descubiertas, y aunque guardáramos la lista cifrada, también necesitaríamos un password para descifrarla... ¿Dónde lo guardamos? ¡Ya sé! Encriptamos ese password también, y entonces... Lo que podemos hacer es guardar sólo el resumen hash asociado a cada usuario, y luego comparar el resumen que genera el password ingresado con el almacenado. Si alguien accede a nuestra lista de claves: • Sólo verá los resúmenes hash. • No podrá saber con qué palabras se genera cada uno. • Tampoco podrá obtener un password a partir del hash, ya que, como se dijo anteriormente, ese proceso es imposible. De hecho, éste es el método que utilizan varios sistemas para guardar este tipo de información. Si son observadores, verán que, al cambiar un password, generalmente la cantidad de asteriscos que aparecen no se equipara con la de letras de la clave (ver Figura 1). Esto se debe a que ni siquiera el programa conoce la clave verdadera: sólo tiene el hash que genera. El uso de estas técnicas con las CryptoAPIs se realiza mediante las funciones CryptCreateHash, CryptDestroyHash, CryptHashData, CryptGetHashParam y CryptSetHashParam. Hay más, pero éstas son las principales. La idea es: • Como siempre, obtener un handle a un CSP. • Crear un handle a un objeto hash mediante CrypCreate- Hash. • Aplicar el hash a un texto, mediante CryptHashData. • Obtener el tamaño del hash resultante, mediante Crypt- GetHashParam. • Obtener el hash resultante, otra vez mediante CryptGet- HashParam. • Cerrar los handles utilizados. El Listado 2 contiene la función que hemos creado para aplicarle un algoritmo de hash a un texto cualquiera. Un detalle para tener en cuenta es que la función CryptGetHashParam, como muchas otras CryptoAPIs, trabaja con un vector de bytes como entrada y salida de datos, por lo que se dificulta un poco el hecho de trabajar con strings (en C, bastaría con castear el parámetro). Para pasar del vector a un string, hemos construido la función ArrayToString, que pueden encontrar en el CD. El ejemplo completo Para terminar de analizar el tema, preparamos un ejemplo completo que demuestra el uso de las funciones vistas en la nota. Básicamente, permite encriptar/desencriptar un texto, y aplicar y validar funciones de hash. Además, como extra, utiliza algunas funciones para obtener información de los proveedores disponibles en cada máquina (ver Figura 2). Para terminar Como suele suceder en estas notas, no hemos cubierto todas las posibilidades. El mundo de la criptografía es sumamente amplio, interesante y está en crecimiento, y las CryptoAPIs sólo nos brindan una puerta para poder aprovechar todo eso desde Visual Basic. Si quedaron hambrientos de más, pueden darle un vistazo al recuadro “Para saber más”, que contiene algunos links interesantes. ✕ |
|
|
|
Oct 14 2006, 06:14 PM
Publicado:
#5
|
|
|
Demonio super satanico amo del mundo Grupo: Webmaster Mensajes: 1,759 Registrado: 13-February 06 Desde: Argentina Miembro No.: 2 |
Tabla 2
Los algoritmos más comunes y las constantes necesarias para referenciarlos. Algoritmo Constante Tipo RC4 CALG_RC4 Encriptación DES CALG_DES Encriptación 3DES CALG_3DES Encriptación RSA CALG_RSA_KEYX Intercambio de claves (asimétrico) MD5 CALG_MD5 Hashing SHA CALG_SHA Hashing ProgramacionU#43.qxd 4/12/01 12:34 PM Page 70 |
|
|
|
![]() ![]() |