2012-10-31 21 views

Odpowiedz

34

przekonwertować zawartość pliku do łańcucha & użyć poniższego sposobu:

public static String getMD5EncryptedString(String encTarget){ 
     MessageDigest mdEnc = null; 
     try { 
      mdEnc = MessageDigest.getInstance("MD5"); 
     } catch (NoSuchAlgorithmException e) { 
      System.out.println("Exception while encrypting to md5"); 
      e.printStackTrace(); 
     } // Encryption algorithm 
     mdEnc.update(encTarget.getBytes(), 0, encTarget.length()); 
     String md5 = new BigInteger(1, mdEnc.digest()).toString(16); 
     while (md5.length() < 32) { 
      md5 = "0"+md5; 
     } 
     return md5; 
    } 

Zauważ, że to proste podejście nadaje się do niewielkich strun, ale nie będzie skuteczny w przypadku dużych plików. W przypadku tego ostatniego patrz: dentex's answer.

+1

Dziękuję za odpowiedź. Zadziałało. –

+0

Powitanie .... moja przyjemność ... – hemu

+3

Pamiętaj, że przed Androidem 4.2.1 'MessageDigest.getInstance()' nie był bezpieczny dla wątków. Sprawdź [raport o błędzie] (https://code.google.com/p/android/issues/detail?id=37937) i [popraw] (https://android-review.googlesource.com/#/c/40145 /).Więc jeśli używasz 'HttpResponseCache', lepiej sprawdź, czy jest coś innego – mente

2

kolego spróbować następujący kod

MessageDigest md = MessageDigest.getInstance("MD5"); 
InputStream is = new FileInputStream("file.txt"); 
try { 
     is = new DigestInputStream(is, md); 
     // read stream to EOF as normal... 
    } 
finally { 
     is.close(); 
    } 
byte[] digest = md.digest(); 
102

Ten kod pochodzi z CMupdater z pamięci ROM z systemem CyanogenMod 10.2. Testuje pobrane ROMy do aplikacji Updater.

Kod: https://github.com/CyanogenMod/android_packages_apps_CMUpdater/blob/cm-10.2/src/com/cyanogenmod/updater/utils/MD5.java

To działa jak czar:

/* 
* Copyright (C) 2012 The CyanogenMod Project 
* 
* * Licensed under the GNU GPLv2 license 
* 
* The text of the license can be found in the LICENSE file 
* or at https://www.gnu.org/licenses/gpl-2.0.txt 
*/ 

package com.cyanogenmod.updater.utils; 

import android.text.TextUtils; 
import android.util.Log; 

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStream; 
import java.math.BigInteger; 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 

public class MD5 { 
    private static final String TAG = "MD5"; 

    public static boolean checkMD5(String md5, File updateFile) { 
     if (TextUtils.isEmpty(md5) || updateFile == null) { 
      Log.e(TAG, "MD5 string empty or updateFile null"); 
      return false; 
     } 

     String calculatedDigest = calculateMD5(updateFile); 
     if (calculatedDigest == null) { 
      Log.e(TAG, "calculatedDigest null"); 
      return false; 
     } 

     Log.v(TAG, "Calculated digest: " + calculatedDigest); 
     Log.v(TAG, "Provided digest: " + md5); 

     return calculatedDigest.equalsIgnoreCase(md5); 
    } 

    public static String calculateMD5(File updateFile) { 
     MessageDigest digest; 
     try { 
      digest = MessageDigest.getInstance("MD5"); 
     } catch (NoSuchAlgorithmException e) { 
      Log.e(TAG, "Exception while getting digest", e); 
      return null; 
     } 

     InputStream is; 
     try { 
      is = new FileInputStream(updateFile); 
     } catch (FileNotFoundException e) { 
      Log.e(TAG, "Exception while getting FileInputStream", e); 
      return null; 
     } 

     byte[] buffer = new byte[8192]; 
     int read; 
     try { 
      while ((read = is.read(buffer)) > 0) { 
       digest.update(buffer, 0, read); 
      } 
      byte[] md5sum = digest.digest(); 
      BigInteger bigInt = new BigInteger(1, md5sum); 
      String output = bigInt.toString(16); 
      // Fill to 32 chars 
      output = String.format("%32s", output).replace(' ', '0'); 
      return output; 
     } catch (IOException e) { 
      throw new RuntimeException("Unable to process file for MD5", e); 
     } finally { 
      try { 
       is.close(); 
      } catch (IOException e) { 
       Log.e(TAG, "Exception on closing MD5 input stream", e); 
      } 
     } 
    } 
} 
+1

Działa świetnie i GPL. Dzięki za to. – Michael

+1

Nie ma za co. I tak, GPL. Rozchodzi się do całej aplikacji. – dentex

+0

to pomogło. – Hamad

5

miałem to samo zadanie i ten kod działa doskonałe:

public static String fileToMD5(String filePath) { 
    InputStream inputStream = null; 
    try { 
     inputStream = new FileInputStream(filePath); 
     byte[] buffer = new byte[1024]; 
     MessageDigest digest = MessageDigest.getInstance("MD5"); 
     int numRead = 0; 
     while (numRead != -1) { 
      numRead = inputStream.read(buffer); 
      if (numRead > 0) 
       digest.update(buffer, 0, numRead); 
     } 
     byte [] md5Bytes = digest.digest(); 
     return convertHashToString(md5Bytes); 
    } catch (Exception e) { 
     return null; 
    } finally { 
     if (inputStream != null) { 
      try { 
       inputStream.close(); 
      } catch (Exception e) { } 
     } 
    } 
} 

private static String convertHashToString(byte[] md5Bytes) { 
    String returnVal = ""; 
    for (int i = 0; i < md5Bytes.length; i++) { 
     returnVal += Integer.toString((md5Bytes[i] & 0xff) + 0x100, 16).substring(1); 
    } 
    return returnVal.toUpperCase(); 
} 
3
public static String getMd5OfFile(String filePath) 
{ 
    String returnVal = ""; 
    try 
    { 
     InputStream input = new FileInputStream(filePath); 
     byte[]  buffer = new byte[1024]; 
     MessageDigest md5Hash = MessageDigest.getInstance("MD5"); 
     int   numRead = 0; 
     while (numRead != -1) 
     { 
      numRead = input.read(buffer); 
      if (numRead > 0) 
      { 
       md5Hash.update(buffer, 0, numRead); 
      } 
     } 
     input.close(); 

     byte [] md5Bytes = md5Hash.digest(); 
     for (int i=0; i < md5Bytes.length; i++) 
     { 
      returnVal += Integer.toString((md5Bytes[i] & 0xff) + 0x100, 16).substring(1); 
     } 
    } 
    catch(Throwable t) {t.printStackTrace();} 
    return returnVal.toUpperCase(); 
} 
+0

Ten doskonale spełnia swoją funkcję, dzięki :) – Silas

