Archive for the ‘hello world’ Category

Java: Calcular hash

Como ya nos instruyó Josep Rivas en un post anterior Generación de Hashes en Objective-C, el concepto de Hash debe de usarse para comprobaciones y no para almacenar datos por los motivos que ya se mencionaron.

Tanto como si queremos usar un hash para comprobar como para almacenar datos, en Java lo podemos hacer utilizando lo que se conoce como Clases Motor, como por ejemplo la clase MessageDigest. Las clases motor en criptografía Java se deben al concepto de Independencia y extensibilidad de los algoritmos (uno de los 2 conceptos básicos en que se basa la Arquitectura Criptográfica de Java (JCA), más información aquí). Esto significa que JCA nos ofrece unas clases que proporcionan la funcionalidad de servicios criptográficos.

En resumen, Java no proporciona las funciones MD5 o SHA-256 de forma directa (como lo hace php por ejemplo), sino que hay que tomar una clase que ofrece servicios e implementar las funciones o métodos usando los servicios de encriptación que nos ofrece esa clase.

Vemos un ejemplo para aclarar estos conceptos. Tomaremos como clase motor la clase MessageDigest. Crearemos una clase “encrypt” en la que implementaremos nuestros métodos de hash. Luego esta clase la podremos usar en nuestros proyectos Java, Android, etc. Para empezar crearemos un método para calcular el Hash de una cadena en MD5.

/** Import MessageDigest Motor Class **/
import java.security.MessageDigest;
public class encrypt {
/**
 * Public Method md5Str
 * ARG: String
 * RETURN: Hash of String
 */
      public static String md5Str(String str) throws Exception
      {
            // Create a MessageDigest with MD5 criptographic services
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            // Load values to MessageDigest
            md5.update(str.getBytes());           
            // Get Encrypted value and show it in hexadecimal
            StringBuilder sb = new StringBuilder();
            for (byte b : md5.digest())
                  sb.append(Integer.toHexString(0x100 + (b & 0xff)).substring(1));
            return sb.toString();       
      }
 }

Obtenemos de la cadena “Hello World” el siguiente hash MD5: b10a8db164e0754105b7a99be72e3fe5

La JCA permite los siguientes algoritmos en sus clases motor

  • MD2
  • MD5
  • SHA-1
  • SHA-256
  • SHA-384
  • SHA-512

Por lo tanto, rápidamente pasando un parámetro más a nuestra método, podemos obtener un método que nos muestre el hash de una cadena en función del algoritmo deseado:

      public static String hashStr(String str, String type) throws Exception
      {
            MessageDigest md= MessageDigest.getInstance(type);
            md.update(str.getBytes());
            StringBuilder sb = new StringBuilder();
            for (byte b : md.digest())
                  sb.append(Integer.toHexString(0x100 + (b & 0xff)).substring(1));
            return sb.toString();       
      }

IMPORTANTE: Hay que afinar el método para verificar que los valores de type son los esperados y no generemos errores o excepciones inesperadas.

Estos son los HASH generados con este último método para la cadena “Hello World”

  • encrypt.hashStr(“Hello World”, “MD2″));

MD2: 27454d000b8f9aaa97da6de8b394d986

  • encrypt.hashStr(“Hello World”, “MD5″));

MD5: b10a8db164e0754105b7a99be72e3fe5

  • encrypt.hashStr(“Hello World”, “SHA-1″));

SHA-1: 0a4d55a8d778e5022fab701977c5d840bbc486d0

  • encrypt.hashStr(“Hello World”, “SHA-256″));

SHA-256: a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e

  • encrypt.hashStr(“Hello World”, “SHA-384″));

SHA-384: 99514329186b2f6ae4a1329e7ee6c610a729636335174ac6b740f9028396fcc803d0e93863a7c3d90f86beee782f4f3f

  • encrypt.hashStr(“Hello World”, “SHA-512″));

SHA-512: 2c74fd17edafd80e8447b0d46741ee243b7eb74dd2149a0ab1b9246fb30382f27e853d8585719e0e67cbda0daa8f51671064615d645ae27acb15bfb1447f459b

Podeis comprobar los valores aquí.

Espero que esto nos ayude un poco más en el mundo de la encriptación.

Share

Android: Hello world!

Como siempre que empezamos con un lenguaje o entorno nuevo lo hacemos con el típico “Hello world”.

En entorno Android no hay que programar propiamente dicho, lo podemos hacer directament en la definición del Layout, en este caso en el fichero main.xml. Utilizaremos un objeto textView dentro de un contenedor LinearLayout.

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:text="Hello World!"
    />

</LinearLayout>

 

Share