Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to generate an MD5 checksum for a file in Android?

In my app I have a requirement to generate an MD5 checksum for a file. Could you please tell me if there is any way in which this can be achieved?

Thank you.

like image 259
Ingrid Cooper Avatar asked Oct 31 '12 06:10

Ingrid Cooper


People also ask

How do I find the MD5 checksum of a file?

Open a terminal window. Type the following command: md5sum [type file name with extension here] [path of the file] -- NOTE: You can also drag the file to the terminal window instead of typing the full path. Hit the Enter key. You'll see the MD5 sum of the file.


2 Answers

This code is from the CMupdater, from the CyanogenMod 10.2 android ROM. It tests the downloaded ROMs into the updater App.

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

It works like a charm:

/*  * 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);             }         }     } } 
like image 141
dentex Avatar answered Sep 19 '22 00:09

dentex


Convert the file content into string & use the below method:

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

Note that this simple approach is suitable for smallish strings, but will not be efficient for large files. For the latter, see dentex's answer.

like image 25
hemu Avatar answered Sep 21 '22 00:09

hemu