2

Metoda ta pracował dla mnie , na pliku ZIP 131 MB. MD5 obliczony odpowiada obliczonej na samego pliku przez AccuHash (http://www.accuhash.com)

public static String calculateMD5(File updateFile) { 
     MessageDigest digest; 
     try { 
      digest = MessageDigest.getInstance("MD5"); 
     } catch (NoSuchAlgorithmException e) { 
      Log.e("calculateMD5", "Exception while getting Digest", e); 
      return null; 
     } 

     InputStream is; 
     try { 
      is = new FileInputStream(updateFile); 
     } catch (FileNotFoundException e) { 
      Log.e("calculateMD5", "Exception while getting FileInputStream", e); 
      return null; 
     } 

     byte[] buffer = new byte[8192]; 
     int read; 
     try { 
      while ((read = is.read(buffer)) > 0) { 
       digest.update(buffer, 0, read); 
      } 
      byte[] md5sum = digest.digest(); 
      BigInteger bigInt = new BigInteger(1, md5sum); 
      String output = bigInt.toString(16); 
      // Fill to 32 chars 
      output = String.format("%32s", output).replace(' ', '0'); 
      return output; 
     } catch (IOException e) { 
      throw new RuntimeException("Unable to process file for MD5", e); 
     } finally { 
      try { 
       is.close(); 
      } catch (IOException e) { 
       Log.e("calculateMD5", "Exception on closing MD5 input stream", e); 
      } 
     } 
    } 
1

Znalazłem następujące naprawdę dobrze działa:

Process process = Runtime.getRuntime().exec("md5 "+fileLocation); 
BufferedReader inputStream = new BufferedReader(new InputStreamReader(process.getInputStream())); 
String result = inputStream.readLine().split(" ")[0]; 

nazywa to wbudowane polecenie md5. Zmienna fileLocation musi być ustawiona na położenie pliku. Oczywiście zalecam wykonanie pewnych kontroli, aby sprawdzić, czy plik istnieje.

+0

Czy na pewno ten plik binarny istnieje na każdej instalacji Androida? W moim urządzeniu nazywa się to md5sum. – bk138

+0

@ bk138 już nie. Sądzę, że warto sprawdzić, czy ma to miejsce przed wykonaniem którejkolwiek z wymienionych metod, ponieważ szybkość tego pliku binarnego jest znacznie lepsza niż w jakiejkolwiek implementacji Java. –

0

Jeśli trzeba oblicz MD5 dużego pliku, może chcesz korzystać z tego:

Import:

import java.security.MessageDigest; 

Metoda:

private byte[] calculateMD5ofFile(String location) throws IOException, NoSuchAlgorithmException { 
     FileInputStream fs= new FileInputStream(location); 
     MessageDigest md = MessageDigest.getInstance("MD5"); 
     byte[] buffer=new byte[bufferSize]; 
     int bytes=0; 
     do{ 
      bytes=fs.read(buffer,0,bufferSize); 
      if(bytes>0) 
       md.update(buffer,0,bytes); 

     }while(bytes>0); 
     byte[] Md5Sum = md.digest(); 
     return Md5Sum; 
    } 

Referencje: https://docs.oracle.com/javase/7/docs/api/java/security/MessageDigest.html


Konflikt tablica bajtów na szesnastkowy. używać tego

public static String ByteArraytoHexString(byte[] bytes) { 
    StringBuilder hexString = new StringBuilder(); 
    for (int i = 0; i < bytes.length; i++) { 
     String hex = Integer.toHexString(bytes[i] & 0xFF); 
     if (hex.length() == 1) { 
      hexString.append('0'); 
     } 
     hexString.append(hex); 
    } 
    return hexString.toString(); 
} 

Referencje In Java, how do I convert a byte array to a string of hex digits while keeping leading zeros?

Powiązane problemy