some image

Codes and Tags

Generando Hash en Java (MessageDigest)

Etiquetas: , Blog, Programación No comments

Muchas veces la seguridad de los datos se vuelve importante dependiendo el medio donde nos movamos y el tipo de datos que manejemos (contraseñas, numeros de tarjetas, codigos de seguridad, seriales, etc…). En Java se puede utilizar la clase MessageDigest para generar este tipo de hash :).

En esta clase Criptography, muestro un ejemplo de como implementar diferentes algoritmos para generar Hash (MD2, MD5, SHA1, SHA256, SHA512, CRC32).

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.zip.CRC32;
import java.util.zip.Checksum;

/**
 * 
 * Clase que permite obtener diferentes hash en Java, utilizando la clase
 * MessageDigest
 * 
 */
public class Criptography {

	// Miembros de clase
	private String texto = "";
	private Algoritmo algoritmo = null;

	// Constantes
	public static final String VERSION = "1.0";

	/**
	 * Constructor que puede inicializar el algoritmo a utilizar
	 * 
	 * @param texto
	 */
	public Criptography(Algoritmo algoritmo) {
		this.algoritmo = algoritmo;
	}

	public Criptography() {
	}

	/**
	 * Enumeracion de algoritmos soportados por la clase Criptography
	 */
	public enum Algoritmo {
		// Declaracion del nombre de cada algoritmo
		MD2("MD2"), MD5("MD5"), SHA1("SHA-1"), SHA256("SHA-256"), SHA512(
				"SHA-512"), CRC32("CRC32");

		// nombre del algoritmo
		private String nombre;

		// Constructor que inicializa los nombres de los algoritmos disponibles
		private Algoritmo(String nombre) {
			this.nombre = nombre;
		}

		// Devuelve el nombre del algoritmo que se esta usando
		private String getNombre() {
			return nombre;
		}
	}

	/**
	 * Getters an Setters de la clase
	 */
	public String getTexto() {
		return texto;
	}

	public Algoritmo getAlgoritmo() {
		return algoritmo;
	}

	public void setAlgoritmo(Algoritmo algoritmo) {
		this.algoritmo = algoritmo;
	}

	/**
	 * Genera el hash del texto definido en la clase
	 * 
	 * @return hash
	 */
	public String generateHash(String texto) {
		this.texto = texto;
		// Variable que almacena el criptograma generado
		String hash = "";
		// Variable que guardara el digest generado
		byte[] digest = null;
		// Variable que obtiene el buffer del texto
		byte[] buffer = texto.getBytes();

		switch (algoritmo) {
		case MD2:
		case MD5:
		case SHA1:
		case SHA256:
		case SHA512:
			// Se intenta obtener el Message Digest del algoritmo
			// seleccionado. Esto es en base a la clase MessageDigest
			// del paquete Security de Java
			try {
				// Instancio un objeto MessageDigest con el algoritmo apropiado
				MessageDigest md = MessageDigest.getInstance(algoritmo
						.getNombre());
				// Reseteo el digest que pueda existir en el objeto
				md.reset();
				// Envio el buffer el mensaje a encriptar
				md.update(buffer);
				// Obtengo el Digest del Message
				digest = md.digest();
				// Obtengo la cadena del hash en valores hexadecimales
				hash = toHexadecimal(digest);
			} catch (NoSuchAlgorithmException e) {
				// Controlo el mensaje de cualquier excepcion generada
				e.printStackTrace();
			}
			break;

		case CRC32:
			// Obtengo el CRC32 del texto ingresado
			hash = getCRC32();
			break;
		}
		// retorna el criptograma generado
		return hash;
	}

	/**
	 * Para los algoritmos que tienen hash, hace la conversion del arreglo de
	 * bytes[] generado a una cadena String
	 * 
	 * @param digest
	 * @return hash
	 */
	private String toHexadecimal(byte[] digest) {
		String hash = "";
		for (byte aux : digest) {
			int b = aux & 0xff; // Hace un cast del byte a hexadecimal
			if (Integer.toHexString(b).length() == 1)
				hash += "0";
			hash += Integer.toHexString(b);
		}
		return hash;
	}

	/**
	 * Obtiene el Checksum 32 (CRC32) del texto ingresado
	 * 
	 * @return
	 */
	private String getCRC32() {
		String hash = null;
		byte[] bytes = texto.getBytes();
		// Objeto Checksum
		Checksum crc32 = new CRC32();
		// Inicializo el objeto
		crc32.reset();
		// Actualizo la con el arreglo de bytes que obtengo del texto
		crc32.update(bytes, 0, bytes.length);
		hash = Long.toHexString(crc32.getValue()).toUpperCase();
		return hash;
	}

	/**
	 * Ejemplo de uso de la clase
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		// 1. Creacion del objeto Criptography :
		Criptography ejemplo = new Criptography();

		// Obteniendo version
		System.out.println(" [            Criptography " + ejemplo.VERSION
				+ "            ]\n");

		// 2. Seleccionar el algoritmo
		ejemplo.setAlgoritmo(Algoritmo.MD2);

		// 3. Obtener el hash
		System.out.println("\nHash : "
				+ ejemplo.generateHash("Esta es una prueba"));
		System.out.println("Algoritmo : " + ejemplo.getAlgoritmo());
		System.out.println("Texto : " + ejemplo.getTexto());

		// 4. Cambiar el algoritmo
		ejemplo.setAlgoritmo(Algoritmo.MD5);
		System.out.println("\nHash : "
				+ ejemplo.generateHash("Esta es una prueba"));
		System.out.println("Algoritmo : " + ejemplo.getAlgoritmo());
		System.out.println("Texto : " + ejemplo.getTexto());

		// 5. Cambiar el texto
		ejemplo.setAlgoritmo(Algoritmo.SHA256);
		System.out.println("\nHash : "
				+ ejemplo.generateHash("Codes and Tags in other Hash"));
		System.out.println("Algoritmo : " + ejemplo.getAlgoritmo());
		System.out.println("Texto : " + ejemplo.getTexto());

		// Y otro algoritmo....
		ejemplo.setAlgoritmo(Algoritmo.CRC32);
		System.out
				.println("\nHash : " + ejemplo.generateHash("Utilizando CRC32"));
		System.out.println("Algoritmo : " + ejemplo.getAlgoritmo());
		System.out.println("Texto : " + ejemplo.getTexto());
	}
}

Salida

 [            Criptography 1.0            ]


Hash : 392aeb7f6564fbce3204e41d0ba27bf2
Algoritmo : MD2
Texto : Esta es una prueba

Hash : f099ae43ce165c31c5956d44190288cd
Algoritmo : MD5
Texto : Esta es una prueba

Hash : 2af6b965237c2f973dcb9bf1145ad19650ec1089f0740f383b4a948b97547be0
Algoritmo : SHA256
Texto : Codes and Tags in other Hash

Hash : 796FEE50
Algoritmo : CRC32
Texto : Utilizando CRC32

About Edwin Torres

Related Posts

  • Logo Java
  • Logo Java
  • Logo Java
  • Logo Java

Add your comment