001 package users;
002 import java.io.UnsupportedEncodingException;
003 import java.security.MessageDigest;
004 import java.security.NoSuchAlgorithmException;
005
006 /**
007 * An class for generating a securly encoded passwort string using the MD5 algorithm
008 * @author Alexander Herrmann
009 */
010 public final class MD5 {
011
012 /**
013 * The MD5 generator.
014 */
015 private static MessageDigest md5;
016
017 /**
018 * An Array with all hexadecimal characters.
019 * Needed for converting byte[] to hexadecimal
020 */
021 private static final char chHexchar[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
022
023 /**
024 * Retrieves a hexadecimal character sequence representing the MD5
025 * digest of the specified character sequence by using ISO-8859-1 encoding
026 *
027 * @param sPhrase the string to encode.
028 * @return a hexadecimal character sequence representing the MD5 digest of the specified string
029 * @throws RuntimeException if an MD5 digest algorithm is not available through the java.security.MessageDigest spi
030 */
031 public static final String encodeString(String sPhrase) throws RuntimeException {
032 return byteToHex(digestString(sPhrase));
033 }
034
035 /**
036 * Converts a byte-Array to hexadecimal string
037 *
038 * @param b the byte[] to be converted
039 * @return hexadecimal string
040 */
041 public static String byteToHex(byte b[]) {
042 int len = b.length;
043 char[] s = new char[len * 2];
044 for(int i = 0, j = 0; i < len; i++) {
045 int c = ((int) b[i]) & 0xff;
046 s[j++] = chHexchar[c >> 4 & 0xf];
047 s[j++] = chHexchar[c & 0xf];
048 }
049 return new String(s);
050 }
051
052 /**
053 * Retrieves a byte sequence that represents the MD5 digest string.
054 * Used encoding is ISO-8859-1
055 *
056 * @param sPhrase the string to digest.
057 * @return the digest as an array of 16 bytes.
058 * @throws RuntimeException if an MD5 digest algorithm is not available through the java.security.MessageDigest spi
059 */
060 public static byte[] digestString(String sPhrase) throws RuntimeException {
061 byte[] bData;
062 String sEncoding = "ISO-8859-1";
063 try {
064 bData = sPhrase.getBytes(sEncoding);
065 }
066 catch (UnsupportedEncodingException ue) {
067 throw new RuntimeException(ue.toString());
068 }
069 return digestBytes(bData);
070 }
071
072 /**
073 * Retrieves a byte sequence representing the MD5 digest of the
074 * specified byte sequence.
075 *
076 * @param bData the data to digest.
077 * @return the MD5 digest as an array of 16 bytes.
078 * @throws RuntimeException if an MD5 digest algorithm is not available through the java.security.MessageDigest spi
079 */
080 public static final byte[] digestBytes(byte[] bData) throws RuntimeException {
081 synchronized (MD5.class) {
082 if (md5 == null) {
083 try {
084 md5 = MessageDigest.getInstance("MD5");
085 } catch (NoSuchAlgorithmException e) {
086 throw new RuntimeException(e.toString());
087 }
088 }
089 return md5.digest(bData);
090 }
091 }
092 }