/* * Copyright 2012-2016 Amazon Technologies, Inc. * * Portions copyright 2006-2009 James Murty. Please see LICENSE.txt * for applicable license terms and NOTICE.txt for applicable notices. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://aws.amazon.com/apache2.0 * * This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES * OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and * limitations under the License. */ package com.amazonaws.util; import org.apache.commons.logging.LogFactory; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * Utility methods for computing MD5 sums. */ public class Md5Utils { private static final int SIXTEEN_K = 1 << 14; /** * Computes the MD5 hash of the data in the given input stream and returns * it as an array of bytes. Note this method closes the given input stream * upon completion. */ public static byte[] computeMD5Hash(InputStream is) throws IOException { BufferedInputStream bis = new BufferedInputStream(is); try { MessageDigest messageDigest = MessageDigest.getInstance("MD5"); byte[] buffer = new byte[SIXTEEN_K]; int bytesRead; while ((bytesRead = bis.read(buffer, 0, buffer.length)) != -1) { messageDigest.update(buffer, 0, bytesRead); } return messageDigest.digest(); } catch (NoSuchAlgorithmException e) { // should never get here throw new IllegalStateException(e); } finally { try { bis.close(); } catch (Exception e) { LogFactory.getLog(Md5Utils.class).debug( "Unable to close input stream of hash candidate: " + e); } } } /** * Returns the MD5 in base64 for the data from the given input stream. Note * this method closes the given input stream upon completion. */ public static String md5AsBase64(InputStream is) throws IOException { return Base64.encodeAsString(computeMD5Hash(is)); } /** * Computes the MD5 hash of the given data and returns it as an array of * bytes. */ public static byte[] computeMD5Hash(byte[] input) { try { MessageDigest md = MessageDigest.getInstance("MD5"); return md.digest(input); } catch (NoSuchAlgorithmException e) { // should never get here throw new IllegalStateException(e); } } /** * Returns the MD5 in base64 for the given byte array. */ public static String md5AsBase64(byte[] input) { return Base64.encodeAsString(computeMD5Hash(input)); } /** * Computes the MD5 of the given file. */ public static byte[] computeMD5Hash(File file) throws FileNotFoundException, IOException { return computeMD5Hash(new FileInputStream(file)); } /** * Returns the MD5 in base64 for the given file. */ public static String md5AsBase64(File file) throws FileNotFoundException, IOException { return Base64.encodeAsString(computeMD5Hash(file)); } }