Je comprends comment cela fonctionne, mais si je souhaite imprimer le MD5 en tant que chaîne, comment procéder
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();
}
Essaye ça
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]));
}
}
Vous pouvez l'obtenir en écrivant moins:
String hex = (new HexBinaryAdapter()).marshal(md5.digest(YOUR_STRING.getBytes()))
String input = "168";
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] md5sum = md.digest(input.getBytes());
String output = String.format("%032X", new BigInteger(1, md5sum));
ou
DatatypeConverter.printHexBinary( MessageDigest.getInstance("MD5").digest("a".getBytes("UTF-8")))
Vous pouvez également utiliser la bibliothèque Apache Commons Codec . Cette bibliothèque inclut les méthodes public static String md5Hex(InputStream data)
et public static String md5Hex(byte[] data)
dans la classe DigestUtils
. Inutile de l'inventer vous-même;)
Tout d’abord, vous devez obtenir la sortie byte[]
de la MessageDigest
:
byte[] bytes = hash.digest();
Cependant, vous ne pouvez pas facilement imprimer ceci (avec, par exemple, new String(bytes)
) car il va contenir du binaire qui n'aura pas de bonnes représentations en sortie. Vous pouvez le convertir en hexadécimal pour un affichage comme ceci:
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();
Avec le tableau d'octets, résulte du résumé du message:
...
byte hashgerado[] = md.digest(entrada);
...
for(byte b : hashgerado)
System.out.printf("%02x", Byte.toUnsignedInt(b));
Résultat (par exemple):
89e8a9f68ad3c4bba9b9d3581cf5201d
/**
* 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;
}
FYI ...
Dans certaines situations, cela n'a pas fonctionné pour moi
md5 = new Java.math.BigInteger(1, digest.digest()).toString(16);
mais cela a
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();
Appelez hash.digest()
pour terminer le processus. Il retournera un tableau d'octets.
Vous pouvez créer une chaîne à partir d'un byte[]
à l'aide d'un constructeur String. Toutefois, si vous souhaitez une chaîne hexagonale, vous devez parcourir le tableau d'octets manuellement et définir les caractères.
Chemin le plus court:
String toMD5(String input) {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] raw = md.digest(input.getBytes());
return DatatypeConverter.printHexBinary(raw);
}
N'oubliez pas de gérer l'exception.