Intereting Posts
Как я могу использовать вывод в logcat после Fatal Signal 11, чтобы выяснить, откуда я получаю сообщение об ошибке в собственном коде Android? Как добавить другой EditText, когда я нажимаю и заполняю другой (Android) Ошибка: «app_name» не переведено в af Нет Интернета на эмуляторе Android – почему и как исправить? Как установить регулятор громкости мультимедиа для Android Adobe AIR? Как просто создать образ системы Android Android BLE – Как вызывается метод onScanResult в ScanCallback? Переупорядочивание списков, таких как плейлисты в медиаплеере Как получить случайный цвет материала? ACTION_BATTERY_CHANGED стрельба как сумасшедший Получить цвет фона кнопки в android Скачивание большого файла (> 100 Мб) на Honeycomb в AsyncTask замедляет пользовательский интерфейс, возможно, из-за GC? Не удается найти папку .android в ubuntu Установка ширины представления программы Размер шрифта для Android-приложений изменяется в соответствии с заданным размером шрифта в настройках

Как создать контрольную сумму MD5 для файла в Android?

В моем приложении у меня есть требование создать контрольную сумму MD5 для файла. Не могли бы вы рассказать мне, есть ли способ, которым это может быть достигнуто?

Спасибо.

Преобразуйте содержимое файла в строку и используйте метод ниже:

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; } 

Обратите внимание, что этот простой подход подходит для небольших строк, но не эффективен для больших файлов. Для последнего см . Ответ dentex .

Этот код из CMupdater, из CyanogenMod 10.2 android ROM. Он тестирует загруженные ПЗУ в приложение обновления.

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

Отлично работает:

 /* * 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); } } } } 

У меня была та же задача, и этот код отлично работает:

 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(); } 
 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(); } 

Приятель попробуй следующий код

 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(); 

Этот метод работал для меня, в zip-файле размером 131 МБ. MD5 рассчитаны совпадения, рассчитанные в том же файле 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); } } } 

Я нашел следующее, чтобы работать очень хорошо:

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

Это вызывает встроенную команду md5 . Переменная fileLocation должна быть установлена ​​в расположение файла. Конечно, я рекомендую конструировать некоторые проверки здесь, чтобы проверить, существует ли файл.

Если вам нужно вычислить MD5 большого файла , вы можете использовать это:

Импортировать:

 import java.security.MessageDigest; 

Метод:

  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; } в  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; } 

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


Чтобы преобразовать массив байтов в шестнадцатеричный. использовать это

 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(); } 

Refrence В Java, как мне преобразовать массив байтов в строку шестнадцатеричных цифр, сохраняя ведущие нули?