Message digest is a digital summary for
information. Message digest functions (like SHA, MD5) are used to calculate
message digest for given information.
As shown in above figure, data/document
is given as input to Message Digest function, Message Digest function performs
mathematical operations on the document and generate message digest for given
document. Usually Message digests are 128 bits to 160 bits in length. If two
documents are identical, then they has same message digest. If two documents
are not identical, then they have different message digests.
Message digest is used to provide data
integrity. Suppose ‘A’ want to send a document to ‘B’.
Step
1: A computes Message digest for the document.
Step
2: A sends document along with message digest.
Step
3: Once ‘B’ receives the document, ‘B’ re computes
message digest, and compares new message digest with original message digest. If
the two message digests do not match, then 'B' knows the message was altered or
corrupted.
Java
Support to calculate Message Digest
java.security.MessageDigest class
provides support for message digest.
How
to calculate Message Digest
It is 3-step process.
Step
1: Get the instance of MessageDigest class. MessageDigest
class provides static factory methods, to get instance of MessageDigest.
public
static MessageDigest getInstance(String algorithm) throws
NoSuchAlgorithmException
public
static MessageDigest getInstance(String algorithm,String provider) throws
NoSuchAlgorithmException, NoSuchProviderException
public
static MessageDigest getInstance(String algorithm, Provider provider) throws
NoSuchAlgorithmException
Parameters “algorithm” specifies the name
of the algorithm to be used, “provider” represents the provider for the
security, a provider implements java security api.
Java API supports following algorithms
a.
MD5
b.
SHA-1
c.
SHA-256
Step
2: Feed the
digest with data. MessageDigest API provides following methods to feed digest.
public void update(byte input)
public void update(byte[] input, int
offset, int len)
public void update(byte[] input)
public final void update(ByteBuffer
input)
Step
3: Compute the digest. MessageDigest class provides
following methods, to calculate message digest.
public byte[] digest()
public int digest(byte[] buf, int offset, int len)
throws DigestException
public byte[] digest(byte[] input)
The digest is reset after this call is
made.
Application
to compute message digest for a file
Following application computes message
digest for a file.
import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.io.*; public class MessageDigestUtil { /** * Computes message digest for given file * * @param fileName * file to calculate digest * @param algorithm * Algorithm to use * @return message digest for given file */ public static byte[] getMessageDigest(String fileName, String algorithm) { try { MessageDigest messageDigest = MessageDigest.getInstance(algorithm); /* Read file and feed the data to messageDigest */ File fileToDigest = new File(fileName); byte input[] = readFileAsBytes(fileToDigest); messageDigest.update(input); return messageDigest.digest(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return new byte[0]; } /** * Convert file data to byte array * * @param file * @return byte array */ public static byte[] readFileAsBytes(File file) { ByteArrayOutputStream byteArrayStream = null; InputStream inoutStream = null; try { byte[] buffer = new byte[4096]; byteArrayStream = new ByteArrayOutputStream(); inoutStream = new FileInputStream(file); int read = 0; while ((read = inoutStream.read(buffer)) != -1) { byteArrayStream.write(buffer, 0, read); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (byteArrayStream != null) byteArrayStream.close(); if (inoutStream != null) inoutStream.close(); } catch (IOException e) { e.printStackTrace(); } } return byteArrayStream.toByteArray(); } }
public class MessageDigestUtilTest { public static void main(String args[]) { byte digest[] = MessageDigestUtil.getMessageDigest("glob.txt", "MD5"); for (byte b : digest) { System.out.print(b + " "); } } }
Output
102 -13 -33 -20 102 71 -128 89 96 -65 116 115 -46 -107 -96 42
No comments:
Post a Comment