debug_mode=ON

Buscar en

 
 

Generar hash SHA-1 de una cadena en Java

Escrito por Davemm hace 1 años bajo una licencia de Creative Commons Creative Commons License
6889 visitas. Etiquetas: hash, java

¿Qué es un Hash?

En informática, Hash se refiere a una función o método para generar claves o llaves que representen de manera casi unívoca a un documento, registro, archivo, etc., resumir o identificar un dato a través de la probabilidad, utilizando una función hash o algoritmo hash. Un hash es el resultado de dicha función o algoritmo.

¿Qué es SHA-1?

La familia SHA (Secure Hash Algorithm, Algoritmo de Hash Seguro) es un sistema de funciones hash criptográficas relacionadas de la Agencia de Seguridad Nacional de los Estados Unidos y publicadas por el National Institute of Standards and Technology (NIST). El primer miembro de la familia fue publicado en 1993 es oficialmente llamado SHA. Sin embargo, hoy día, no oficialmente se le llama SHA-0 para evitar confusiones con sus sucesores. Dos años más tarde el primer sucesor de SHA fue publicado con el nombre de SHA-1.

La codificación hash vacía para SHA-1 corresponde a:

SHA1("") = da39a3ee5e6b4b0d3255bfef95601890afd80709

Visto todo lo anterior, les presento la siguiente Clase que genera el hash SHA-1 de una cadena o texto cualquiera:

// SHA1.java

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class SHA1 {
    private MessageDigest md;
    private byte[] buffer, digest;
    private String hash = "";

    public String getHash(String message) throws NoSuchAlgorithmException {
        buffer = message.getBytes();
        md = MessageDigest.getInstance("SHA1");
        md.update(buffer);
        digest = md.digest();

        for(byte aux : digest) {
            int b = aux & 0xff;
            if (Integer.toHexString(b).length() == 1) hash += "0";
            hash += Integer.toHexString(b);
        }

        return hash;
    }
}

Su uso es muy simple, creamos una instancia de la clase SHA1 y utilizamos su método getHash (dentro de un bloque try-catch), pasándole como parámetro un String ...aquí un ejemplo:

// Demo.java

import java.security.NoSuchAlgorithmException;
public class Demo {
    public static void main (String[] args) {
        SHA1 s = new SHA1();
        String msg = "debug_mode=ON";
        try {
            System.out.println("El hash SHA-1 de \""+msg+"\" es: "+ s.getHash(msg));
        }
        catch(NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
}

...la ejecución de Demo nos imprimiría lo siguiente:

El hash SHA-1 de "debug_mode=ON" es: a3e092760f274530a032fffecc6917905af316f5

Notas:

  • El hash SHA-1 devuelve como resultado una cadena de 40 caracteres de longitud, independientemente de la longitud de la cadena original.
 

¡Votalo! 2 votos
¡Compártelo!

        

&nbps;

&nbps;

Davemm

Sobre Davemm

Blogger en Tecnolack: http://www.tecnolack.com

 
Regístrate o haz login para participar.
¿Todavía no conoces debugmodeon?
debugmodeon es la red social para profesionales de la informática
descubre debugmodeon
 

1 comentarios en "Generar hash SHA-1 de una cadena en Java"

gimenete
gimenete escribió
hace 9 meses

#1   

Hola!

Tengo alguna sugerencia.

  1. Prefiero que sea un método estático que pueda llamar sin tener que instanciar un objeto.
  2. En el método getBytes() prefiero indicar explícitamente que se use UTF-8 como codificación de caracteres.
  3. Evito que quien llame al método tenga que manejar la excepción. Nunca debería ocurrir una NoSuchAlgorithmException ni una UnsupportedEncodingException porque siempre se pasan las mismas constantes. Con hacer un test de unidad bastaría para comprobar que nunca se va a producir la excepción.

Finalmente así quedaría el método:

public static String hexDigest(String message) {
    MessageDigest md;
    byte[] buffer, digest;
    String hash = "";

    try {
        buffer = message.getBytes("UTF-8");
        md = MessageDigest.getInstance("SHA1");
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
    md.update(buffer);
    digest = md.digest();

    for(byte aux : digest) {
        int b = aux & 0xff;
        String s = Integer.toHexString(b);
        if (s.length() == 1) hash += "0";
        hash += s;
    }

    return hash;
}

No obstante se podría hacer una optimización: se sabe que siempre el resultado va a ser una cadena de 40 caracteres. Se podría usar un char[40] en vez de ir concatenando cadenas.

¡Un saludo!

 
 
 
 

© Copyright 2008-2009 debug_mode=ON | Aviso legal | Contacto | FAQ | ¿Quiénes somos? |