信息摘要工具类MD5、CRC32、SHA1

  信息摘要,通俗来说,就是信息的指纹。就像人类的指纹是不会重复的一样,使用信息摘要算法计算任何两个不同信息,得出的摘要(指纹)也是不一样的。

  这通常用在校验文件是否被修改过,在Web项目中MD5也用在密码加密上。

  下面的信息摘要工具类MsgDigest,可以计算文件的MD5、CRC32、SHA1摘要,字符串的MD5、SHA1摘要。

      MsgDigest类:

  1 package com.dong.framework.tool;
  2 
  3 import java.io.BufferedInputStream;
  4 import java.io.File;
  5 import java.io.FileInputStream;
  6 import java.io.FileNotFoundException;
  7 import java.io.IOException;
  8 import java.io.InputStream;
  9 import java.security.MessageDigest;
 10 import java.security.NoSuchAlgorithmException;
 11 import java.util.zip.CRC32;
 12 
 13 
 14 /**
 15  * 信息摘要,可以获得CRC32、MD5、SHA-1值
 16  * @version 1.0
 17  * @author dongliyang
 18  */
 19 public class MsgDigest {
 20     
 21     /**
 22      * 计算文件的32位循环冗余校验和CRC32
 23      * @param filepath 文件名
 24      * @return String
 25      * @throws IOException IOException异常
 26      */
 27     public static String crc32Digest(String filepath) {
 28         
 29         try {
 30             
 31             InputStream in = new BufferedInputStream(new FileInputStream(filepath));
 32             CRC32 crc = new CRC32();
 33             
 34             int c;
 35             while((c = in.read()) != -1){
 36                 crc.update(c);
 37             }
 38             in.close();
 39             return Long.toHexString(crc.getValue());
 40         } catch (FileNotFoundException e) {
 41             System.out.println("文件未找到异常!");
 42             throw new RuntimeException(e.getMessage());
 43         } catch (IOException e) {
 44             System.out.println("IO异常!");
 45             throw new RuntimeException(e.getMessage());
 46         }
 47         
 48     }
 49     
 50     /**
 51      * 计算文件的32位循环冗余校验和CRC32
 52      * @param file 文件
 53      * @return String
 54      * @throws IOException IOException异常
 55      */
 56     public static String crc32Digest(File file){
 57         
 58         try {
 59             
 60             InputStream in = new BufferedInputStream(new FileInputStream(file));
 61             CRC32 crc = new CRC32();
 62             
 63             int c;
 64             while((c = in.read()) != -1){
 65                 crc.update(c);
 66             }
 67             in.close();
 68             return Long.toHexString(crc.getValue());
 69         } catch (FileNotFoundException e) {
 70             System.out.println("文件未找到异常!");
 71             throw new RuntimeException(e.getMessage());
 72         } catch (IOException e) {
 73             System.out.println("IO异常!");
 74             throw new RuntimeException(e.getMessage());
 75         }
 76         
 77 
 78     }
 79     
 80     /**
 81      * 计算字符串的MD5值
 82      * @param input 字符串
 83      * @return String
 84      */
 85     public static String md5Digest(String input){
 86         
 87         byte[] data = input.getBytes();
 88         try {
 89             MessageDigest messageDigest = getMD5();
 90             messageDigest.update(data);
 91             return toHexString(messageDigest.digest());
 92         } catch (NoSuchAlgorithmException e) {
 93             System.out.println("MD5算法初始化失败!");
 94             throw new RuntimeException(e.getMessage());
 95         }
 96         
 97     }
 98     
 99     /**
100      * 计算文件的MD5值
101      * @param filename 文件名
102      * @return String
103      */
104     public static String md5FileDigest(String filepath){
105         String md5 = "";
106         File file = new File(filepath);
107         if(file.exists()){
108             try {
109                 MessageDigest messageDigest = getMD5();
110                 InputStream in = new BufferedInputStream(new FileInputStream(file));
111                 byte[] cache = new byte[CACHE_SIZE];
112                 int len;
113                 while((len = in.read(cache)) != -1){
114                     messageDigest.update(cache, 0, len);
115                 }
116                 in.close();
117                 byte[] data = messageDigest.digest();
118                 md5 = toHexString(data);
119             } catch (NoSuchAlgorithmException e) {
120                 System.out.println("MD5算法初始化失败!");
121                 throw new RuntimeException(e.getMessage());
122             } catch (FileNotFoundException e) {
123                 System.out.println("文件未找到异常!");
124                 throw new RuntimeException(e.getMessage());
125             } catch (IOException e) {
126                 System.out.println("IO异常!");
127                 throw new RuntimeException(e.getMessage());
128             }
129         }
130         return md5;
131     }
132     
133     /**
134      * 计算文件的MD5值
135      * @param file 文件
136      * @return String
137      */
138     public static String md5FileDigest(File file){
139         
140         String md5 = "";
141         if(file.exists()){
142             try {
143                 MessageDigest messageDigest = getMD5();
144                 InputStream in = new BufferedInputStream(new FileInputStream(file));
145                 byte[] cache = new byte[CACHE_SIZE];
146                 int len;
147                 while((len = in.read(cache)) != -1){
148                     messageDigest.update(cache, 0, len);
149                 }
150                 in.close();
151                 byte[] data = messageDigest.digest();
152                 md5 = toHexString(data);
153             } catch (NoSuchAlgorithmException e) {
154                 System.out.println("MD5算法初始化失败!");
155                 throw new RuntimeException(e.getMessage());
156             } catch (FileNotFoundException e) {
157                 System.out.println("文件未找到异常!");
158                 throw new RuntimeException(e.getMessage());
159             } catch (IOException e) {
160                 System.out.println("IO异常!");
161                 throw new RuntimeException(e.getMessage());
162             }
163         }
164         return md5;
165     }
166     
167     /**
168      * 计算字符串的SHA-1值
169      * @param input 字符串
170      * @return String
171      */
172     public static String sha1Digest(String input){
173         
174         byte[] data = input.getBytes();
175         try {
176             MessageDigest messageDigest = getSHA1();
177             messageDigest.update(data);
178             return toHexString(messageDigest.digest());
179         } catch (NoSuchAlgorithmException e) {
180             System.out.println("MD5算法初始化失败!");
181             throw new RuntimeException(e.getMessage());
182         }
183     }
184     
185     /**
186      * 计算文件的SHA-1值
187      * @param filepath 文件名
188      * @return String
189      */
190     public static String sha1FileDigest(String filepath){
191         
192         String sha1 = "";
193         File file = new File(filepath);
194         if(file.exists()){
195             try {
196                 MessageDigest messageDigest = getSHA1();
197                 InputStream in = new BufferedInputStream(new FileInputStream(file));
198                 byte[] cache = new byte[CACHE_SIZE];
199                 int len;
200                 while((len = in.read(cache)) != -1){
201                     messageDigest.update(cache, 0, len);
202                 }
203                 in.close();
204                 byte[] data = messageDigest.digest();
205                 sha1 = toHexString(data);
206             } catch (NoSuchAlgorithmException e) {
207                 System.out.println("MD5算法初始化失败!");
208                 throw new RuntimeException(e.getMessage());
209             } catch (FileNotFoundException e) {
210                 System.out.println("文件未找到异常!");
211                 throw new RuntimeException(e.getMessage());
212             } catch (IOException e) {
213                 System.out.println("IO异常!");
214                 throw new RuntimeException(e.getMessage());
215             }
216         }
217         return sha1;
218     }
219     
220     /**
221      * 计算文件的SHA-1值
222      * @param file 文件
223      * @return String
224      */
225     public static String sha1FileDigest(File file){
226         
227         String sha1 = "";
228         if(file.exists()){
229             try {
230                 MessageDigest messageDigest = getSHA1();
231                 InputStream in = new BufferedInputStream(new FileInputStream(file));
232                 byte[] cache = new byte[CACHE_SIZE];
233                 int len;
234                 while((len = in.read(cache)) != -1){
235                     messageDigest.update(cache, 0, len);
236                 }
237                 in.close();
238                 byte[] data = messageDigest.digest();
239                 sha1 = toHexString(data);
240             } catch (NoSuchAlgorithmException e) {
241                 System.out.println("MD5算法初始化失败!");
242                 throw new RuntimeException(e.getMessage());
243             } catch (FileNotFoundException e) {
244                 System.out.println("文件未找到异常!");
245                 throw new RuntimeException(e.getMessage());
246             } catch (IOException e) {
247                 System.out.println("IO异常!");
248                 throw new RuntimeException(e.getMessage());
249             }
250         }
251         return sha1;
252         
253     }
254     /**
255      * 字节数组转换为16进制字符串
256      * @param data 字节数组
257      * @return String
258      */    
259     private static String toHexString(byte[] data){
260         StringBuilder digestStr = new StringBuilder();
261         String stmp = "";
262         for(int i = 0;i < data.length; i++){
263             stmp = Integer.toHexString(data[i] & 0XFF);
264             if(stmp.length() == 1){
265                 digestStr.append("0" + stmp);
266             }else {
267                 digestStr.append(stmp);
268             }
269         }
270         return digestStr.toString();
271     }
272     
273     /**
274      * 获取MD5实例
275      * @return MessageDigest
276      * @throws NoSuchAlgorithmException 异常
277      */
278     private static MessageDigest getMD5() throws NoSuchAlgorithmException{
279         return MessageDigest.getInstance(ALGORIGTHM_MD5);
280     }
281     
282     private static MessageDigest getSHA1() throws NoSuchAlgorithmException {
283         return MessageDigest.getInstance(ALGORIGTHM_SHA1);
284     }
285     
286     /** MD5算法名称 */
287     private static final String ALGORIGTHM_MD5 = "MD5";
288     /** SHA-1算法名称 */
289     private static final String ALGORIGTHM_SHA1 ="SHA-1";
290     /** 字节数组缓存大小 */
291     private static final int CACHE_SIZE = 2048;
292 }
原文地址:https://www.cnblogs.com/dongliyang/p/2837368.html