Historias
Slashboxes
Comentarios
 

Usar Keyczar en .NET

Entrada escrita por desas3 y editada por mig21 el 14 de Junio 2009, 20:04h   Printer-friendly   Email story
desde el dept. portabilidad-interoperabilidad-y-todo-lo-demás
desas3 nos cuenta en su bitácora: Hace unos meses que Stephen Weis, a quien tengo la suerte de tener de compañero en Google, junto con Arkajit Dey y la ayuda de otros, publicó Keyczar, una biblioteca, disponible para Java, Python y C++, los tres principales lenguajes de programación que se usan en Google, que facilita enormemente el uso de las cuatro funciones criptográficas principales (cifrado, descifrado, firma y verificación de la firma) y el cambio y versionado de las claves utilizadas. Un resultado indirecto de la elección de Google es que Keyczar no está disponible para .NET. Dándole vueltas un poco a cómo podría cambiar esto -C# es un lenguaje que me gustó mucho cuando programé un poco con él, igual que MonoDevelop-, se me ocurrieron varias opciones. Por orden: portar el código a C# u otro lenguaje .NET, compilar la versión de C++ como una dll, o usar la versión de Java. Un port sería lo mejor, pero también parece muy trabajoso, no tengo mucho tiempo libre, y hace ya mucho desde que programé (sólo un poco) en C#. Estoy en las mejores condiciones para portar el código y hacerlo mal. La versión de C++ sólo puede usarse en Linux. Aunque para mí no sería problema, me pareció un esfuerzo menos útil que una versión que pudiera ejecutarse en varios sistemas operativos. Así que decidí probar con la biblioteca en Java. En la página ampliada todos los detalles.
Todos los que nos dedicamos a la seguridad aprendemos rápido que los principales problemas del uso de la criptografía no están en la fortaleza de los algoritmos, sino en la implementación y uso de los mismos y en la gestión de las claves. Keyczar intenta que, como se dice en inglés, sea difícil dispararnos en nuestro propio pie al usar criptografía en nuestras aplicaciones.

Que Google restrinja los lenguajes usados en producción a tres tiene sus ventajas e incovenientes (interesados en una flamewar pueden leer este artículo de Steve Yegge).

Alguien que se encontró en una situación similar, escribió IKVM.NET, un interesante proyecto que proporciona interoperatibilidad (hasta cierto punto) entre Java y .NET. Una de las herramientas que IKVM.NET incluye es ikvmc, un compilador de bytecode Java a .NET. Básicamente, como su página de manual indica, un programa que transforma aplicaciones y ficheros JAR en ensamblados (assemblies) .NET. Así que la idea era usar ikvm para convertir la biblioteca Keyczar en un assembly .NET.

Para ello, hay que descargar los siguientes archivos JAR. Ahora, instalamos los paquetes necesarios. Yo lo he hecho en mi Debian Squeeze y aparte de mono, monodevelop, etc. el más importante es el paquete ikvm.

Creamos el directorio ~/keyczar y copiamos los JAR dentro. En este directorio, ejecutamos ikvm:

