Criptografía en Xojo

Criptografía en Xojo
Sin comentarios Facebook Twitter Flipboard E-mail

No cabe duda de que los últimos tiempos están marcados por un nivel de paranoia adicional en cuanto a la vigilancia, la seguridad y privacidad de nuestra información. Ahí están la NSA, Snowden y toda una plétora de fallos de seguridad en importantes librerías, aplicaciones y dispositivos que (intencionados o no), nos recuerdan que siempre deberíamos de poner un poco de cuidado adicional cuando de lo que se trata es de crear aplicaciones seguras, y más aún si estas están circunscritas al ámbito web.

Precisamente para ayudarnos en esas tareas tenemos a nuestra disposición la capacidad de cifrar la información, aplicar firmas digitales, o bien generar huellas únicas para un conjunto dado de datos mediante una amplia variedad de algoritmos y sistemas criptográficos. Y si te interesa el tema, he de recomendarte un par de libros que, en mi opinión, son esenciales: "Cryptography Engineering: Design Principles and Practical Applications" (Niels Ferguson, Niels, Schneier, Bruce and Kohno, Tadayoshi y "Applied Cryptography: Protocols, Algorithms, and Source Code in C" (Schneier, Bruce).

Hash y RSA fácil

Ahora bien, como en otras tantas cosas, el enfoque propuesto por Xojo es el de facilitarnos al máximo y a un punto realmente transparente todas las operaciones que, por otra parte, podrían resultar un tanto farragosas o requerir de unos conocimientos elevados. (Recuerda que la filosofía de Xojo es la de poner las herramientas de programación al alcance de cualquier usuario, al tiempo que los desarrolladores avanzados encuentren también herramientas y características potentes que les permita crear todo tipo de aplicaciones.)

Así, a partir de la versión Xojo 2013r4.1 (diciembre de 2013) encontramos en el lenguaje un completo conjunto de funciones criptográficas basadas en la librería Crypto++ 5.6.2 donde se exponen para su uso en aplicaciones multiplataforma (WIndows, OS X, Linux y Web) los algoritmos de Hash o huellas únicas correspondientes a MD5 y SHA en sus variantes SHA1, SHA256 y SHA512, diseñadas por la NSA por cierto.

En cuanto a funciones criptográficas encontramos a nuestra disposición el popular sistema criptográfico RSA, con las capacidades de generación del par de claves publica/privada precisadas para el cifrado y firma de información, así como en las operaciones opuestas de conversión a texto claro y verificación de datos firmados; además de las funciones que permiten realizar precisamente todas estas tareas: cifrado, descifrado, firma, verificación de firma, y también la capacidad de verificar una clave. De hecho, siempre deberíamos de verificar la validez de una clave pública antes de su uso en el cifrado de los datos que queramos enviar al destinatario propietario de la misma, por ejemplo.

Si bien lo anterior es el plato fuerte en cuanto a las funciones disponibles bajo el módulo Crypto, también encontraremos la función HMAC que permite crear un código de autenticación de mensaje o, dicho de otro modo, una función Hash con esteroides en las que se utilizará el sistema de Hash que le indiquemos en combinación con una clave de nuestra cosecha.

Precisamente para generar esa clave adicional de la función HMAC (o 'salt'), Xojo proporciona la función GenerateRandomBytes y cuya finalidad no puede ser más descriptiva. De hecho, el único parámetro de entrada no es otro sino un entero mediante el cual indicaremos el tamaño de salida, mientras que el producto será lo que en Xojo se denomina un MemoryBlock y que no es más que un buffer de memoria mediante el que podemos trabajar con los datos en bruto, sin estar envueltos bajo una estructura determinada (por supuesto, en Xojo encontraremos múltiples métodos de clase para convertir desde y hacia MemoryBlocks los datos correspondientes a las estructuras internas de dichas clases, como pueda ser el texto).

Ahora bien, en su estado actual Xojo no expone muchos otros esquemas y algoritmos presentes en la librería Crypto++ 5.6.2, cosa aparte es que internamente pueda utilizar alguno de ellos. Quizá una de las ausencias más notables sea el esquema de criptografía de curva elíptica. Quizá es cuestión de tiempo que la veamos implementada en Xojo, junto con algunas otras ausencias notables.

Aun así, con lo disponible cualquier usuario puede encontrar la respuesta a las principales necesidades en cuanto al cifrado y verificación de datos, así como en el típico almacenamiento y posterior verificación en las contraseñas u otra información de carácter sensible, especialmente cuando se utiliza Xojo Web o Xojo Pro para la creación de aplicaciones con despliegue web, o incluso Xojo Pro en la creación de aplicaciones de servidor autónomas donde la seguridad en el intercambio de la información sea un requerimiento fundamental.

RSA en la práctica

¿Y cuán sencillo resulta aplicar todo lo anterior? Pues lo cierto es que sorprendentemente fácil, tanto por el diseño de las propias funciones como por el lenguaje Xojo en general.

Por ejemplo, la creación del par de claves Pública/Privada que supone el punto de partida para utilizar el resto de funciones RSA es tan simple como utilizar el siguiente código, y del que estoy convencido que podrás entender perfectamente incluso en el caso de que esta sea tu primera exposición al lenguaje de programación Xojo.

Crypto.RSAGenerateKeyPair ( Bits As Integer, ByRef PrivateKey As String, ByRef PublicKey As String ) As Boolean

En el parámetro Bits pasaremos como número entero la longitud de la clave, donde los valores típicos suelen ser 1.024 o 2.048.

Sobre el resto, se utilizan dos parámetros de tipo String (cadena) y que serán los responsables de contener tanto la clave pública como la privada. Aquí, se utiliza la partícula 'ByRef' de Xojo para indicar que el parámetro se pasará como referencia y no como valor (es decir, como copia), de modo que se pueda modificar desde dentro de la función el contenido del objeto apuntado por la variable.

Por último, la función devolverá un booleano donde se indicará mediante el valor 'True' que se ha podido realizar la operación con éxito o 'False' en caso contrario.

Por tanto, un fragmento de código que nos permitirá crear ambas claves y cifrar a continuación un mensaje determinado sería el siguiente:

Dim clavePrivada As String Dim clavePublica As String

If Crypto.RSAGenerateKeyPair( 1024, clavePrivada, clavePublica ) Then

Dim buffer As New MemoryBlock(15) buffer.StringValue(0, 15) = "Mensaje cifrado"

Dim cifrado As MemoryBlock = Crypto.RSAEncrypt( buffer, clavePublica )

if cifrado <> nil then

  MsgBox cifrado.StringValue(0,15)

  dim descifrado as MemoryBlock = Crypto.RSADecrypt(cifrado, clavePrivada)

  MsgBox descifrado.StringValue(0,15)

End If

End If

Una vez cifrado, sólo es necesario utilizar a continuación la clave privada para volver a convertirlo en texto claro.

Ahora bien, una particularidad de trabajar con bloques de memoria es que desaparece toda la información de codificación asociada con el texto (por ejemplo UTF-8), de modo que es preciso tenerlo en cuenta a la hora de volver a recuperar dicha información otra vez desde un bloque de memoria que hayamos descifrado.

Acceso a Llaveros

También hay que tener en cuenta que si bien el módulo Crypto incluye todas las funciones necesarias para cifrar, firmar o generar huellas digitales de nuestra información, depende de nosotros poner a buen recaudo las claves privadas que generemos.

Existen muchas formas de hacerlo, y de hecho no debería de suponer ningún problema mediante las clases incluidas en el framework de Xojo. Ahora bien, los usuarios de OS X lo tienen aun un poco más sencillo gracias a que Xojo incluye soporte para la característica Acceso a Llaveros (Keychain) mediante la que se facilita sobremanera el guardado y recuperación de contraseñas utilizadas por las aplicaciones.

Comentarios cerrados
Inicio