/* * Copyright 2012-2019 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 com.amazonaws.logging.LogFactory; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; 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 FOURTEEN = 14; private static final int SIXTEEN_K = 1 << FOURTEEN; /** * 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. * @param is the input stream. * @return MD5 hash of the data. */ 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); } } } /** * @param is the input stream. * @return 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. * @param input the input in bytes. * @return the MD5 hash of the data. */ 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); } } /** * @param input the input in bytes. * @return 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. * @param file the file. * @return the MD5 hash of the data. */ public static byte[] computeMD5Hash(File file) throws IOException { return computeMD5Hash(new FileInputStream(file)); } /** * @param file the file. * @return the MD5 in base64 for the given file. */ public static String md5AsBase64(File file) throws IOException { return Base64.encodeAsString(computeMD5Hash(file)); } }