1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 package org.apache.commons.id;
19
20 import java.security.MessageDigest;
21 import java.security.NoSuchAlgorithmException;
22
23
24 /**
25 * Operations to simplifiy common {@link java.security.MessageDigest} tasks. This
26 * class is thread safe.
27 *
28 * @author Apache Software Foundation
29 */
30 public class DigestUtils {
31
32 /**
33 * Returns a MessageDigest for the given <code>algorithm</code>.
34 *
35 * @param algorithm The MessageDigest algorithm name.
36 * @return An MD5 digest instance.
37 * @throws RuntimeException when a {@link java.security.NoSuchAlgorithmException} is caught,
38 */
39 static MessageDigest getDigest(String algorithm) {
40 try {
41 return MessageDigest.getInstance(algorithm);
42 } catch (NoSuchAlgorithmException e) {
43 throw new RuntimeException(e.getMessage());
44 }
45 }
46
47 /**
48 * Returns an MD5 MessageDigest.
49 *
50 * @return An MD5 digest instance.
51 * @throws RuntimeException when a {@link java.security.NoSuchAlgorithmException} is caught,
52 */
53 private static MessageDigest getMd5Digest() {
54 return getDigest("MD5");
55 }
56
57 /**
58 * Returns an SHA digest.
59 *
60 * @return An SHA digest instance.
61 * @throws RuntimeException when a {@link java.security.NoSuchAlgorithmException} is caught,
62 */
63 private static MessageDigest getShaDigest() {
64 return getDigest("SHA");
65 }
66
67 /**
68 * Calculates the MD5 digest and returns the value as a 16 element
69 * <code>byte[]</code>.
70 *
71 * @param data Data to digest
72 * @return MD5 digest
73 */
74 public static byte[] md5(byte[] data) {
75 return getMd5Digest().digest(data);
76 }
77
78 /**
79 * Calculates the MD5 digest and returns the value as a 16 element
80 * <code>byte[]</code>.
81 *
82 * @param data Data to digest
83 * @return MD5 digest
84 */
85 public static byte[] md5(String data) {
86 return md5(data.getBytes());
87 }
88
89 /**
90 * Calculates the MD5 digest and returns the value as a 32 character
91 * hex string.
92 *
93 * @param data Data to digest
94 * @return MD5 digest as a hex string
95 */
96 public static String md5Hex(byte[] data) {
97 return new String(Hex.encodeHex(md5(data)));
98 }
99
100 /**
101 * Calculates the MD5 digest and returns the value as a 32 character
102 * hex string.
103 *
104 * @param data Data to digest
105 * @return MD5 digest as a hex string
106 */
107 public static String md5Hex(String data) {
108 return new String(Hex.encodeHex(md5(data)));
109 }
110
111 /**
112 * Calculates the SHA digest and returns the value as a
113 * <code>byte[]</code>.
114 *
115 * @param data Data to digest
116 * @return SHA digest
117 */
118 public static byte[] sha(byte[] data) {
119 return getShaDigest().digest(data);
120 }
121
122 /**
123 * Calculates the SHA digest and returns the value as a
124 * <code>byte[]</code>.
125 *
126 * @param data Data to digest
127 * @return SHA digest
128 */
129 public static byte[] sha(String data) {
130 return sha(data.getBytes());
131 }
132
133 /**
134 * Calculates the SHA digest and returns the value as a hex string.
135 *
136 * @param data Data to digest
137 * @return SHA digest as a hex string
138 */
139 public static String shaHex(byte[] data) {
140 return new String(Hex.encodeHex(sha(data)));
141 }
142
143 /**
144 * Calculates the SHA digest and returns the value as a hex string.
145 *
146 * @param data Data to digest
147 * @return SHA digest as a hex string
148 */
149 public static String shaHex(String data) {
150 return new String(Hex.encodeHex(sha(data)));
151 }
152
153 }