package com.terra.proxy.util; import javax.crypto.KeyGenerator; import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import java.security.MessageDigest; import java.util.Base64; /** * 基础加密组件 * * @author TanBin */ public abstract class CoderUtils { public static final String KEY_SHA = "SHA"; public static final String KEY_MD5 = "MD5"; /** * MAC算法可选以下多种算法 *
     * HmacMD5
     * HmacSHA1
     * HmacSHA256
     * HmacSHA384
     * HmacSHA512
     * 
*/ public static final String KEY_MAC = "HmacMD5"; /** * BASE64加密 * * @return * @throws Exception */ public static String encryptBASE64(byte[] data) { return Base64.getEncoder().encodeToString(data); } /** * BASE64解密 * * @param key * @return * @throws Exception */ public static byte[] decryptBASE64(String key) { return Base64.getDecoder().decode(key); } /** * MD5加密 * * @param data * @return * @throws Exception */ public static byte[] encryptMD5(byte[] data) throws Exception { MessageDigest md5 = MessageDigest.getInstance(KEY_MD5); md5.update(data); return md5.digest(); } /** * 蓝图的MD5加密算法 * * @param text * @return * @throws Exception */ public static String lantuEncryptMD5(String text) throws Exception { byte[] b = encryptMD5(text.getBytes("UTF-8")); String key = convertToHexString(b); //转为大写 key = key.toUpperCase(); //倒序 char[] array = key.toCharArray(); String reverseKey = ""; for (int i = array.length - 1; i >= 0; i--) { reverseKey += array[i]; } return reverseKey; } /** * 字节数组转为32位字符串 * * @param data * @return */ private static String convertToHexString(byte data[]) { StringBuffer strBuffer = new StringBuffer(); for (int i = 0; i < data.length; i++) { String haxHex = Integer.toHexString(data[i] & 0xFF); if (haxHex.length() < 2) { strBuffer.append("0"); } strBuffer.append(haxHex); } return strBuffer.toString(); } /** * SHA加密 * * @param data * @return * @throws Exception */ public static byte[] encryptSHA(byte[] data) throws Exception { MessageDigest sha = MessageDigest.getInstance(KEY_SHA); sha.update(data); return sha.digest(); } /** * 初始化HMAC密钥 * * @return * @throws Exception */ public static String initMacKey() throws Exception { KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC); SecretKey secretKey = keyGenerator.generateKey(); return encryptBASE64(secretKey.getEncoded()); } /** * HMAC加密 * * @param data * @param key * @return * @throws Exception */ public static byte[] encryptHMAC(byte[] data, String key) throws Exception { SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC); Mac mac = Mac.getInstance(secretKey.getAlgorithm()); mac.init(secretKey); return mac.doFinal(data); } public static void main(String[] args) { String inputStr = "123456"; System.err.println("原文:" + inputStr); try { String codeBASE64 = encryptBASE64(inputStr.getBytes("UTF-8")); String codeMD5 = lantuEncryptMD5(inputStr); byte[] codeSHA = encryptSHA(inputStr.getBytes("UTF-8")); String key = initMacKey(); System.err.println("Mac密钥:" + key); byte[] codeHMAC = encryptHMAC(inputStr.getBytes("UTF-8"), key); System.err.println("\nBASE64:" + codeBASE64); System.err.println("BASE64解密:" + new String(decryptBASE64(codeBASE64), "UTF-8")); System.err.println("MD5:" + codeMD5); System.err.println("SHA:" + codeSHA); System.err.println("HMAC:" + codeHMAC); } catch (Exception e) { e.printStackTrace(); } } }