diff --git a/common/src/main/java/com/micro/fast/common/util/AESUtil.java b/common/src/main/java/com/micro/fast/common/util/AESUtil.java new file mode 100644 index 0000000..db27e69 --- /dev/null +++ b/common/src/main/java/com/micro/fast/common/util/AESUtil.java @@ -0,0 +1,148 @@ +package com.micro.fast.common.util; + +import sun.misc.BASE64Decoder; +import sun.misc.BASE64Encoder; + +import javax.crypto.*; +import javax.crypto.KeyGenerator; +import javax.crypto.spec.SecretKeySpec; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; + +/** + * AES加解密工具类 + * create by lishouyu 2017/08/21 + * email 18332763730@163.com + * + * last edit lishouyu 2017/08/21 + * email 18332763730@163.com + * + */ +public class AESUtil { + //编码规则 + private static final String encodeRules = "li"; + + /** + * 加密 + * 1.构造密钥生成器 + * 2.根据ecnodeRules规则初始化密钥生成器 + * 3.产生密钥 + * 4.创建和初始化密码器 + * 5.内容加密 + * 6.返回字符串 + * @param content + * @return + */ + public static String AESEncode(String content){ + try{ + //1.构造密钥生成器,指定为AES算法,不区分大小写 + KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); + //2.根据encodeRules规则初始化密钥生成器,生成一个128位的随机源, + //根据传入的字节数组 + SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); + secureRandom.setSeed(encodeRules.getBytes()); + keyGenerator.init(128,secureRandom); + //3.产生原始对称密钥 + SecretKey original_secretKey = keyGenerator.generateKey(); + //4.获取原始对称密钥的字节数组 + byte[] encoded = original_secretKey.getEncoded(); + //5.根据字节数组生成AES密钥 + SecretKey key = new SecretKeySpec(encoded, "AES"); + //6.根据指定算法AES自成密码器 + Cipher cipher = Cipher.getInstance("AES"); + //7.初始化密码器第一个参数为加密或者解密操作,第二个参数为使用的key + cipher.init(Cipher.ENCRYPT_MODE,key); + //8.获取加密内容的字节数组,要设置编码为utf8不然内容中如果有中文的英文的混合中文就会解密乱码 + byte[] byte_encode = content.getBytes("utf8"); + //9.根据密码器的初始化方式--加密:将数据加密 + byte[] bytes_AES = cipher.doFinal(byte_encode); + //10.将加密后的数据转换为字符串 + //这里的Base64Encoder中会找不到包 + //解决方法 + //在项目的Build path 中县一簇jre System Library ,再添加哭JRE System Library,重新变异后就一切正常了 + String AES_encode = new String(new BASE64Encoder().encode(bytes_AES)); + //11.将字符串返回 + return AES_encode; + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (NoSuchPaddingException e) { + e.printStackTrace(); + } catch (InvalidKeyException e) { + e.printStackTrace(); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } catch (BadPaddingException e) { + e.printStackTrace(); + } catch (IllegalBlockSizeException e) { + e.printStackTrace(); + } + //如果有错误就返回null + return null; + } + + /** + * 1.构造密钥生成器 + * 2.根据encodeRules初始化密钥生成器 + * 3.产生密钥 + * 4.创建和初始化密码器 + * 5.根据密钥对内容解密 + * 6.返回字符串 + * @param content + * @return + */ + public static String AESDecode(String content){ + try { + //1.构造密钥生成器,指定为AES算法,不区分大小写 + KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); + //2.根据encodeRules规则初始化密钥生成器 + //生成一个128位的随机数,根据传入的字节数组 + SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); + secureRandom.setSeed(encodeRules.getBytes()); + keyGenerator.init(128,secureRandom); + //3.产生原始对称密钥 + SecretKey original_secretKey = keyGenerator.generateKey(); + //4.获取原始对称密钥的字节数组 + byte[] encoded = original_secretKey.getEncoded(); + //5.根据字节数组生成AES密钥 + SecretKey aes = new SecretKeySpec(encoded, "AES"); + //6.根据指定算法AES自称密码器 + Cipher cipher = Cipher.getInstance("AES"); + //7.初始化密码器,第一个参数为加密或者是解密操作,第二个参数为使用的key + cipher.init(Cipher.DECRYPT_MODE,aes); + //8.将加密并编码后的内容解密成字节数组 + byte[] byte_content = new BASE64Decoder().decodeBuffer(content); + //9.解密 + byte[] bytes = cipher.doFinal(byte_content); + String AES_decode = new String(bytes,"utf-8"); + return AES_decode; + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (NoSuchPaddingException e) { + e.printStackTrace(); + } catch (InvalidKeyException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } catch (BadPaddingException e) { + e.printStackTrace(); + } catch (IllegalBlockSizeException e) { + e.printStackTrace(); + } + return null; + } + + public static void main(String[] args) { + String[] keys = new String[]{"studyj2e"}; + System.out.println("key | AESEncode | AESDecode"); + for (String key : keys) { + System.out.print(key+" | "); + String aesEncode = AESEncode(key); + System.out.print(aesEncode+" | "); + String aesDecode = AESDecode(aesEncode); + System.out.println(aesDecode); + } + } +} diff --git a/common/src/main/java/com/micro/fast/common/util/MD5Util.java b/common/src/main/java/com/micro/fast/common/util/MD5Util.java new file mode 100644 index 0000000..2332eb6 --- /dev/null +++ b/common/src/main/java/com/micro/fast/common/util/MD5Util.java @@ -0,0 +1,60 @@ +package com.micro.fast.common.util; + +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; + +/** + * MD5加密类 + * create by lishouyu 2017/08/21 + * email 18332763730@163.com + * + * last edit lishouyu 2017/08/21 + * email 18332763730@163.com + * + */ +public class MD5Util { + /** + * 对字节流进行单向MD5加密 + * @param bytes 字节数组 + * @return String类型返回值 + */ + private static String MD5EncodeUtf8(byte[] bytes) { + //用于加密的字符 + char md5String[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'A', 'B', 'C', 'D', 'E', 'F'}; + try { + //信息摘要是安全的单向哈希函数,它接受任意大小的数据,并输出固定长度的哈希值 + MessageDigest messageDigest = MessageDigest.getInstance("MD5"); + //MessageDigest 对象通过使用update方法处理数据,使用指定的byte数组更新摘要 + messageDigest.update(bytes); + //摘要更新之后。通过调用digest()计算哈希值 + byte[] digest = messageDigest.digest(); + // 把密文转换成十六进制的字符串形式 + int j = digest.length; + char str[] = new char[j * 2]; + int k = 0; + for (byte byte0 : digest) { // i = 0 + str[k++] = md5String[byte0 >>> 4 & 0xf]; // 5 + str[k++] = md5String[byte0 & 0xf]; // F + } + return new String(str); + } catch (Exception e) { + //发生异常的时候返回为空 + return null; + } + } + /** + * 对字符串进行Md5加密 + * @param string 传入的字符串参数 + * @return String型返回结果 + */ + public static String MD5EncodeStrUtf8(String string){ + byte[] bytes = new byte[0]; + try { + bytes = string.getBytes("utf8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return MD5EncodeUtf8(bytes); + } +} diff --git a/common/src/main/resources/generatorConfig.xml b/common/src/main/resources/generatorConfig.xml index 1af5863..18c8370 100644 --- a/common/src/main/resources/generatorConfig.xml +++ b/common/src/main/resources/generatorConfig.xml @@ -17,6 +17,8 @@ + + diff --git a/common/src/test/java/com/micro/fast/common/util/MD5UtilTest.java b/common/src/test/java/com/micro/fast/common/util/MD5UtilTest.java new file mode 100644 index 0000000..b366dc6 --- /dev/null +++ b/common/src/test/java/com/micro/fast/common/util/MD5UtilTest.java @@ -0,0 +1,14 @@ +package com.micro.fast.common.util; + +import org.junit.Assert; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class MD5UtilTest { + @Test + public void MD5EncodeStrUtf8() throws Exception { + MD5Util.MD5EncodeStrUtf8("李守余"); + Assert.assertEquals("7F8D114165AB73DBDAFF9EF4A85A5E0A",MD5Util.MD5EncodeStrUtf8("李守余")); + } +} \ No newline at end of file