====== Différences ====== Ci-dessous, les différences entre deux révisions de la page.
| — |
misc:md5_sha1_sum_java [2011/10/31 15:55] (Version actuelle) |
||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | Voilà comment vérifier l'intégrité de fichiers en Java : | ||
| + | <file java FileHashSum.java> | ||
| + | import java.io.File; | ||
| + | import java.io.FileInputStream; | ||
| + | import java.security.DigestInputStream; | ||
| + | import java.security.MessageDigest; | ||
| + | /** | ||
| + | * Calcule et compare les empreintes MD5 et SHA-1 des fichiers. | ||
| + | * | ||
| + | * @author Mr-Hide (JB, http://www.mrhide.fr) | ||
| + | * copyleft | ||
| + | */ | ||
| + | public class FileHashSum { | ||
| + | /** | ||
| + | * compare le <code>sha1sum</code> donné avec l'empreinte du fichier local <code>file</code>. | ||
| + | * @param file le fichier dont on doit calculer l'empreinte sha1 | ||
| + | * @param sha1sum l'empreinte à comparer | ||
| + | * @return true si l'empreinte du fichier correspond à <code>sha1sum</code> | ||
| + | */ | ||
| + | public static boolean compareSha1sum(File file, String sha1sum) { | ||
| + | boolean res = false; | ||
| + | if (sha1sum.equals(sha1sum(file))) { | ||
| + | res = true; | ||
| + | } | ||
| + | return res; | ||
| + | } | ||
| + | |||
| + | /** | ||
| + | * Retourne l'empreinte sha1 de fichier <code>file</code> ou null si le | ||
| + | * fichier n'a pas pu être lu. | ||
| + | * @param file le fichier dont on doit calculer l'empreinte sha1 | ||
| + | * @return l'empreinte sha1 | ||
| + | */ | ||
| + | public static String sha1sum(File file){ | ||
| + | String localSha1Sum = null; | ||
| + | if (file.exists() && file.isFile() && file.canRead()){ | ||
| + | try { | ||
| + | MessageDigest md = MessageDigest.getInstance("SHA-1"); | ||
| + | DigestInputStream dis = new DigestInputStream(new FileInputStream(file), md); | ||
| + | dis.on(true); | ||
| + | |||
| + | while (dis.read() != -1){ | ||
| + | ; | ||
| + | } | ||
| + | byte[] b = md.digest(); | ||
| + | localSha1Sum = getHexString(b); | ||
| + | } catch (Exception ex) { | ||
| + | ex.printStackTrace(); | ||
| + | } | ||
| + | } else { | ||
| + | System.out.println("impossible de trouver le fichier : "+file.getAbsolutePath()); | ||
| + | } | ||
| + | return localSha1Sum; | ||
| + | } | ||
| + | |||
| + | /** | ||
| + | * Compare le <code>md5sum</code> donné avec l'empreinte du fichier local <code>file</code>. | ||
| + | * L'utilisation de MD5 est déconseillée ! Il existe en effet une faille de sécurité par collision sur MD5 | ||
| + | * Utilisez plutôt SHA-1. | ||
| + | * @param file le fichier dont on doit calculer l'empreinte md5 | ||
| + | * @param sha1sum l'empreinte à comparer | ||
| + | * @return true si l'empreinte du fichier correspond à <code>md5sum</code> | ||
| + | */ | ||
| + | public static boolean compareMd5sum(File file, String md5sum) { | ||
| + | boolean res = false; | ||
| + | if (md5sum.equals(md5sum(file))){ | ||
| + | res = true; | ||
| + | } | ||
| + | return res; | ||
| + | } | ||
| + | |||
| + | /** | ||
| + | * Retourne l'empreinte md5 de fichier <code>file</code> ou null si le | ||
| + | * fichier n'a pas pu être lu. | ||
| + | * @param file le fichier dont on doit calculer l'empreinte md5 | ||
| + | * @return l'empreinte md5 | ||
| + | */ | ||
| + | public static String md5sum(File file) { | ||
| + | String localMd5Sum = null; | ||
| + | if (file.exists() && file.isFile() && file.canRead()){ | ||
| + | try { | ||
| + | MessageDigest md = MessageDigest.getInstance("MD5"); | ||
| + | DigestInputStream dis = new DigestInputStream(new FileInputStream(file), md); | ||
| + | dis.on(true); | ||
| + | |||
| + | while (dis.read() != -1){ | ||
| + | ; | ||
| + | } | ||
| + | byte[] b = md.digest(); | ||
| + | localMd5Sum = getHexString(b); | ||
| + | } catch (Exception ex) { | ||
| + | ex.printStackTrace(); | ||
| + | } | ||
| + | } else { | ||
| + | System.out.println("impossible de trouver le fichier : "+file.getAbsolutePath()); | ||
| + | } | ||
| + | return localMd5Sum; | ||
| + | } | ||
| + | |||
| + | private static String getHexString(byte[] bytes) { | ||
| + | StringBuilder sb = new StringBuilder(bytes.length*2); | ||
| + | for (byte b : bytes) { | ||
| + | if (b <= 0x0F && b >= 0x00) { // On rajoute le 0 de poid fort ignoré à la conversion. | ||
| + | sb.append('0'); | ||
| + | } | ||
| + | sb.append( String.format("%x", b) ); | ||
| + | } | ||
| + | return sb.toString(); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | </file> | ||