~/keyczar$ ikvmc -target:library keyczar06b-1.6-052809.jar jss-4.jar gson-1.3.jar log4j-1.2.15.jar
Warning IKVMC0107: skipping resource (name clash): "META-INF/MANIFEST.MF"
Note IKVMC0002: output file is "keyczar06b-1.6-052809.dll"
Warning IKVMC0100: class "javax.jms.Message" not found
Warning IKVMC0100: class "javax.jms.Destination" not found
Warning IKVMC0100: class "javax.jms.JMSException" not found
Warning IKVMC0100: class "javax.mail.Session" not found
Warning IKVMC0100: class "javax.mail.internet.MimeMessage" not found
Warning IKVMC0100: class "javax.mail.Message" not found
Warning IKVMC0100: class "javax.mail.MessagingException" not found
Warning IKVMC0100: class "javax.mail.internet.InternetAddress" not found
Warning IKVMC0100: class "javax.mail.Address" not found
Warning IKVMC0100: class "javax.mail.Message$RecipientType" not found
Warning IKVMC0105: unable to compile class "org.apache.log4j.net.SMTPAppender$1"
(missing class "javax.mail.Authenticator")
Warning IKVMC0100: class "org.apache.log4j.net.SMTPAppender$1" not found
Warning IKVMC0100: class "javax.mail.Authenticator" not found
Warning IKVMC0100: class "javax.mail.internet.AddressException" not found
Warning IKVMC0100: class "javax.mail.internet.MimeBodyPart" not found
Warning IKVMC0100: class "javax.mail.internet.MimeMultipart" not found
Warning IKVMC0100: class "javax.mail.Multipart" not found
Warning IKVMC0100: class "javax.mail.BodyPart" not found
Warning IKVMC0100: class "javax.mail.Part" not found
Warning IKVMC0100: class "javax.mail.Transport" not found
Warning IKVMC0100: class "com.sun.jdmk.comm.HtmlAdaptorServer" not found
Warning IKVMC0100: class "com.sun.jdmk.comm.CommunicatorServer" not found
Warning IKVMC0105: unable to compile class "org.apache.log4j.net.JMSSink"
(missing class "javax.jms.MessageListener")
Warning IKVMC0100: class "javax.jms.TopicConnectionFactory" not found
Warning IKVMC0100: class "javax.jms.TopicConnection" not found
Warning IKVMC0100: class "javax.jms.TopicSession" not found
Warning IKVMC0100: class "javax.jms.Topic" not found
Warning IKVMC0100: class "javax.jms.TopicPublisher" not found
Warning IKVMC0100: class "javax.jms.Connection" not found
Warning IKVMC0100: class "javax.jms.Session" not found
Warning IKVMC0100: class "javax.jms.ObjectMessage" not found
~/keyczar$
Los mensajes de error se deben a que ikvmc utiliza las clases java implementadas por la OpenJDK, y la biblioteca log4j depende de ellos. Aún así podremos utilizar la DLL resultante, salvo que configuremos log4j de forma que los use (por ejemplo para que envíe correo electrónico).

Para ello, creamos un proyecto en Monodevelop (yo lo he llamado keyczarusage) y le añadimos el assembly que hemos creado, keyczar06b-1.6-052809.dll. Además, hay que escribir esta clase Main.cs:

using System;
using org.keyczar;

namespace Keyczarusage
{
class MainClass
{
public static void Main(string[] args)
{
Crypter crypter = new Crypter(args[0]);
System.Console.WriteLine(crypter.encrypt("Hello World!"));

System.Console.WriteLine("Please, copy & paste that string below:");
String ciphertext = System.Console.ReadLine();
System.Console.WriteLine("That decrypts to:");
System.Console.WriteLine(crypter.decrypt(ciphertex t));

}
}
}
Para poder usar este programa, hay que crear una clave de cifrado. Para ello, usamos la herramienta KeyczarTool:

~/keyczar$ mkdir -p keys/crypt
~/keyczar$ java -cp log4j-1.2.15.jar:gson-1.3.jar:keyczar06b-1.6-05280 9.jar org.keyczar.KeyczarTool addkey --location=~/keyczar/keys/crypt --status=primary
Ahora ya podemos ejecutar el programa, pasándole la dirección de las claves como parámetro:

~/Projects/keyczarusage/keyczarusage/bin/Debug$ ./keyczarusage.exe ~/keyczar/keys/crypt
log4j:WARN No appenders could be found for logger (org.keyczar.Keyczar).
log4j:WARN Please initialize the log4j system properly.
ALJM94ibZlsXDepUUhRahyLgAWMaWSecgP7Fz1I IA-A0M55rlTL4Vc5wtOw3XM3ylG7oDTFFb2ac
Please, copy & paste that string below:
ALJM94ibZlsXDepUUhRahyLgAWMaWSecgP7Fz1IIA- A0M55rlTL4Vc5wtOw3XM3ylG7oDTFFb2ac
That decrypts to:
Hello World!
La verdad es que no he probado mucho la biblioteca, sólo esta prueba. Habría que ver si las claves asimétricas funcionan, y probar varias combinaciones, pero en principio parece que es posible usar Keyczar en .NET sin muchas dificultades. Teóricamente, la DLL creada puede usarse tanto en Mono como en .NET en Windows sin ninguna modificación.

