Java 加解密技术系列之 HMAC

  1. import com.google.common.base.Strings;  
  2. import sun.misc.BASE64Decoder;  
  3. import sun.misc.BASE64Encoder;  
  4.   
  5. import javax.crypto.KeyGenerator;  
  6. import javax.crypto.Mac;  
  7. import javax.crypto.SecretKey;  
  8. import javax.crypto.spec.SecretKeySpec;  
  9. import java.security.NoSuchAlgorithmException;  
  10.   
  11. /** 
  12.  * Created by xiang.li on 2015/2/27. 
  13.  */  
  14. public class HMAC {  
  15.     /** 
  16.      * 定义加密方式 
  17.      * MAC算法可选以下多种算法 
  18.      * <pre> 
  19.      * HmacMD5 
  20.      * HmacSHA1 
  21.      * HmacSHA256 
  22.      * HmacSHA384 
  23.      * HmacSHA512 
  24.      * </pre> 
  25.      */  
  26.     private final static String KEY_MAC = "HmacMD5";  
  27.   
  28.     /** 
  29.      * 全局数组 
  30.      */  
  31.     private final static String[] hexDigits = { "0""1""2""3""4""5",  
  32.             "6""7""8""9""a""b""c""d""e""f" };  
  33.   
  34.     /** 
  35.      * 构造函数 
  36.      */  
  37.     public HMAC() {  
  38.   
  39.     }  
  40.   
  41.     /** 
  42.      * BASE64 加密 
  43.      * @param key 需要加密的字节数组 
  44.      * @return 字符串 
  45.      * @throws Exception 
  46.      */  
  47.     public static String encryptBase64(byte[] key) throws Exception {  
  48.         return (new BASE64Encoder()).encodeBuffer(key);  
  49.     }  
  50.   
  51.     /** 
  52.      * BASE64 解密 
  53.      * @param key 需要解密的字符串 
  54.      * @return 字节数组 
  55.      * @throws Exception 
  56.      */  
  57.     public static byte[] decryptBase64(String key) throws Exception {  
  58.         return (new BASE64Decoder()).decodeBuffer(key);  
  59.     }  
  60.   
  61.     /** 
  62.      * 初始化HMAC密钥 
  63.      * @return 
  64.      */  
  65.     public static String init() {  
  66.         SecretKey key;  
  67.         String str = "";  
  68.         try {  
  69.             KeyGenerator generator = KeyGenerator.getInstance(KEY_MAC);  
  70.             key = generator.generateKey();  
  71.             str = encryptBase64(key.getEncoded());  
  72.         } catch (NoSuchAlgorithmException e) {  
  73.             e.printStackTrace();  
  74.         } catch (Exception e) {  
  75.             e.printStackTrace();  
  76.         }  
  77.         return str;  
  78.     }  
  79.   
  80.     /** 
  81.      * HMAC加密 
  82.      * @param data 需要加密的字节数组 
  83.      * @param key 密钥 
  84.      * @return 字节数组 
  85.      */  
  86.     public static byte[] encryptHMAC(byte[] data, String key) {  
  87.         SecretKey secretKey;  
  88.         byte[] bytes = null;  
  89.         try {  
  90.             secretKey = new SecretKeySpec(decryptBase64(key), KEY_MAC);  
  91.             Mac mac = Mac.getInstance(secretKey.getAlgorithm());  
  92.             mac.init(secretKey);  
  93.             bytes = mac.doFinal(data);  
  94.         } catch (Exception e) {  
  95.             e.printStackTrace();  
  96.         }  
  97.         return bytes;  
  98.     }  
  99.   
  100.     /** 
  101.      * HMAC加密 
  102.      * @param data 需要加密的字符串 
  103.      * @param key 密钥 
  104.      * @return 字符串 
  105.      */  
  106.     public static String encryptHMAC(String data, String key) {  
  107.         if (Strings.isNullOrEmpty(data)) {  
  108.             return null;  
  109.         }  
  110.         byte[] bytes = encryptHMAC(data.getBytes(), key);  
  111.         return byteArrayToHexString(bytes);  
  112.     }  
  113.   
  114.   
  115.     /** 
  116.      * 将一个字节转化成十六进制形式的字符串 
  117.      * @param b 字节数组 
  118.      * @return 字符串 
  119.      */  
  120.     private static String byteToHexString(byte b) {  
  121.         int ret = b;  
  122.         //System.out.println("ret = " + ret);  
  123.         if (ret < 0) {  
  124.             ret += 256;  
  125.         }  
  126.         int m = ret / 16;  
  127.         int n = ret % 16;  
  128.         return hexDigits[m] + hexDigits[n];  
  129.     }  
  130.   
  131.     /** 
  132.      * 转换字节数组为十六进制字符串 
  133.      * @param bytes 字节数组 
  134.      * @return 十六进制字符串 
  135.      */  
  136.     private static String byteArrayToHexString(byte[] bytes) {  
  137.         StringBuffer sb = new StringBuffer();  
  138.         for (int i = 0; i < bytes.length; i++) {  
  139.             sb.append(byteToHexString(bytes[i]));  
  140.         }  
  141.         return sb.toString();  
  142.     }  
  143.   
  144.     /** 
  145.      * 测试方法 
  146.      * @param args 
  147.      */  
  148.     public static void main(String[] args) throws Exception {  
  149.         String key = HMAC.init();  
  150.         System.out.println("Mac密钥:\n" + key);  
  151.         String word = "123";  
  152.         System.out.println(encryptHMAC(word, key));  
  153.     }  

你可能感兴趣的:(Java 加解密技术系列之 HMAC)