package com.xx.xxxxx.common.util;
import lombok.extern.slf4j.Slf4j;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
@Slf4j
public class Md5SignUtil {
private final static String secret = "xxxxxxxxxx";
public static String convertMD5(String inStr){
char[] a = inStr.toCharArray();
for (int i = 0; i < a.length; i++){
a[i] = (char) (a[i] ^ 't');
}
String s = new String(a);
return s;
}
public static void main(String[] args) {
Map<String, Object> map = new HashMap<>();
map.put("userName", "老王");
map.put("timestamp", System.currentTimeMillis());
System.out.println(createSign(map));
}
public static String createSign(Map<String, Object> map) {
String secretKEY = MD5Util.md5(secret);
Set<String> keySet = sortByValue(map.keySet(), true);
map(keySet,map);
StringBuffer signStr = new StringBuffer();
signStr.append(secretKEY);
for (String str : keySet) {
signStr.append(str);
if (map.get(str) != null) {
signStr.append(map.get(str));
}
}
String encode = Base64Utils.base64Encoder(String.valueOf(signStr));
String sign = MD5Util.md5(encode + secretKEY);
return sign;
}
public static void map(Set<String> keySet,Map<String, Object> map){
Map<String, Object> m = new HashMap<>();
for (String key : keySet) {
m.put(key,map.get(key));
}
log.info("###keySet= {}", m);
}
public static Set<String> sortByValue(Set<String> set, final Boolean flag) {
List<String> setList = new ArrayList<String>(set);
Collections.sort(setList, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if (flag) {
return o1.toString().compareTo(o2.toString());
} else {
return o2.toString().compareTo(o1.toString());
}
}
});
set = new LinkedHashSet<String>(setList);
return set;
}
}
final class MD5Util {
public static void main(String[] args) {
long t1 = System.currentTimeMillis();
String md5 = md5("20");
System.out.println(md5);
long t2 = System.currentTimeMillis();
System.out.println(t2 - t1);
}
protected final static Logger LOG = Logger.getLogger(MD5Util.class.getSimpleName());
private static char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e',
'f' };
private static Charset UTF8 = Charset.forName("UTF-8");
private MD5Util() {
throw new RuntimeException("can't init it");
}
public static String md5(String from) {
byte fromByte[] = null;
MessageDigest md = null;
try {
md = MessageDigest.getInstance("MD5");
fromByte = from.getBytes(UTF8);
} catch (Throwable e) {
LOG.log(Level.SEVERE, "error while md5 for:" + from, e);
throw new RuntimeException("error while md5 for:" + from, e);
}
byte bs[] = md.digest(fromByte);
char str[] = new char[16 * 2];
int k = 0;
for (int i = 0; i < 16; i++) {
byte byte0 = bs[i];
str[k++] = hexDigits[byte0 >>> 4 & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}
return new String(str);
}
}
class Base64Utils {
public static String base64Encoder(String key) {
Base64.Encoder encoder = Base64.getEncoder();
String s = encoder.encodeToString(key.getBytes());
System.out.println("加密:"+s);
return s;
}
public static String base64Decoder(String encode) {
Base64.Decoder decoder = Base64.getDecoder();
String s = new String(decoder.decode(encode));
System.out.println("解密"+ s);
return s;
}
}