Question Obtenir la somme de contrôle MD5 d'un fichier en Java


Je cherche à utiliser Java pour obtenir la somme de contrôle MD5 d'un fichier. J'ai été vraiment surpris, mais je n'ai rien trouvé qui montre comment obtenir la somme de contrôle MD5 d'un fichier.

Comment est-il fait?


416
2017-11-20 03:45


origine


Réponses:


Il y a un décorateur de flux d'entrée, java.security.DigestInputStream, de sorte que vous pouvez calculer le résumé en utilisant le flux d'entrée comme vous le feriez normalement, au lieu d'avoir à effectuer un passage supplémentaire sur les données.

MessageDigest md = MessageDigest.getInstance("MD5");
try (InputStream is = Files.newInputStream(Paths.get("file.txt"));
     DigestInputStream dis = new DigestInputStream(is, md)) 
{
  /* Read decorated stream (dis) to EOF as normal... */
}
byte[] digest = md.digest();

470
2017-11-20 04:46



Utilisation DigestUtils de Apache Commons Codec bibliothèque:

FileInputStream fis = new FileInputStream(new File("foo"));
String md5 = org.apache.commons.codec.digest.DigestUtils.md5Hex(fis);
fis.close();

252
2018-05-28 21:04



Il y a un exemple à Java's How-to-Real en utilisant le MessageDigest classe.

Vérifiez cette page pour des exemples utilisant CRC32 et SHA-1.

import java.io.*;
import java.security.MessageDigest;

public class MD5Checksum {

   public static byte[] createChecksum(String filename) throws Exception {
       InputStream fis =  new FileInputStream(filename);

       byte[] buffer = new byte[1024];
       MessageDigest complete = MessageDigest.getInstance("MD5");
       int numRead;

       do {
           numRead = fis.read(buffer);
           if (numRead > 0) {
               complete.update(buffer, 0, numRead);
           }
       } while (numRead != -1);

       fis.close();
       return complete.digest();
   }

   // see this How-to for a faster way to convert
   // a byte array to a HEX string
   public static String getMD5Checksum(String filename) throws Exception {
       byte[] b = createChecksum(filename);
       String result = "";

       for (int i=0; i < b.length; i++) {
           result += Integer.toString( ( b[i] & 0xff ) + 0x100, 16).substring( 1 );
       }
       return result;
   }

   public static void main(String args[]) {
       try {
           System.out.println(getMD5Checksum("apache-tomcat-5.5.17.exe"));
           // output :
           //  0bb2827c5eacf570b6064e24e0e6653b
           // ref :
           //  http://www.apache.org/dist/
           //          tomcat/tomcat-5/v5.5.17/bin
           //              /apache-tomcat-5.5.17.exe.MD5
           //  0bb2827c5eacf570b6064e24e0e6653b *apache-tomcat-5.5.17.exe
       }
       catch (Exception e) {
           e.printStackTrace();
       }
   }
}

142
2017-11-20 03:48



le com.google.common.hash API offre:

  • Une API conviviale unifiée pour toutes les fonctions de hachage
  • Implémentations de 32 et 128 bits de murmur3
  • Les adaptateurs md5 (), sha1 (), sha256 (), sha512 () modifient une seule ligne de code pour basculer entre ceux-ci et murmur.
  • goodFastHash (bits int), pour quand vous ne vous souciez pas de l'algorithme que vous utilisez
  • Utilitaires généraux pour les instances HashCode, tels que combineOrdered / combineUnordered

Lisez le guide de l'utilisateur (IO expliqué, Hashing Explained).

Pour votre cas d'utilisation Files.hash() calcule et renvoie la valeur de résumé pour un fichier.

Par exemple un  digérer le calcul (changer SHA-1 à MD5 pour obtenir MD5 digest)

HashCode hc = Files.asByteSource(file).hash(Hashing.sha1());
"SHA-1: " + hc.toString();

Notez que  est beaucoup plus rapide que , alors utilisez  si vous n'avez pas besoin d'une somme de contrôle cryptographiquement sécurisée. Notez aussi que  ne devrait pas être utilisé pour stocker des mots de passe et autres, car il est facile de forcer la force, pour l'utilisation de mots de passe ,  ou  au lieu.