Historias relacionadas

[+] Software Libre: Google anuncia el lanzamiento de keyCzar 19 comentarios
Un pobrecito hablador nos cuenta: «Google anuncia el lanzamiento de keyCzar con el objetivo de que la criptografía sea más segura y fácil de usar. keyCzar es un juego de herramientas criptográficas de código abierto que implementan cifrado y autentificación tanto para algoritmos simétricos como de clave pública. Afronta los problemas más comunes en el cifrado eligiendo opciones seguras por defecto, marcando los resultados con la versión de las claves, y proporcionando una API sencilla. Además permite rotar y revocar claves sin tener que preocuparse de la compatibilidad con versiones anteriores o modificar el código fuente. A partir de ahora ya no hay excusa para seguir encriptando tu información sensible en lugares lúgubres y húmedos con la esperanza de que esté segura, ahora basta con cifrarla.» Más información, en Google Code.
[+] Software Libre: Mono 2.4 sale a la luz junto con MonoDevelop 2.0 49 comentarios
knocte nos cuenta: «Tal como cuenta Miguel de Icaza, Mono y MonoDevelop desvelan nuevas versiones. En cuanto al primero, es de destacar la corrección de muchos bugs, mejoras de rendimiento (nuevo JIT, ASP.NET precompilado), soporte de SIMD y grandes avances en Windows.Forms (como el soporte de accesibilidad y la corrección de problemas con el DataBinding). El segundo nos trae increíbles nuevas funcionalidades, como el soporte de C# 3.0, Code Folding, preferencias por proyecto ("políticas"), un nuevo complemento para desarrollo en Vala, Modos de Vi integrados, búsqueda "find as you type" (tipo Firefox), auto-completado en XML, mejoras en el soporte de Subversion (revertir revisiones, resolver conflictos, bloquear/desbloquear archivos), soporte nativo MsBuild, mejoras en el soporte ASP.NET, y ¡el tan esperado depurador integrado! Si eres desarrollador de .NET, ya no hay excusa para probar Mono. Y si eres desarrollador de Gnome, ya no hay excusa para ser algo más productivo :) ¡Casi se me olvida! Los amantes de KDE/QT también pueden usarlo ;)»
Este hilo ha sido archivado. No pueden publicarse nuevos comentarios.
Mostrar opciones Umbral:
Y recuerda: Los comentarios que siguen pertenecen a las personas que los han enviado. No somos responsables de los mismos.
  • Por un momento...

    (Puntos:3, Divertido)
    por pobrecito hablador el Sábado, 13 Junio de 2009, 22:46h (#1154680)

    ... Barrapunto vuelve a ser lo que era. :-)

  • iKVM

    (Puntos:2, Interesante)
    por pobrecito hablador el Domingo, 14 Junio de 2009, 08:25h (#1154691)
    Mi experiencia con ikvm es muy satisfactoria, aunque desde el lado opuesto. Yo necesitaba pasar a JAR una aplicación que yo mismo escribí, forzada a estar hecha en C# porque utilizaba la libería Mono.CeCil para análisis de ensamblados .NET. La pega aquí es que los jars devueltos sólo pueden ser ejecutados en la jvm de IKVM, no en la estándard, pero dicha máquina virtual es un fichero .exe (en Windows, en linux se tira con Mono) que puede ser lanzado sin mayor problemas.

    Para el resto de los efectos es un jar de pleno derecho (eclipse lo deja adjuntar como librería, puede meterese en classpaths ANT etc).

    De hecho para lograr que mi invento funcionara tuve que pasar a .jar cosas tan curiosas como el System.dll del sdk de .NET, pero no tuve mayor problema.
  • Iron Python

    (Puntos:5, Interesante)
    Si Keyczar está para Python, podrías intentar usar Iron Python [codeplex.com], una implementación de Python para .NET, para usarlo en tus proyectos de .NET. Desgraciadamente aun no tengo experiencia con Iron Python así que no puedo darte ningún consejo al respecto, pero creo que te merece la pena mirarlo.
    --

    El doble de diversión en: La Botella de Klein [blogspot.com]

    • Re:Iron Python de desas3 (Puntos:2) Domingo, 14 Junio de 2009, 17:56h
      • Re:Iron Python de Linuxtron (Puntos:2) Lunes, 15 Junio de 2009, 08:21h
  • Imposible

    (Puntos:2, Divertido)
    por el culo (21186) el Domingo, 14 Junio de 2009, 23:56h (#1154781)
    ( http://barrapunto.com/ )
    Pensaba que esto era un foro de Ubuntu. Barrapoint ya es lo que era.

    Por cierto, el otro día intenté generar un compilador de ByteCola para portar código PHP a Pascal ensamblado a través de helpers de Ruby 1.9, todo encriptado usando Telnet seguro y bidireccionamieto casuístico de memoria fugaz. No conseguí una puta mierda así que fui al vídeoclub a alquilar Los Angeles de Carlos.
    Viendo la película caí en la cuenta de que necesitaba añadir hot-cross-compiling a mi magno proyecto. Así lo hice. Luego bajé a devolver la película y al subir me conecté al messenger y nunca más he tocado mi aplicación. Si alguien está interesado que prepare una pasta gansa.

    --
    Gnome es para tontos... ¿por qué tengo este pedazo trabuco?
    • Re:Imposible de el culo (Puntos:2) Lunes, 15 Junio de 2009, 09:07h
    • 1 respuesta por debajo de tu umbral de lectura actual.
  • Re:¿Y la noticia...

    (Puntos:3, Inspirado)
    por desas3 (26637) el Domingo, 14 Junio de 2009, 22:23h (#1154774)
    ( Última bitácora: Viernes, 29 Octubre de 2010, 09:43h )
    Ignorare el "don't feed the troll" por esta vez, para puntualizar:

    1. Que esto era originalmente una entrada en mi bitacora de barrapunto (que, ya sabes, es mia como mi gato y me la... como quiera)
    2. Que esto era originalmente una entrada en mi bitacora de barrapunto. Google no esta anunciando nada, ni el proceso que describo tiene nada que ver con Google (salvo que Stephen Weis es el autor original de Keyczar y trabaja para Google). Cuando Google anuncia algo lo hace en sus blogs oficiales, asi que ve a trollear a ellos si quieres demostrar el poco nivel que tiene Google ultimamente y el nivelazo que tu te gastas.


    Por ultimo, y en lo que a mi toca, lo unico que veo de novedoso en la entrada de mi bitacora es que describe un modo en que se puede usar keyczar en .NET, algo que (si buscas un poco en http://bing.com/ [bing.com] lo comprobaras :P) no he visto explicado antes.

    Se me ocurrio pobrarlo y, al ver que parecia funcionar, se me ocurrio tambien que a alguien podria interesarle, asi que lo escribi y lo publique por si acaso (sabes donde? en mi bitacora de barrapunto).

    Lo siento tio, no lo volvere a hacer, de verdad. Te pido humildemente perdon y te agradezco que dejes todo aquello tan importante que estabas haciendo para iluminarme. Alabado seas, amen.
    --
    Este comentario ha sido escrito en Google Chrome dev Build para Linux a partir de electrones 100% reciclados.
    [ Padre ]
  • por gonzaloR (14921) el Martes, 16 Junio de 2009, 12:46h (#1155206)
    ( http://fishblues.blogspot.com/ )
    "la información que te interesa" no siempre va a ser una noticia
    --
    000100111011010101100012
    [ Padre ]
  • por manje (1495) el Viernes, 19 Junio de 2009, 07:48h (#1155825)
    ( http://www.manje.net/ | Última bitácora: Viernes, 08 Octubre de 2010, 10:46h )
    ¿Y quien ha dicho que aquí solo quepan noticias y no otras cosas? En la portada pone, barrapunto, la información que te interesa, no dice nada de noticias. Tampoco es que seamos un repositorios de howto, pero como página de software libre no sobran este tipo de entradas, ni hacen daño a nadie, a quien no le interese que comente en las entradas que si le interesen, no que metan ruido en comentarios de notas que no le interesan.
    [ Padre ]
  • 4 respuestas por debajo de tu umbral de lectura actual.