Ahora que quería recopilar las cosas que había estado haciendo, me he encontrado con que no localizo alguna de éstas, y además, que lo que tengo, no es exactamente como esperaba.
Para el tema de los hashes me estoy acordando de que tengo dos opciones.
Opción "nativa"
Para esta opción tenemos que utilizar MessageDigest. En el mismo momento de instanciarla habrá que indicarle el algoritmo que queremos utilizar. Si no existiese, nos lanzaría una excepción. Un ejemplo sería este:
String valor = "123456";
try{
String hashAux = "";
MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
messageDigest.reset();
messageDigest.digest(valor.getBytes("UTF-8"));
messageDigest.update(valor.getBytes());
byte[] digestArray = messageDigest.digest();
for(byte aux : digestArray) {
int b = aux & 0xff;
if (Integer.toHexString(b).length() == 1)
hashAux += "0";
hashAux += Integer.toHexString(b);
}
String result = new String(digestArray);
System.out.println("hashAux: "+hashAux);
}catch(Exception e){
System.out.println("E: "+e);
}
Como resultado obtendremos:
8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
y se puede verificar que es correcto al compararlo en un algún sitio por Internet.
Además, hay que tener en cuenta los distintos algoritmos que pueda permitir. Al menos no parece trivial encontrarlo. En alguno de los sitios donde he ido a buscar (porque, recuerdo, que hacía tiempo que no tenía que trabajar sobre esto, y lo de hardcodear los valores no me hacía ninguna gracia), he visto una lista parecida a esta:
- MD2
- MD5
- SHA-256
- SHA-384
- SHA-512
- SHA, SHA-1, SHA1
String hashAux2 = null;
String hashAux3 = "";
byte[] hashAux3byte = null;
try{
hashAux2 = DigestUtils.sha256Hex(valor);
hashAux3byte = DigestUtils.sha256(valor);
for(byte aux : hashAux3byte) {
int b = aux & 0xff;
if (Integer.toHexString(b).length() == 1)
hashAux3 += "0";
hashAux3 += Integer.toHexString(b);
}
System.out.println("hashAux2: "+hashAux2);
System.out.println("hashAux3: "+hashAux3);
}catch(Exception e){
System.out.println("Exception hash: "+e.getMessage());
}
A la hora de ejecutar este último ejemplo podremos ver que, en efecto, el resultado es el mismo que en el primero.
Esta última opción creo que es la mejor, aún dependiendo de una librería que se tenga que importar y que no venga directamente en la paquetería de java.
Espero que esto os sea de utilidad. Por mi parte, me vendrá muy bien tenerlo a mano para cuando se me vuelva a olvidar cómo lo hice.

