常见的集中加密方法BASE64、MD5、SHA、HMAC

  1 package com.ice.webos.util.security;
  2 
  3 import java.io.UnsupportedEncodingException;
  4 import java.math.BigInteger;
  5 import java.security.Key;
  6 import java.security.MessageDigest;
  7 import java.security.SecureRandom;
  8 
  9 import javax.crypto.Cipher;
 10 import javax.crypto.KeyGenerator;
 11 import javax.crypto.Mac;
 12 import javax.crypto.SecretKey;
 13 import javax.crypto.SecretKeyFactory;
 14 import javax.crypto.spec.DESKeySpec;
 15 import javax.crypto.spec.SecretKeySpec;
 16 
 17 import sun.misc.BASE64Decoder;
 18 import sun.misc.BASE64Encoder;
 19 
 20 /**
 21  * <ul>
 22  * <li>BASE64的加密解密是双向的,可以求反解。</li>
 23  * <li>MD5、SHA以及HMAC是单向加密,任何数据加密后只会产生唯一的一个加密串,通常用来校验数据在传输过程中是否被修改。</li>
 24  * <li>HMAC算法有一个密钥,增强了数据传输过程中的安全性,强化了算法外的不可控因素。</li>
 25  * <li>DES DES-Data Encryption Standard,即数据加密算法。
 26  * DES算法的入口参数有三个:Key、Data、Mode。
 27  * <ul>
 28  * <li>Key:8个字节共64位,是DES算法的工作密钥;</li>
 29  * <li>Data:8个字节64位,是要被加密或被解密的数据;</li>
 30  * <li>Mode:DES的工作方式,有两种:加密或解密。</li>
 31  * </ul>
 32  * </li>
 33  * <ul>
 34  * 
 35  * @author Ice_Liu
 36  * 
 37  */
 38 public class CryptUtil {
 39     private static final String KEY_MD5 = "MD5";
 40     private static final String KEY_SHA = "SHA";
 41     /**
 42      * MAC算法可选以下多种算法
 43      * 
 44      * <pre>
 45      *  
 46      * HmacMD5  
 47      * HmacSHA1  
 48      * HmacSHA256  
 49      * HmacSHA384  
 50      * HmacSHA512 
 51      * </pre>
 52 */
 53     public static final String KEY_MAC = "HmacMD5";
 54 
 55     /**
 56      * BASE64解密
 57      * 
 58      * @param key
 59      * @return
 60      * @throws Exception
 61 */
 62     public static byte[] decryptBASE64(String key) throws Exception {
 63         return (new BASE64Decoder()).decodeBuffer(key);
 64     }
 65 
 66     /**
 67      * BASE64 加密
 68      * 
 69      * @param key
 70      * @return
 71      * @throws Exception
 72 */
 73     public static String encryptBASE64(byte[] key) throws Exception {
 74         return (new BASE64Encoder()).encodeBuffer(key);
 75     }
 76 
 77     /**
 78      * MD5加密
 79      * 
 80      * @param data
 81      * @return
 82      * @throws Exception
 83 */
 84     public static byte[] encryptMD5(byte[] data) throws Exception {
 85 
 86         MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
 87         md5.update(data);
 88 
 89         return md5.digest();
 90 
 91     }
 92 
 93     /**
 94      * SHA加密
 95      * 
 96      * @param data
 97      * @return
 98      * @throws Exception
 99 */
100     public static byte[] encryptSHA(byte[] data) throws Exception {
101 
102         MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
103         sha.update(data);
104 
105         return sha.digest();
106 
107     }
108 
109     /**
110      * 初始化HMAC密钥
111      * 
112      * @return
113      * @throws Exception
114 */
115     public static String initMacKey() throws Exception {
116         KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);
117         SecretKey secretKey = keyGenerator.generateKey();
118         return encryptBASE64(secretKey.getEncoded());
119     }
120 
121     /**
122      * HMAC 加密
123      * 
124      * @param data
125      * @param key
126      * @return
127      * @throws Exception
128 */
129     public static byte[] encryptHMAC(byte[] data, String key) throws Exception {
130         SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);
131         Mac mac = Mac.getInstance(secretKey.getAlgorithm());
132         mac.init(secretKey);
133         return mac.doFinal(data);
134     }
135 
136     /**
137      * DES 算法 <br>
138      * 可替换为以下任意一种算法,同时key值的size相应改变。
139      * 
140      * <pre>
141      * DES                  key size must be equal to 56 
142      * DESede(TripleDES)    key size must be equal to 112 or 168 
143      * AES                  key size must be equal to 128, 192 or 256,but 192 and 256 bits may not be available 
144      * Blowfish             key size must be multiple of 8, and can only range from 32 to 448 (inclusive) 
145      * RC2                  key size must be between 40 and 1024 bits 
146      * RC4(ARCFOUR)         key size must be between 40 and 1024 bits 
147      * </pre>
148 */
149     public static final String ALGORITHM = "DES";
150 
151     /**
152      * DES 算法转换密钥<br>
153      * 
154      * @param key
155      * @return
156      * @throws Exception
157 */
158     private static Key toKey(byte[] key) throws Exception {
159         SecretKey secretKey = null;
160         if (ALGORITHM.equals("DES") || ALGORITHM.equals("DESede")) {
161             DESKeySpec dks = new DESKeySpec(key);
162             SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
163             secretKey = keyFactory.generateSecret(dks);
164         } else {
165             // 当使用其他对称加密算法时,如AES、Blowfish等算法时,用下述代码替换上述三行代码
166             secretKey = new SecretKeySpec(key, ALGORITHM);
167         }
168         return secretKey;
169     }
170 
171     /**
172      * DES 算法解密
173      * 
174      * @param data
175      * @param key
176      * @return
177      * @throws Exception
178 */
179     public static byte[] decrypt(byte[] data, String key) throws Exception {
180         Key k = toKey(decryptBASE64(key));
181         Cipher cipher = Cipher.getInstance(ALGORITHM);
182         cipher.init(Cipher.DECRYPT_MODE, k);
183         return cipher.doFinal(data);
184     }
185 
186     /**
187      * DES 算法加密
188      * 
189      * @param data
190      * @param key
191      * @return
192      * @throws Exception
193 */
194     public static byte[] encrypt(byte[] data, String key) throws Exception {
195         Key k = toKey(decryptBASE64(key));
196         Cipher cipher = Cipher.getInstance(ALGORITHM);
197         cipher.init(Cipher.ENCRYPT_MODE, k);
198         return cipher.doFinal(data);
199     }
200 
201     /**
202      * DES 算法生成密钥
203      * 
204      * @return
205      * @throws Exception
206 */
207     public static String initKey() throws Exception {
208         return initKey(null);
209     }
210 
211     /**
212      * DES 算法生成密钥
213      * 
214      * @param seed
215      * @return
216      * @throws Exception
217 */
218     public static String initKey(String seed) throws Exception {
219         SecureRandom secureRandom = null;
220         if (seed != null) {
221             secureRandom = new SecureRandom(decryptBASE64(seed));
222         } else {
223             secureRandom = new SecureRandom();
224         }
225         KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM);
226         kg.init(secureRandom);
227         SecretKey secretKey = kg.generateKey();
228         return encryptBASE64(secretKey.getEncoded());
229     }
230 
231     public static void main(String[] args) {
232         try {
233             String s = "阿伯才的覆盖";
234             String b = CryptUtil.encryptBASE64(s.getBytes("UTF-8"));
235             System.out.println("BASE64加密后:" + b);
236             byte[] c = CryptUtil.decryptBASE64(b);
237             System.out.println("BASE64解密后:" + new String(c, "UTF-8"));
238 
239             c = encryptMD5(s.getBytes());
240             System.out.println("MD5   加密后:" + new BigInteger(c).toString(16));
241 
242             c = encryptSHA(s.getBytes());
243             System.out.println("SHA   加密后:" + new BigInteger(c).toString(16));
244 
245             String key = initMacKey();
246             System.out.println("HMAC密匙:" + key);
247             c = encryptHMAC(s.getBytes(), key);
248             System.out.println("HMAC  加密后:" + new BigInteger(c).toString(16));
249 
250             key = initKey();
251             System.out.println(ALGORITHM + "密钥:\t" + key);
252             c = encrypt(s.getBytes("UTF-8"), key);
253             System.out.println(ALGORITHM + "   加密后:" + new BigInteger(c).toString(16));
254             c = decrypt(c, key);
255             System.out.println(ALGORITHM + "   解密后:" + new String(c, "UTF-8"));
256         } catch (UnsupportedEncodingException e) {
257         } catch (Exception e) {
258         }
259     }
260 }

 

posted @ 2017-12-07 23:33  向前爬的蜗牛  阅读(155)  评论(0编辑  收藏  举报