|
@@ -0,0 +1,179 @@
|
|
|
+package com.qunzhixinxi.hnqz.admin.util;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+
|
|
|
+import java.io.File;
|
|
|
+import java.io.FileInputStream;
|
|
|
+import java.io.IOException;
|
|
|
+import java.math.BigInteger;
|
|
|
+import java.nio.MappedByteBuffer;
|
|
|
+import java.nio.channels.FileChannel;
|
|
|
+import java.security.MessageDigest;
|
|
|
+import java.security.NoSuchAlgorithmException;
|
|
|
+import java.util.Collections;
|
|
|
+import java.util.Comparator;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+@Slf4j
|
|
|
+public class Md5Utils {
|
|
|
+
|
|
|
+ public static String MD5(String s) {
|
|
|
+ try {
|
|
|
+ byte[] btInput = s.getBytes("utf-8");
|
|
|
+ // 获得MD5摘要算法的 MessageDigest 对象
|
|
|
+ MessageDigest mdInst = MessageDigest.getInstance("MD5");
|
|
|
+ // 使用指定的字节更新摘要
|
|
|
+ mdInst.update(btInput);
|
|
|
+ // 获得密文
|
|
|
+ byte[] md = mdInst.digest();
|
|
|
+ // 把密文转换成十六进制的字符串形式
|
|
|
+ return byteArrayToHex(md);
|
|
|
+ } catch (Exception e) {
|
|
|
+ //e.printStackTrace();
|
|
|
+ log.error("秘闻转换异常",e);
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String getMd5ByFileProperty(String fileProperty) {
|
|
|
+ try {
|
|
|
+ // 拿到一个MD5转换器(如果想要SHA1参数换成”SHA1”)
|
|
|
+ MessageDigest messageDigest = MessageDigest.getInstance("MD5");
|
|
|
+ // 输入的字符串转换成字节数组
|
|
|
+ byte[] inputByteArray = fileProperty.getBytes();
|
|
|
+ // inputByteArray是输入字符串转换得到的字节数组
|
|
|
+ messageDigest.update(inputByteArray);
|
|
|
+ // 转换并返回结果,也是字节数组,包含16个元素
|
|
|
+ byte[] resultByteArray = messageDigest.digest();
|
|
|
+ // 字符数组转换成字符串返回
|
|
|
+ return byteArrayToHex(resultByteArray);
|
|
|
+ } catch (NoSuchAlgorithmException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String byteArrayToHex(byte[] byteArray) {
|
|
|
+ // 首先初始化一个字符数组,用来存放每个16进制字符
|
|
|
+ char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
|
|
+ 'A', 'B', 'C', 'D', 'E', 'F' };
|
|
|
+ // new一个字符数组,这个就是用来组成结果字符串的(解释一下:一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方))
|
|
|
+ char[] resultCharArray = new char[byteArray.length * 2];
|
|
|
+ // 遍历字节数组,通过位运算(位运算效率高),转换成字符放到字符数组中去
|
|
|
+ int index = 0;
|
|
|
+ for (byte b : byteArray) {
|
|
|
+ resultCharArray[index++] = hexDigits[b >>> 4 & 0xf];
|
|
|
+ resultCharArray[index++] = hexDigits[b & 0xf];
|
|
|
+ }
|
|
|
+ // 字符数组组合成字符串返回
|
|
|
+ return new String(resultCharArray);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String getMd5ByFile(File file) {
|
|
|
+ String value = null;
|
|
|
+ FileInputStream in = null;
|
|
|
+ FileChannel ch = null;
|
|
|
+ try {
|
|
|
+ in = new FileInputStream(file);
|
|
|
+ ch = in.getChannel();
|
|
|
+ MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0, file.length());
|
|
|
+ MessageDigest md5 = MessageDigest.getInstance("MD5");
|
|
|
+ md5.update(byteBuffer);
|
|
|
+ BigInteger bi = new BigInteger(1, md5.digest());
|
|
|
+ value = bi.toString(16);
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } finally {
|
|
|
+ if (null != ch) {
|
|
|
+ try {
|
|
|
+ ch.close();
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (null != in) {
|
|
|
+ try {
|
|
|
+ in.close();
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return value.toUpperCase();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * MD5校验
|
|
|
+ * @param request
|
|
|
+ * @param key
|
|
|
+ * @param strMd5
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static boolean check(List<String> listSort, HashMap<String, String> hm, String key, String strMd5, HashMap<String, String> remove, StringBuffer log) {
|
|
|
+ String str = "";
|
|
|
+ for (String mkey : listSort) {
|
|
|
+ if(null != remove.get(mkey) && !"".equals(remove.get(mkey))) continue;
|
|
|
+ if (null == hm.get(mkey)) continue;
|
|
|
+ str+=hm.get(mkey);
|
|
|
+ }
|
|
|
+ str+=key;
|
|
|
+ String tempMd5 = MD5(str);
|
|
|
+
|
|
|
+ if (tempMd5.equals(strMd5.toUpperCase())) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ log.append("MD5(").append(str).append(") = ").append(tempMd5.toLowerCase()).append("\r\n");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String getSign(List<String> listSort, HashMap<String, String> hm, String key) {
|
|
|
+ Collections.sort(listSort, new Comparator<String>() {
|
|
|
+ public int compare(String arg0, String arg1) {
|
|
|
+ return arg0.compareTo(arg1);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ String str = "";
|
|
|
+ for (String mkey : listSort) {
|
|
|
+ if (null == hm.get(mkey)) continue;
|
|
|
+ str+=hm.get(mkey);
|
|
|
+ }
|
|
|
+ str+=key;
|
|
|
+ String tempMd5 = MD5(str);
|
|
|
+
|
|
|
+ return tempMd5;
|
|
|
+ }
|
|
|
+ private static String byteArrayToHexString(byte b[]) {
|
|
|
+ StringBuffer resultSb = new StringBuffer();
|
|
|
+ for (int i = 0; i < b.length; i++)
|
|
|
+ resultSb.append(byteToHexString(b[i]));
|
|
|
+
|
|
|
+ return resultSb.toString();
|
|
|
+ }
|
|
|
+
|
|
|
+ private static String byteToHexString(byte b) {
|
|
|
+ int n = b;
|
|
|
+ if (n < 0)
|
|
|
+ n += 256;
|
|
|
+ int d1 = n / 16;
|
|
|
+ int d2 = n % 16;
|
|
|
+ return hexDigits[d1] + hexDigits[d2];
|
|
|
+ }
|
|
|
+ public static String MD5Encode(String origin, String charsetname) {
|
|
|
+ String resultString = null;
|
|
|
+ try {
|
|
|
+ resultString = new String(origin);
|
|
|
+ MessageDigest md = MessageDigest.getInstance("MD5");
|
|
|
+ if (charsetname == null || "".equals(charsetname))
|
|
|
+ resultString = byteArrayToHexString(md.digest(resultString
|
|
|
+ .getBytes()));
|
|
|
+ else
|
|
|
+ resultString = byteArrayToHexString(md.digest(resultString
|
|
|
+ .getBytes(charsetname)));
|
|
|
+ } catch (Exception exception) {
|
|
|
+ }
|
|
|
+ return resultString;
|
|
|
+ }
|
|
|
+ private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5",
|
|
|
+ "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
|
|
|
+}
|