java - convert - Obtener cadena MD5 de Message Digest
java string to md5 example (10)
Con la matriz de bytes, resultado del resumen del mensaje:
...
byte hashgerado[] = md.digest(entrada);
...
for(byte b : hashgerado)
System.out.printf("%02x", Byte.toUnsignedInt(b));
Resultado (por ejemplo):
89e8a9f68ad3c4bba9b9d3581cf5201d
Entiendo cómo funciona, pero si quiero imprimir el MD5 como String, ¿cómo lo haría?
public static void getMD5(String fileName) throws Exception{
InputStream input = new FileInputStream(fileName);
byte[] buffer = new byte[1024];
MessageDigest hash = MessageDigest.getInstance("MD5");
int read;
do {
read = input.read(buffer);
if (read > 0) {
hash.update(buffer, 0, read);
}
} while (read != -1);
input.close();
}
Esta es otra versión de @anything respuesta:
StringBuilder sb = new StringBuilder();
for (int i = 0; i < digest.length; i++) {
if ((0xff & digest[i]) < 0x10) {
sb.append("0").append(Integer.toHexString((0xFF & digest[i])));
} else {
sb.append(Integer.toHexString(0xFF & digest[i]));
}
}
String result = sb.toString();
FYI ...
En ciertas situaciones esto no funcionó para mí
md5 = new java.math.BigInteger(1, digest.digest()).toString(16);
pero esto hizo
StringBuilder sb = new StringBuilder();
for (int i = 0; i < digest.length; i++) {
if ((0xff & digest[i]) < 0x10) {
sb.append("0").append(Integer.toHexString((0xFF & digest[i])));
} else {
sb.append(Integer.toHexString(0xFF & digest[i]));
}
}
String result = sb.toString();
Llame a hash.digest()
para finalizar el proceso. Devolverá una matriz de bytes.
Puede crear una cadena a partir de un byte[]
usando un constructor de cadenas, sin embargo, si quiere una cadena hexadecimal, tendrá que recorrer manualmente la matriz de bytes y calcular los caracteres.
Primero necesita obtener el resultado del byte[]
del MessageDigest
:
byte[] bytes = hash.digest();
Sin embargo, no puede imprimirlo fácilmente (con, por ejemplo, new String(bytes)
) porque contendrá binarios que no tendrán buenas representaciones de salida. Sin embargo, puedes convertirlo en hexadecimal para mostrarlo así:
StringBuilder sb = new StringBuilder(2 * bytes.length);
for (byte b : bytes) {
sb.append("0123456789ABCDEF".charAt((b & 0xF0) >> 4));
sb.append("0123456789ABCDEF".charAt((b & 0x0F)));
}
String hex = sb.toString();
Prueba esto
StringBuffer hexString = new StringBuffer();
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] hash = md.digest();
for (int i = 0; i < hash.length; i++) {
if ((0xff & hash[i]) < 0x10) {
hexString.append("0"
+ Integer.toHexString((0xFF & hash[i])));
} else {
hexString.append(Integer.toHexString(0xFF & hash[i]));
}
}
Puede obtenerlo escribiendo menos:
String hex = (new HexBinaryAdapter()).marshal(md5.digest(YOUR_STRING.getBytes()))
También puede utilizar la biblioteca Apache Commons Codec. Esta biblioteca incluye métodos public static String md5Hex(InputStream data)
y public static String md5Hex(byte[] data)
en la clase DigestUtils
. No es necesario que inventes esto tú mismo;)
String input = "168";
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] md5sum = md.digest(input.getBytes());
String output = String.format("%032X", new BigInteger(1, md5sum));
o
DatatypeConverter.printHexBinary( MessageDigest.getInstance("MD5").digest("a".getBytes("UTF-8")))
/**
* hashes:
* e7cfa2be5969e235138356a54bad7fc4
* 3c9ec110aa171b57bb41fc761130822c
*
* compiled with java 8 - 12 Dec 2015
*/
public static String generateHash() {
long r = new java.util.Random().nextLong();
String input = String.valueOf(r);
String md5 = null;
try {
java.security.MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
//Update input string in message digest
digest.update(input.getBytes(), 0, input.length());
//Converts message digest value in base 16 (hex)
md5 = new java.math.BigInteger(1, digest.digest()).toString(16);
}
catch (java.security.NoSuchAlgorithmException e) {
e.printStackTrace();
}
return md5;
}