Pour une protection à long terme avec des hashes a Schéma de signature Merkle ajoute à la sécurité et le groupe d'étude sur la cryptographie post-quantique parrainé par la Commission européenne a recommandé l'utilisation de cette cryptographie pour la protection à long terme contre les ordinateurs quantiques (ref).

Notez que  a un taux de collision plus élevé que les autres.


84
2017-12-24 11:18



En utilisant nio2 (Java 7+) et aucune bibliothèque externe:

byte[] b = Files.readAllBytes(Paths.get("/path/to/file"));
byte[] hash = MessageDigest.getInstance("MD5").digest(b);

Pour comparer le résultat avec une somme de contrôle attendue:

String expected = "2252290BC44BEAD16AA1BF89948472E8";
String actual = DatatypeConverter.printHexBinary(hash);
System.out.println(expected.equalsIgnoreCase(actual) ? "MATCH" : "NO MATCH");

42
2017-10-07 08:12



Goyave fournit désormais une nouvelle API de hachage cohérente, beaucoup plus conviviale que les différentes API de hachage fournies dans le JDK. Voir Hashing Explained. Pour un fichier, vous pouvez obtenir la somme MD5, CRC32 (avec la version 14.0+) ou de nombreux autres hachages facilement:

HashCode md5 = Files.hash(file, Hashing.md5());
byte[] md5Bytes = md5.asBytes();
String md5Hex = md5.toString();

HashCode crc32 = Files.hash(file, Hashing.crc32());
int crc32Int = crc32.asInt();

// the Checksum API returns a long, but it's padded with 0s for 32-bit CRC
// this is the value you would get if using that API directly
long checksumResult = crc32.padToLong();

33
2017-10-08 22:08



Une approche simple sans bibliothèques tierces utilisant Java 7

String path = "your complete file path";
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(Files.readAllBytes(Paths.get(path)));
byte[] digest = md.digest();

Si vous avez besoin d'imprimer ce tableau d'octets. Utilisez comme ci-dessous

System.out.println(Arrays.toString(digest));

Si vous avez besoin d'une chaîne hexagonale à partir de ce résumé. Utilisez comme ci-dessous

String digestInHex = DatatypeConverter.printHexBinary(digest).toUpperCase();
System.out.println(digestInHex);

où DatatypeConverter est javax.xml.bind.DatatypeConverter


21
2017-10-31 08:23



D'accord. Je devais ajouter. Implémentation d'une ligne pour ceux qui ont déjà des dépendances Spring et Apache Commons ou qui prévoient de l'ajouter:

DigestUtils.md5DigestAsHex(FileUtils.readFileToByteArray(file))

Option Forons et Apache seulement (crédit @duleshi):

DigestUtils.md5Hex(FileUtils.readFileToByteArray(file))

J'espère que cela aide quelqu'un.


21
2018-03-20 15:09



J'ai récemment dû faire cela pour juste une chaîne dynamique, MessageDigest peut représenter le hachage de nombreuses façons. Pour obtenir la signature du fichier comme vous obtiendriez avec le md5sum commande que je devais faire quelque chose comme ça:

try {
   String s = "TEST STRING";
   MessageDigest md5 = MessageDigest.getInstance("MD5");
   md5.update(s.getBytes(),0,s.length());
   String signature = new BigInteger(1,md5.digest()).toString(16);
   System.out.println("Signature: "+signature);

} catch (final NoSuchAlgorithmException e) {
   e.printStackTrace();
}

Cela ne répond évidemment pas à votre question sur la façon de le faire spécifiquement pour un fichier, la réponse ci-dessus traite de ce calme bien. J'ai juste passé beaucoup de temps à faire en sorte que la somme ressemble à la plupart des applications, et je pensais que vous pourriez rencontrer le même problème.


13
2017-11-20 05:30



public static void main(String[] args) throws Exception {
    MessageDigest md = MessageDigest.getInstance("MD5");
    FileInputStream fis = new FileInputStream("c:\\apache\\cxf.jar");

    byte[] dataBytes = new byte[1024];

    int nread = 0;
    while ((nread = fis.read(dataBytes)) != -1) {
        md.update(dataBytes, 0, nread);
    };
    byte[] mdbytes = md.digest();
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < mdbytes.length; i++) {
        sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
    }
    System.out.println("Digest(in hex format):: " + sb.toString());
}

Ou vous pouvez obtenir plus d'informations http://www.asjava.com/core-java/java-md5-example/ 


11
2017-12-31 06:22